OSDN Git Service

[Refactor] #37353 暗黒領域処理を cmd-spell.c から realm-death.c/h へ分離。
[hengbandforosx/hengbandosx.git] / src / cmd-spell.c
1 /*!\r
2     @file cmd-spell.c\r
3     @brief 魔法のインターフェイスと発動 / Purpose: Do everything for each spell\r
4     @date 2013/12/31\r
5     @author\r
6     2013 Deskull rearranged comment for Doxygen.\r
7  */\r
8 \r
9 #include "angband.h"\r
10 #include "selfinfo.h"\r
11 #include "cmd-quaff.h"\r
12 #include "spells-summon.h"\r
13 #include "realm-arcane.h"\r
14 #include "realm-chaos.h"\r
15 #include "realm-death.h"\r
16 #include "realm-life.h"\r
17 #include "realm-nature.h"\r
18 #include "realm-sorcery.h"\r
19 \r
20 /*!\r
21  * @brief\r
22  * 魔法の効果を「キャプション:ダイス+定数値」のフォーマットで出力する / Generate dice info string such as "foo 2d10"\r
23  * @param str キャプション\r
24  * @param dice ダイス数\r
25  * @param sides ダイス目\r
26  * @param base 固定値\r
27  * @return フォーマットに従い整形された文字列\r
28  */\r
29 cptr info_string_dice(cptr str, int dice, int sides, int base)\r
30 {\r
31         /* Fix value */\r
32         if (!dice)\r
33                 return format("%s%d", str, base);\r
34 \r
35         /* Dice only */\r
36         else if (!base)\r
37                 return format("%s%dd%d", str, dice, sides);\r
38 \r
39         /* Dice plus base value */\r
40         else\r
41                 return format("%s%dd%d%+d", str, dice, sides, base);\r
42 }\r
43 \r
44 \r
45 /*!\r
46  * @brief 魔法によるダメージを出力する / Generate damage-dice info string such as "dam 2d10"\r
47  * @param dice ダイス数\r
48  * @param sides ダイス目\r
49  * @param base 固定値\r
50  * @return フォーマットに従い整形された文字列\r
51  */\r
52 cptr info_damage(int dice, int sides, int base)\r
53 {\r
54         return info_string_dice(_("損傷:", "dam "), dice, sides, base);\r
55 }\r
56 \r
57 /*!\r
58  * @brief 魔法の効果時間を出力する / Generate duration info string such as "dur 20+1d20"\r
59  * @param base 固定値\r
60  * @param sides ダイス目\r
61  * @return フォーマットに従い整形された文字列\r
62  */\r
63 cptr info_duration(int base, int sides)\r
64 {\r
65         return format(_("期間:%d+1d%d", "dur %d+1d%d"), base, sides);\r
66 }\r
67 \r
68 /*!\r
69  * @brief 魔法の効果範囲を出力する / Generate range info string such as "range 5"\r
70  * @param range 効果範囲\r
71  * @return フォーマットに従い整形された文字列\r
72  */\r
73 cptr info_range(POSITION range)\r
74 {\r
75         return format(_("範囲:%d", "range %d"), range);\r
76 }\r
77 \r
78 /*!\r
79  * @brief 魔法による回復量を出力する / Generate heal info string such as "heal 2d8"\r
80  * @param dice ダイス数\r
81  * @param sides ダイス目\r
82  * @param base 固定値\r
83  * @return フォーマットに従い整形された文字列\r
84  */\r
85 cptr info_heal(int dice, int sides, int base)\r
86 {\r
87         return info_string_dice(_("回復:", "heal "), dice, sides, base);\r
88 }\r
89 \r
90 /*!\r
91  * @brief 魔法効果発動までの遅延ターンを出力する / Generate delay info string such as "delay 15+1d15"\r
92  * @param base 固定値\r
93  * @param sides ダイス目\r
94  * @return フォーマットに従い整形された文字列\r
95  */\r
96 cptr info_delay(int base, int sides)\r
97 {\r
98         return format(_("遅延:%d+1d%d", "delay %d+1d%d"), base, sides);\r
99 }\r
100 \r
101 \r
102 /*!\r
103  * @brief 魔法によるダメージを出力する(固定値&複数回処理) / Generate multiple-damage info string such as "dam 25 each"\r
104  * @param dam 固定値\r
105  * @return フォーマットに従い整形された文字列\r
106  */\r
107 cptr info_multi_damage(HIT_POINT dam)\r
108 {\r
109         return format(_("損傷:各%d", "dam %d each"), dam);\r
110 }\r
111 \r
112 \r
113 /*!\r
114  * @brief 魔法によるダメージを出力する(ダイスのみ&複数回処理) / Generate multiple-damage-dice info string such as "dam 5d2 each"\r
115  * @param dice ダイス数\r
116  * @param sides ダイス目\r
117  * @return フォーマットに従い整形された文字列\r
118  */\r
119 cptr info_multi_damage_dice(int dice, int sides)\r
120 {\r
121         return format(_("損傷:各%dd%d", "dam %dd%d each"), dice, sides);\r
122 }\r
123 \r
124 /*!\r
125  * @brief 魔法による一般的な効力値を出力する(固定値) / Generate power info string such as "power 100"\r
126  * @param power 固定値\r
127  * @return フォーマットに従い整形された文字列\r
128  */\r
129 cptr info_power(int power)\r
130 {\r
131         return format(_("効力:%d", "power %d"), power);\r
132 }\r
133 \r
134 \r
135 /*!\r
136  * @brief 魔法による一般的な効力値を出力する(ダイス値) / Generate power info string such as "power 100"\r
137  * @param dice ダイス数\r
138  * @param sides ダイス目\r
139  * @return フォーマットに従い整形された文字列\r
140  */\r
141 /*\r
142  * Generate power info string such as "power 1d100"\r
143  */\r
144 cptr info_power_dice(int dice, int sides)\r
145 {\r
146         return format(_("効力:%dd%d", "power %dd%d"), dice, sides);\r
147 }\r
148 \r
149 \r
150 /*!\r
151  * @brief 魔法の効果半径を出力する / Generate radius info string such as "rad 100"\r
152  * @param rad 効果半径\r
153  * @return フォーマットに従い整形された文字列\r
154  */\r
155 cptr info_radius(int rad)\r
156 {\r
157         return format(_("半径:%d", "rad %d"), rad);\r
158 }\r
159 \r
160 \r
161 /*!\r
162  * @brief 魔法効果の限界重量を出力する / Generate weight info string such as "max wgt 15"\r
163  * @param weight 最大重量\r
164  * @return フォーマットに従い整形された文字列\r
165  */\r
166 cptr info_weight(int weight)\r
167 {\r
168 #ifdef JP\r
169         return format("最大重量:%d.%dkg", lbtokg1(weight), lbtokg2(weight));\r
170 #else\r
171         return format("max wgt %d", weight/10);\r
172 #endif\r
173 }\r
174 \r
175 \r
176 /*!\r
177  * @brief 歌の開始を処理する / Start singing if the player is a Bard \r
178  * @param spell 領域魔法としてのID\r
179  * @param song 魔法効果のID\r
180  * @return なし\r
181  */\r
182 static void start_singing(SPELL_IDX spell, MAGIC_NUM1 song)\r
183 {\r
184         /* Remember the song index */\r
185         SINGING_SONG_EFFECT(p_ptr) = (MAGIC_NUM1)song;\r
186 \r
187         /* Remember the index of the spell which activated the song */\r
188         SINGING_SONG_ID(p_ptr) = (MAGIC_NUM2)spell;\r
189 \r
190 \r
191         /* Now the player is singing */\r
192         set_action(ACTION_SING);\r
193 \r
194 \r
195         /* Recalculate bonuses */\r
196         p_ptr->update |= (PU_BONUS);\r
197 \r
198         /* Redraw status bar */\r
199         p_ptr->redraw |= (PR_STATUS);\r
200 }\r
201 \r
202 /*!\r
203  * @brief 歌の停止を処理する / Stop singing if the player is a Bard \r
204  * @return なし\r
205  */\r
206 void stop_singing(void)\r
207 {\r
208         if (p_ptr->pclass != CLASS_BARD) return;\r
209 \r
210         /* Are there interupted song? */\r
211         if (INTERUPTING_SONG_EFFECT(p_ptr))\r
212         {\r
213                 /* Forget interupted song */\r
214                 INTERUPTING_SONG_EFFECT(p_ptr) = MUSIC_NONE;\r
215                 return;\r
216         }\r
217 \r
218         /* The player is singing? */\r
219         if (!SINGING_SONG_EFFECT(p_ptr)) return;\r
220 \r
221         /* Hack -- if called from set_action(), avoid recursive loop */\r
222         if (p_ptr->action == ACTION_SING) set_action(ACTION_NONE);\r
223 \r
224         /* Message text of each song or etc. */\r
225         do_spell(REALM_MUSIC, SINGING_SONG_ID(p_ptr), SPELL_STOP);\r
226 \r
227         SINGING_SONG_EFFECT(p_ptr) = MUSIC_NONE;\r
228         SINGING_SONG_ID(p_ptr) = 0;\r
229 \r
230         /* Recalculate bonuses */\r
231         p_ptr->update |= (PU_BONUS);\r
232 \r
233         /* Redraw status bar */\r
234         p_ptr->redraw |= (PR_STATUS);\r
235 }\r
236 \r
237 \r
238 \r
239 \r
240 /*!\r
241  * @brief トランプ領域魔法の各処理を行う\r
242  * @param spell 魔法ID\r
243  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)\r
244  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。\r
245  */\r
246 static cptr do_trump_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
247 {\r
248         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
249         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
250         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
251         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
252         bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;\r
253         static const char s_random[] = _("ランダム", "random");\r
254 \r
255         int dir;\r
256         int plev = p_ptr->lev;\r
257 \r
258         switch (spell)\r
259         {\r
260         case 0:\r
261                 if (name) return _("ショート・テレポート", "Phase Door");\r
262                 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");\r
263     \r
264                 {\r
265                         POSITION range = 10;\r
266 \r
267                         if (info) return info_range(range);\r
268 \r
269                         if (cast)\r
270                         {\r
271                                 teleport_player(range, 0L);\r
272                         }\r
273                 }\r
274                 break;\r
275 \r
276         case 1:\r
277                 if (name) return _("蜘蛛のカード", "Trump Spiders");\r
278                 if (desc) return _("蜘蛛を召喚する。", "Summons spiders.");\r
279     \r
280                 {\r
281                         if (cast || fail)\r
282                         {\r
283                                 msg_print(_("あなたは蜘蛛のカードに集中する...", "You concentrate on the trump of an spider..."));\r
284                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_SPIDER, PM_ALLOW_GROUP))\r
285                                 {\r
286                                         if (fail)\r
287                                         {\r
288                                                 msg_print(_("召喚された蜘蛛は怒っている!", "The summoned spiders get angry!"));\r
289                                         }\r
290                                 }\r
291                         }\r
292                 }\r
293                 break;\r
294 \r
295         case 2:\r
296                 if (name) return _("シャッフル", "Shuffle");\r
297                 if (desc) return _("カードの占いをする。", "Causes random effects.");\r
298     \r
299                 {\r
300                         if (info) return s_random;\r
301 \r
302                         if (cast)\r
303                         {\r
304                                 cast_shuffle();\r
305                         }\r
306                 }\r
307                 break;\r
308 \r
309         case 3:\r
310                 if (name) return _("フロア・リセット", "Reset Recall");\r
311                 if (desc) return _("最深階を変更する。", "Resets the 'deepest' level for recall spell.");\r
312     \r
313                 {\r
314                         if (cast)\r
315                         {\r
316                                 if (!reset_recall()) return NULL;\r
317                         }\r
318                 }\r
319                 break;\r
320 \r
321         case 4:\r
322                 if (name) return _("テレポート", "Teleport");\r
323                 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");\r
324     \r
325                 {\r
326                         POSITION range = plev * 4;\r
327 \r
328                         if (info) return info_range(range);\r
329 \r
330                         if (cast)\r
331                         {\r
332                                 teleport_player(range, 0L);\r
333                         }\r
334                 }\r
335                 break;\r
336 \r
337         case 5:\r
338                 if (name) return _("感知のカード", "Trump Spying");\r
339                 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");\r
340     \r
341                 {\r
342                         int base = 25;\r
343                         int sides = 30;\r
344 \r
345                         if (info) return info_duration(base, sides);\r
346 \r
347                         if (cast)\r
348                         {\r
349                                 set_tim_esp(randint1(sides) + base, FALSE);\r
350                         }\r
351                 }\r
352                 break;\r
353 \r
354         case 6:\r
355                 if (name) return _("テレポート・モンスター", "Teleport Away");\r
356                 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");\r
357     \r
358                 {\r
359                         int power = plev;\r
360 \r
361                         if (info) return info_power(power);\r
362 \r
363                         if (cast)\r
364                         {\r
365                                 if (!get_aim_dir(&dir)) return NULL;\r
366 \r
367                                 fire_beam(GF_AWAY_ALL, dir, power);\r
368                         }\r
369                 }\r
370                 break;\r
371 \r
372         case 7:\r
373                 if (name) return _("動物のカード", "Trump Animals");\r
374                 if (desc) return _("1体の動物を召喚する。", "Summons an animal.");\r
375     \r
376                 {\r
377                         if (cast || fail)\r
378                         {\r
379                                 int type = (!fail ? SUMMON_ANIMAL_RANGER : SUMMON_ANIMAL);\r
380                                 msg_print(_("あなたは動物のカードに集中する...", "You concentrate on the trump of an animal..."));\r
381                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, type, 0L))\r
382                                 {\r
383                                         if (fail)\r
384                                         {\r
385                                                 msg_print(_("召喚された動物は怒っている!", "The summoned animal gets angry!"));\r
386                                         }\r
387                                 }\r
388                         }\r
389                 }\r
390                 break;\r
391 \r
392         case 8:\r
393                 if (name) return _("移動のカード", "Trump Reach");\r
394                 if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");\r
395     \r
396                 {\r
397                         int weight = plev * 15;\r
398 \r
399                         if (info) return info_weight(weight);\r
400 \r
401                         if (cast)\r
402                         {\r
403                                 if (!get_aim_dir(&dir)) return NULL;\r
404 \r
405                                 fetch(dir, weight, FALSE);\r
406                         }\r
407                 }\r
408                 break;\r
409 \r
410         case 9:\r
411                 if (name) return _("カミカゼのカード", "Trump Kamikaze");\r
412                 if (desc) return _("複数の爆発するモンスターを召喚する。", "Summons monsters which explode by itself.");\r
413     \r
414                 {\r
415                         if (cast || fail)\r
416                         {\r
417                                 int x, y;\r
418                                 int type;\r
419 \r
420                                 if (cast)\r
421                                 {\r
422                                         if (!target_set(TARGET_KILL)) return NULL;\r
423                                         x = target_col;\r
424                                         y = target_row;\r
425                                 }\r
426                                 else\r
427                                 {\r
428                                         /* Summons near player when failed */\r
429                                         x = p_ptr->x;\r
430                                         y = p_ptr->y;\r
431                                 }\r
432 \r
433                                 if (p_ptr->pclass == CLASS_BEASTMASTER)\r
434                                         type = SUMMON_KAMIKAZE_LIVING;\r
435                                 else\r
436                                         type = SUMMON_KAMIKAZE;\r
437 \r
438                                 msg_print(_("あなたはカミカゼのカードに集中する...", "You concentrate on several trumps at once..."));\r
439                                 if (trump_summoning(2 + randint0(plev / 7), !fail, y, x, 0, type, 0L))\r
440                                 {\r
441                                         if (fail)\r
442                                         {\r
443                                                 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));\r
444                                         }\r
445                                 }\r
446                         }\r
447                 }\r
448                 break;\r
449 \r
450         case 10:\r
451                 if (name) return _("幻霊召喚", "Phantasmal Servant");\r
452                 if (desc) return _("1体の幽霊を召喚する。", "Summons a ghost.");\r
453     \r
454                 {\r
455                         /* Phantasmal Servant is not summoned as enemy when failed */\r
456                         if (cast)\r
457                         {\r
458                                 int summon_lev = plev * 2 / 3 + randint1(plev / 2);\r
459 \r
460                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, (summon_lev * 3 / 2), SUMMON_PHANTOM, 0L))\r
461                                 {\r
462                                         msg_print(_("御用でございますか、御主人様?", "'Your wish, master?'"));\r
463                                 }\r
464                         }\r
465                 }\r
466                 break;\r
467 \r
468         case 11:\r
469                 if (name) return _("スピード・モンスター", "Haste Monster");\r
470                 if (desc) return _("モンスター1体を加速させる。", "Hastes a monster.");\r
471     \r
472                 {\r
473                         if (cast)\r
474                         {\r
475                                 bool result;\r
476 \r
477                                 /* Temporary enable target_pet option */\r
478                                 bool old_target_pet = target_pet;\r
479                                 target_pet = TRUE;\r
480 \r
481                                 result = get_aim_dir(&dir);\r
482 \r
483                                 /* Restore target_pet option */\r
484                                 target_pet = old_target_pet;\r
485 \r
486                                 if (!result) return NULL;\r
487 \r
488                                 speed_monster(dir, plev);\r
489                         }\r
490                 }\r
491                 break;\r
492 \r
493         case 12:\r
494                 if (name) return _("テレポート・レベル", "Teleport Level");\r
495                 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");\r
496     \r
497                 {\r
498                         if (cast)\r
499                         {\r
500                                 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;\r
501                                 teleport_level(0);\r
502                         }\r
503                 }\r
504                 break;\r
505 \r
506         case 13:\r
507                 if (name) return _("次元の扉", "Dimension Door");\r
508                 if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleport to given location.");\r
509     \r
510                 {\r
511                         POSITION range = plev / 2 + 10;\r
512 \r
513                         if (info) return info_range(range);\r
514 \r
515                         if (cast)\r
516                         {\r
517                                 msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));\r
518                                 if (!dimension_door()) return NULL;\r
519                         }\r
520                 }\r
521                 break;\r
522 \r
523         case 14:\r
524                 if (name) return _("帰還の呪文", "Word of Recall");\r
525                 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",\r
526                         "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");\r
527     \r
528                 {\r
529                         int base = 15;\r
530                         int sides = 20;\r
531 \r
532                         if (info) return info_delay(base, sides);\r
533 \r
534                         if (cast)\r
535                         {\r
536                                 if (!word_of_recall()) return NULL;\r
537                         }\r
538                 }\r
539                 break;\r
540 \r
541         case 15:\r
542                 if (name) return _("怪物追放", "Banish");\r
543                 if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");\r
544     \r
545                 {\r
546                         int power = plev * 4;\r
547 \r
548                         if (info) return info_power(power);\r
549 \r
550                         if (cast)\r
551                         {\r
552                                 banish_monsters(power);\r
553                         }\r
554                 }\r
555                 break;\r
556 \r
557         case 16:\r
558                 if (name) return _("位置交換のカード", "Swap Position");\r
559                 if (desc) return _("1体のモンスターと位置を交換する。", "Swap positions of you and a monster.");\r
560     \r
561                 {\r
562                         if (cast)\r
563                         {\r
564                                 bool result;\r
565 \r
566                                 /* HACK -- No range limit */\r
567                                 project_length = -1;\r
568 \r
569                                 result = get_aim_dir(&dir);\r
570 \r
571                                 /* Restore range to default */\r
572                                 project_length = 0;\r
573 \r
574                                 if (!result) return NULL;\r
575 \r
576                                 teleport_swap(dir);\r
577                         }\r
578                 }\r
579                 break;\r
580 \r
581         case 17:\r
582                 if (name) return _("アンデッドのカード", "Trump Undead");\r
583                 if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");\r
584     \r
585                 {\r
586                         if (cast || fail)\r
587                         {\r
588                                 msg_print(_("あなたはアンデッドのカードに集中する...", "You concentrate on the trump of an undead creature..."));\r
589                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_UNDEAD, 0L))\r
590                                 {\r
591                                         if (fail)\r
592                                         {\r
593                                                 msg_print(_("召喚されたアンデッドは怒っている!", "The summoned undead creature gets angry!"));\r
594                                         }\r
595                                 }\r
596                         }\r
597                 }\r
598                 break;\r
599 \r
600         case 18:\r
601                 if (name) return _("爬虫類のカード", "Trump Reptiles");\r
602                 if (desc) return _("1体のヒドラを召喚する。", "Summons a hydra.");\r
603     \r
604                 {\r
605                         if (cast || fail)\r
606                         {\r
607                                 msg_print(_("あなたは爬虫類のカードに集中する...", "You concentrate on the trump of a reptile..."));\r
608                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HYDRA, 0L))\r
609                                 {\r
610                                         if (fail)\r
611                                         {\r
612                                                 msg_print(_("召喚された爬虫類は怒っている!", "The summoned reptile gets angry!"));\r
613                                         }\r
614                                 }\r
615                         }\r
616                 }\r
617                 break;\r
618 \r
619         case 19:\r
620                 if (name) return _("モンスターのカード", "Trump Monsters");\r
621                 if (desc) return _("複数のモンスターを召喚する。", "Summons some monsters.");\r
622     \r
623                 {\r
624                         if (cast || fail)\r
625                         {\r
626                                 int type;\r
627                                 msg_print(_("あなたはモンスターのカードに集中する...", "You concentrate on several trumps at once..."));\r
628                                 if (p_ptr->pclass == CLASS_BEASTMASTER)\r
629                                         type = SUMMON_LIVING;\r
630                                 else\r
631                                         type = 0;\r
632 \r
633                                 if (trump_summoning((1 + (plev - 15)/ 10), !fail, p_ptr->y, p_ptr->x, 0, type, 0L))\r
634                                 {\r
635                                         if (fail)\r
636                                         {\r
637                                                 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));\r
638                                         }\r
639                                 }\r
640 \r
641                         }\r
642                 }\r
643                 break;\r
644 \r
645         case 20:\r
646                 if (name) return _("ハウンドのカード", "Trump Hounds");\r
647                 if (desc) return _("1グループのハウンドを召喚する。", "Summons a group of hounds.");\r
648     \r
649                 {\r
650                         if (cast || fail)\r
651                         {\r
652                                 msg_print(_("あなたはハウンドのカードに集中する...", "You concentrate on the trump of a hound..."));\r
653                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HOUND, PM_ALLOW_GROUP))\r
654                                 {\r
655                                         if (fail)\r
656                                         {\r
657                                                 msg_print(_("召喚されたハウンドは怒っている!", "The summoned hounds get angry!"));\r
658                                         }\r
659                                 }\r
660                         }\r
661                 }\r
662                 break;\r
663 \r
664         case 21:\r
665                 if (name) return _("トランプの刃", "Trump Branding");\r
666                 if (desc) return _("武器にトランプの属性をつける。", "Makes current weapon a Trump weapon.");\r
667     \r
668                 {\r
669                         if (cast)\r
670                         {\r
671                                 brand_weapon(5);\r
672                         }\r
673                 }\r
674                 break;\r
675 \r
676         case 22:\r
677                 if (name) return _("人間トランプ", "Living Trump");\r
678                 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。", \r
679                         "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");\r
680     \r
681                 {\r
682                         if (cast)\r
683                         {\r
684                                 int mutation;\r
685 \r
686                                 if (one_in_(7))\r
687                                         /* Teleport control */\r
688                                         mutation = 12;\r
689                                 else\r
690                                         /* Random teleportation (uncontrolled) */\r
691                                         mutation = 77;\r
692 \r
693                                 /* Gain the mutation */\r
694                                 if (gain_random_mutation(mutation))\r
695                                 {\r
696                                         msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));\r
697                                 }\r
698                         }\r
699                 }\r
700                 break;\r
701 \r
702         case 23:\r
703                 if (name) return _("サイバーデーモンのカード", "Trump Cyberdemon");\r
704                 if (desc) return _("1体のサイバーデーモンを召喚する。", "Summons a cyber demon.");\r
705     \r
706                 {\r
707                         if (cast || fail)\r
708                         {\r
709                                 msg_print(_("あなたはサイバーデーモンのカードに集中する...", "You concentrate on the trump of a Cyberdemon..."));\r
710                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_CYBER, 0L))\r
711                                 {\r
712                                         if (fail)\r
713                                         {\r
714                                                 msg_print(_("召喚されたサイバーデーモンは怒っている!", "The summoned Cyberdemon gets angry!"));\r
715                                         }\r
716                                 }\r
717                         }\r
718                 }\r
719                 break;\r
720 \r
721         case 24:\r
722                 if (name) return _("予見のカード", "Trump Divination");\r
723                 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",\r
724                         "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");\r
725     \r
726                 {\r
727                         int rad = DETECT_RAD_DEFAULT;\r
728 \r
729                         if (info) return info_radius(rad);\r
730 \r
731                         if (cast)\r
732                         {\r
733                                 detect_all(rad);\r
734                         }\r
735                 }\r
736                 break;\r
737 \r
738         case 25:\r
739                 if (name) return _("知識のカード", "Trump Lore");\r
740                 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");\r
741     \r
742                 {\r
743                         if (cast)\r
744                         {\r
745                                 if (!identify_fully(FALSE)) return NULL;\r
746                         }\r
747                 }\r
748                 break;\r
749 \r
750         case 26:\r
751                 if (name) return _("回復モンスター", "Heal Monster");\r
752                 if (desc) return _("モンスター1体の体力を回復させる。", "Heal a monster.");\r
753     \r
754                 {\r
755                         int heal = plev * 10 + 200;\r
756 \r
757                         if (info) return info_heal(0, 0, heal);\r
758 \r
759                         if (cast)\r
760                         {\r
761                                 bool result;\r
762 \r
763                                 /* Temporary enable target_pet option */\r
764                                 bool old_target_pet = target_pet;\r
765                                 target_pet = TRUE;\r
766 \r
767                                 result = get_aim_dir(&dir);\r
768 \r
769                                 /* Restore target_pet option */\r
770                                 target_pet = old_target_pet;\r
771 \r
772                                 if (!result) return NULL;\r
773 \r
774                                 heal_monster(dir, heal);\r
775                         }\r
776                 }\r
777                 break;\r
778 \r
779         case 27:\r
780                 if (name) return _("ドラゴンのカード", "Trump Dragon");\r
781                 if (desc) return _("1体のドラゴンを召喚する。", "Summons a dragon.");\r
782     \r
783                 {\r
784                         if (cast || fail)\r
785                         {\r
786                                 msg_print(_("あなたはドラゴンのカードに集中する...", "You concentrate on the trump of a dragon..."));\r
787                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_DRAGON, 0L))\r
788                                 {\r
789                                         if (fail)\r
790                                         {\r
791                                                 msg_print(_("召喚されたドラゴンは怒っている!", "The summoned dragon gets angry!"));\r
792                                         }\r
793                                 }\r
794                         }\r
795                 }\r
796                 break;\r
797 \r
798         case 28:\r
799                 if (name) return _("隕石のカード", "Trump Meteor");\r
800                 if (desc) return _("自分の周辺に隕石を落とす。", "Makes meteor balls fall down to nearby random locations.");\r
801     \r
802                 {\r
803                         HIT_POINT dam = plev * 2;\r
804                         int rad = 2;\r
805 \r
806                         if (info) return info_multi_damage(dam);\r
807 \r
808                         if (cast)\r
809                         {\r
810                                 cast_meteor(dam, rad);\r
811                         }\r
812                 }\r
813                 break;\r
814 \r
815         case 29:\r
816                 if (name) return _("デーモンのカード", "Trump Demon");\r
817                 if (desc) return _("1体の悪魔を召喚する。", "Summons a demon.");\r
818     \r
819                 {\r
820                         if (cast || fail)\r
821                         {\r
822                                 msg_print(_("あなたはデーモンのカードに集中する...", "You concentrate on the trump of a demon..."));\r
823                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_DEMON, 0L))\r
824                                 {\r
825                                         if (fail)\r
826                                         {\r
827                                                 msg_print(_("召喚されたデーモンは怒っている!", "The summoned demon gets angry!"));\r
828                                         }\r
829                                 }\r
830                         }\r
831                 }\r
832                 break;\r
833 \r
834         case 30:\r
835                 if (name) return _("地獄のカード", "Trump Greater Undead");\r
836                 if (desc) return _("1体の上級アンデッドを召喚する。", "Summons a greater undead.");\r
837     \r
838                 {\r
839                         if (cast || fail)\r
840                         {\r
841                                 msg_print(_("あなたは強力なアンデッドのカードに集中する...", "You concentrate on the trump of a greater undead being..."));\r
842                                 /* May allow unique depend on level and dice roll */\r
843                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HI_UNDEAD, PM_ALLOW_UNIQUE))\r
844                                 {\r
845                                         if (fail)\r
846                                         {\r
847                                                 msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead creature gets angry!"));\r
848                                         }\r
849                                 }\r
850                         }\r
851                 }\r
852                 break;\r
853 \r
854         case 31:\r
855                 if (name) return _("古代ドラゴンのカード", "Trump Ancient Dragon");\r
856                 if (desc) return _("1体の古代ドラゴンを召喚する。", "Summons an ancient dragon.");\r
857     \r
858                 {\r
859                         if (cast)\r
860                         {\r
861                                 int type;\r
862 \r
863                                 if (p_ptr->pclass == CLASS_BEASTMASTER)\r
864                                         type = SUMMON_HI_DRAGON_LIVING;\r
865                                 else\r
866                                         type = SUMMON_HI_DRAGON;\r
867 \r
868                                 msg_print(_("あなたは古代ドラゴンのカードに集中する...", "You concentrate on the trump of an ancient dragon..."));\r
869                                 /* May allow unique depend on level and dice roll */\r
870                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, type, PM_ALLOW_UNIQUE))\r
871                                 {\r
872                                         if (fail)\r
873                                         {\r
874                                                 msg_print(_("召喚された古代ドラゴンは怒っている!", "The summoned ancient dragon gets angry!"));\r
875                                         }\r
876                                 }\r
877                         }\r
878                 }\r
879                 break;\r
880         }\r
881 \r
882         return "";\r
883 }\r
884 \r
885 \r
886 /*!\r
887  * @brief 匠領域魔法の各処理を行う\r
888  * @param spell 魔法ID\r
889  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)\r
890  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。\r
891  */\r
892 static cptr do_craft_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
893 {\r
894         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
895         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
896         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
897         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
898 \r
899         int plev = p_ptr->lev;\r
900 \r
901         switch (spell)\r
902         {\r
903         case 0:\r
904                 if (name) return _("赤外線視力", "Infravision");\r
905                 if (desc) return _("一定時間、赤外線視力が増強される。", "Gives infravision for a while.");\r
906     \r
907                 {\r
908                         int base = 100;\r
909 \r
910                         if (info) return info_duration(base, base);\r
911 \r
912                         if (cast)\r
913                         {\r
914                                 set_tim_infra(base + randint1(base), FALSE);\r
915                         }\r
916                 }\r
917                 break;\r
918 \r
919         case 1:\r
920                 if (name) return _("回復力強化", "Regeneration");\r
921                 if (desc) return _("一定時間、回復力が増強される。", "Gives regeneration ability for a while.");\r
922     \r
923                 {\r
924                         int base = 80;\r
925 \r
926                         if (info) return info_duration(base, base);\r
927 \r
928                         if (cast)\r
929                         {\r
930                                 set_tim_regen(base + randint1(base), FALSE);\r
931                         }\r
932                 }\r
933                 break;\r
934 \r
935         case 2:\r
936                 if (name) return _("空腹充足", "Satisfy Hunger");\r
937                 if (desc) return _("満腹になる。", "Satisfies hunger.");\r
938     \r
939                 {\r
940                         if (cast)\r
941                         {\r
942                                 set_food(PY_FOOD_MAX - 1);\r
943                         }\r
944                 }\r
945                 break;\r
946 \r
947         case 3:\r
948                 if (name) return _("耐冷気", "Resist Cold");\r
949                 if (desc) return _("一定時間、冷気への耐性を得る。装備による耐性に累積する。", \r
950                         "Gives resistance to cold. This resistance can be added to which from equipment for more powerful resistance.");\r
951     \r
952                 {\r
953                         int base = 20;\r
954 \r
955                         if (info) return info_duration(base, base);\r
956 \r
957                         if (cast)\r
958                         {\r
959                                 set_oppose_cold(randint1(base) + base, FALSE);\r
960                         }\r
961                 }\r
962                 break;\r
963 \r
964         case 4:\r
965                 if (name) return _("耐火炎", "Resist Fire");\r
966                 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。", \r
967                         "Gives resistance to fire. This resistance can be added to which from equipment for more powerful resistance.");\r
968     \r
969                 {\r
970                         int base = 20;\r
971 \r
972                         if (info) return info_duration(base, base);\r
973 \r
974                         if (cast)\r
975                         {\r
976                                 set_oppose_fire(randint1(base) + base, FALSE);\r
977                         }\r
978                 }\r
979                 break;\r
980 \r
981         case 5:\r
982                 if (name) return _("士気高揚", "Heroism");\r
983                 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");\r
984     \r
985                 {\r
986                         int base = 25;\r
987 \r
988                         if (info) return info_duration(base, base);\r
989 \r
990                         if (cast)\r
991                         {\r
992                                 set_hero(randint1(base) + base, FALSE);\r
993                                 hp_player(10);\r
994                                 set_afraid(0);\r
995                         }\r
996                 }\r
997                 break;\r
998 \r
999         case 6:\r
1000                 if (name) return _("耐電撃", "Resist Lightning");\r
1001                 if (desc) return _("一定時間、電撃への耐性を得る。装備による耐性に累積する。",\r
1002                         "Gives resistance to electricity. This resistance can be added to which from equipment for more powerful resistance.");\r
1003     \r
1004                 {\r
1005                         int base = 20;\r
1006 \r
1007                         if (info) return info_duration(base, base);\r
1008 \r
1009                         if (cast)\r
1010                         {\r
1011                                 set_oppose_elec(randint1(base) + base, FALSE);\r
1012                         }\r
1013                 }\r
1014                 break;\r
1015 \r
1016         case 7:\r
1017                 if (name) return _("耐酸", "Resist Acid");\r
1018                 if (desc) return _("一定時間、酸への耐性を得る。装備による耐性に累積する。",\r
1019                         "Gives resistance to acid. This resistance can be added to which from equipment for more powerful resistance.");\r
1020     \r
1021                 {\r
1022                         int base = 20;\r
1023 \r
1024                         if (info) return info_duration(base, base);\r
1025 \r
1026                         if (cast)\r
1027                         {\r
1028                                 set_oppose_acid(randint1(base) + base, FALSE);\r
1029                         }\r
1030                 }\r
1031                 break;\r
1032 \r
1033         case 8:\r
1034                 if (name) return _("透明視認", "See Invisibility");\r
1035                 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");\r
1036     \r
1037                 {\r
1038                         int base = 24;\r
1039 \r
1040                         if (info) return info_duration(base, base);\r
1041 \r
1042                         if (cast)\r
1043                         {\r
1044                                 set_tim_invis(randint1(base) + base, FALSE);\r
1045                         }\r
1046                 }\r
1047                 break;\r
1048 \r
1049         case 9:\r
1050                 if (name) return _("解呪", "Remove Curse");\r
1051                 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");\r
1052     \r
1053                 {\r
1054                         if (cast)\r
1055                         {\r
1056                                 if (remove_curse())\r
1057                                 {\r
1058                                         msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));\r
1059                                 }\r
1060                         }\r
1061                 }\r
1062                 break;\r
1063 \r
1064         case 10:\r
1065                 if (name) return _("耐毒", "Resist Poison");\r
1066                 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",\r
1067                         "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");\r
1068     \r
1069                 {\r
1070                         int base = 20;\r
1071 \r
1072                         if (info) return info_duration(base, base);\r
1073 \r
1074                         if (cast)\r
1075                         {\r
1076                                 set_oppose_pois(randint1(base) + base, FALSE);\r
1077                         }\r
1078                 }\r
1079                 break;\r
1080 \r
1081         case 11:\r
1082                 if (name) return _("狂戦士化", "Berserk");\r
1083                 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");\r
1084     \r
1085                 {\r
1086                         int base = 25;\r
1087 \r
1088                         if (info) return info_duration(base, base);\r
1089 \r
1090                         if (cast)\r
1091                         {\r
1092                                 set_shero(randint1(base) + base, FALSE);\r
1093                                 hp_player(30);\r
1094                                 set_afraid(0);\r
1095                         }\r
1096                 }\r
1097                 break;\r
1098 \r
1099         case 12:\r
1100                 if (name) return _("自己分析", "Self Knowledge");\r
1101                 if (desc) return _("現在の自分の状態を完全に知る。",\r
1102                         "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");\r
1103     \r
1104                 {\r
1105                         if (cast)\r
1106                         {\r
1107                                 self_knowledge();\r
1108                         }\r
1109                 }\r
1110                 break;\r
1111 \r
1112         case 13:\r
1113                 if (name) return _("対邪悪結界", "Protection from Evil");\r
1114                 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");\r
1115     \r
1116                 {\r
1117                         int base = 3 * plev;\r
1118                         int sides = 25;\r
1119 \r
1120                         if (info) return info_duration(base, sides);\r
1121 \r
1122                         if (cast)\r
1123                         {\r
1124                                 set_protevil(randint1(sides) + base, FALSE);\r
1125                         }\r
1126                 }\r
1127                 break;\r
1128 \r
1129         case 14:\r
1130                 if (name) return _("癒し", "Cure");\r
1131                 if (desc) return _("毒、朦朧状態、負傷を全快させ、幻覚を直す。", "Heals poison, stun, cut and hallucination completely.");\r
1132     \r
1133                 {\r
1134                         if (cast)\r
1135                         {\r
1136                                 set_poisoned(0);\r
1137                                 set_stun(0);\r
1138                                 set_cut(0);\r
1139                                 set_image(0);\r
1140                         }\r
1141                 }\r
1142                 break;\r
1143 \r
1144         case 15:\r
1145                 if (name) return _("魔法剣", "Mana Branding");\r
1146                 if (desc) return _("一定時間、武器に冷気、炎、電撃、酸、毒のいずれかの属性をつける。武器を持たないと使えない。",\r
1147                         "Makes current weapon some elemental branded. You must wield weapons.");\r
1148     \r
1149                 {\r
1150                         int base = plev / 2;\r
1151 \r
1152                         if (info) return info_duration(base, base);\r
1153 \r
1154                         if (cast)\r
1155                         {\r
1156                                 if (!choose_ele_attack()) return NULL;\r
1157                         }\r
1158                 }\r
1159                 break;\r
1160 \r
1161         case 16:\r
1162                 if (name) return _("テレパシー", "Telepathy");\r
1163                 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");\r
1164     \r
1165                 {\r
1166                         int base = 25;\r
1167                         int sides = 30;\r
1168 \r
1169                         if (info) return info_duration(base, sides);\r
1170 \r
1171                         if (cast)\r
1172                         {\r
1173                                 set_tim_esp(randint1(sides) + base, FALSE);\r
1174                         }\r
1175                 }\r
1176                 break;\r
1177 \r
1178         case 17:\r
1179                 if (name) return _("肌石化", "Stone Skin");\r
1180                 if (desc) return _("一定時間、ACを上昇させる。", "Gives bonus to AC for a while.");\r
1181     \r
1182                 {\r
1183                         int base = 30;\r
1184                         int sides = 20;\r
1185 \r
1186                         if (info) return info_duration(base, sides);\r
1187 \r
1188                         if (cast)\r
1189                         {\r
1190                                 set_shield(randint1(sides) + base, FALSE);\r
1191                         }\r
1192                 }\r
1193                 break;\r
1194 \r
1195         case 18:\r
1196                 if (name) return _("全耐性", "Resistance");\r
1197                 if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。", \r
1198                         "Gives resistance to fire, cold, electricity, acid and poison for a while. These resistances can be added to which from equipment for more powerful resistances.");\r
1199     \r
1200                 {\r
1201                         int base = 20;\r
1202 \r
1203                         if (info) return info_duration(base, base);\r
1204 \r
1205                         if (cast)\r
1206                         {\r
1207                                 set_oppose_acid(randint1(base) + base, FALSE);\r
1208                                 set_oppose_elec(randint1(base) + base, FALSE);\r
1209                                 set_oppose_fire(randint1(base) + base, FALSE);\r
1210                                 set_oppose_cold(randint1(base) + base, FALSE);\r
1211                                 set_oppose_pois(randint1(base) + base, FALSE);\r
1212                         }\r
1213                 }\r
1214                 break;\r
1215 \r
1216         case 19:\r
1217                 if (name) return _("スピード", "Haste Self");\r
1218                 if (desc) return _("一定時間、加速する。", "Hastes you for a while.");\r
1219     \r
1220                 {\r
1221                         int base = plev;\r
1222                         int sides = 20 + plev;\r
1223 \r
1224                         if (info) return info_duration(base, sides);\r
1225 \r
1226                         if (cast)\r
1227                         {\r
1228                                 set_fast(randint1(sides) + base, FALSE);\r
1229                         }\r
1230                 }\r
1231                 break;\r
1232 \r
1233         case 20:\r
1234                 if (name) return _("壁抜け", "Walk through Wall");\r
1235                 if (desc) return _("一定時間、半物質化し壁を通り抜けられるようになる。", "Gives ability to pass walls for a while.");\r
1236     \r
1237                 {\r
1238                         int base = plev / 2;\r
1239 \r
1240                         if (info) return info_duration(base, base);\r
1241 \r
1242                         if (cast)\r
1243                         {\r
1244                                 set_kabenuke(randint1(base) + base, FALSE);\r
1245                         }\r
1246                 }\r
1247                 break;\r
1248 \r
1249         case 21:\r
1250                 if (name) return _("盾磨き", "Polish Shield");\r
1251                 if (desc) return _("盾に反射の属性をつける。", "Makes a shield a shield of reflection.");\r
1252     \r
1253                 {\r
1254                         if (cast)\r
1255                         {\r
1256                                 pulish_shield();\r
1257                         }\r
1258                 }\r
1259                 break;\r
1260 \r
1261         case 22:\r
1262                 if (name) return _("ゴーレム製造", "Create Golem");\r
1263                 if (desc) return _("1体のゴーレムを製造する。", "Creates a golem.");\r
1264     \r
1265                 {\r
1266                         if (cast)\r
1267                         {\r
1268                                 if (summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_GOLEM, PM_FORCE_PET))\r
1269                                 {\r
1270                                         msg_print(_("ゴーレムを作った。", "You make a golem."));\r
1271                                 }\r
1272                                 else\r
1273                                 {\r
1274                                         msg_print(_("うまくゴーレムを作れなかった。", "No Golems arrive."));\r
1275                                 }\r
1276                         }\r
1277                 }\r
1278                 break;\r
1279 \r
1280         case 23:\r
1281                 if (name) return _("魔法の鎧", "Magical armor");\r
1282                 if (desc) return _("一定時間、魔法防御力とACが上がり、混乱と盲目の耐性、反射能力、麻痺知らず、浮遊を得る。",\r
1283                         "Gives resistance to magic, bonus to AC, resistance to confusion, blindness, reflection, free action and levitation for a while.");\r
1284     \r
1285                 {\r
1286                         int base = 20;\r
1287 \r
1288                         if (info) return info_duration(base, base);\r
1289 \r
1290                         if (cast)\r
1291                         {\r
1292                                 set_magicdef(randint1(base) + base, FALSE);\r
1293                         }\r
1294                 }\r
1295                 break;\r
1296 \r
1297         case 24:\r
1298                 if (name) return _("装備無力化", "Remove Enchantment");\r
1299                 if (desc) return _("武器・防具にかけられたあらゆる魔力を完全に解除する。", "Removes all magics completely from any weapon or armor.");\r
1300     \r
1301                 {\r
1302                         if (cast)\r
1303                         {\r
1304                                 if (!mundane_spell(TRUE)) return NULL;\r
1305                         }\r
1306                 }\r
1307                 break;\r
1308 \r
1309         case 25:\r
1310                 if (name) return _("呪い粉砕", "Remove All Curse");\r
1311                 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");\r
1312     \r
1313                 {\r
1314                         if (cast)\r
1315                         {\r
1316                                 if (remove_all_curse())\r
1317                                 {\r
1318                                         msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));\r
1319                                 }\r
1320                         }\r
1321                 }\r
1322                 break;\r
1323 \r
1324         case 26:\r
1325                 if (name) return _("完全なる知識", "Knowledge True");\r
1326                 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");\r
1327     \r
1328                 {\r
1329                         if (cast)\r
1330                         {\r
1331                                 if (!identify_fully(FALSE)) return NULL;\r
1332                         }\r
1333                 }\r
1334                 break;\r
1335 \r
1336         case 27:\r
1337                 if (name) return _("武器強化", "Enchant Weapon");\r
1338                 if (desc) return _("武器の命中率修正とダメージ修正を強化する。", "Attempts to increase +to-hit, +to-dam of a weapon.");\r
1339     \r
1340                 {\r
1341                         if (cast)\r
1342                         {\r
1343                                 if (!enchant_spell(randint0(4) + 1, randint0(4) + 1, 0)) return NULL;\r
1344                         }\r
1345                 }\r
1346                 break;\r
1347 \r
1348         case 28:\r
1349                 if (name) return _("防具強化", "Enchant Armor");\r
1350                 if (desc) return _("鎧の防御修正を強化する。", "Attempts to increase +AC of an armor.");\r
1351     \r
1352                 {\r
1353                         if (cast)\r
1354                         {\r
1355                                 if (!enchant_spell(0, 0, randint0(3) + 2)) return NULL;\r
1356                         }\r
1357                 }\r
1358                 break;\r
1359 \r
1360         case 29:\r
1361                 if (name) return _("武器属性付与", "Brand Weapon");\r
1362                 if (desc) return _("武器にランダムに属性をつける。", "Makes current weapon a random ego weapon.");\r
1363     \r
1364                 {\r
1365                         if (cast)\r
1366                         {\r
1367                                 brand_weapon(randint0(18));\r
1368                         }\r
1369                 }\r
1370                 break;\r
1371 \r
1372         case 30:\r
1373                 if (name) return _("人間トランプ", "Living Trump");\r
1374                 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",\r
1375                         "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");\r
1376     \r
1377                 {\r
1378                         if (cast)\r
1379                         {\r
1380                                 int mutation;\r
1381 \r
1382                                 if (one_in_(7))\r
1383                                         /* Teleport control */\r
1384                                         mutation = 12;\r
1385                                 else\r
1386                                         /* Random teleportation (uncontrolled) */\r
1387                                         mutation = 77;\r
1388 \r
1389                                 /* Gain the mutation */\r
1390                                 if (gain_random_mutation(mutation))\r
1391                                 {\r
1392                                         msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));\r
1393                                 }\r
1394                         }\r
1395                 }\r
1396                 break;\r
1397 \r
1398         case 31:\r
1399                 if (name) return _("属性への免疫", "Immunity");\r
1400                 if (desc) return _("一定時間、冷気、炎、電撃、酸のいずれかに対する免疫を得る。",\r
1401                         "Gives an immunity to fire, cold, electricity or acid for a while.");\r
1402     \r
1403                 {\r
1404                         int base = 13;\r
1405 \r
1406                         if (info) return info_duration(base, base);\r
1407 \r
1408                         if (cast)\r
1409                         {\r
1410                                 if (!choose_ele_immune(base + randint1(base))) return NULL;\r
1411                         }\r
1412                 }\r
1413                 break;\r
1414         }\r
1415 \r
1416         return "";\r
1417 }\r
1418 \r
1419 /*!\r
1420  * @brief 悪魔領域魔法の各処理を行う\r
1421  * @param spell 魔法ID\r
1422  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)\r
1423  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。\r
1424  */\r
1425 static cptr do_daemon_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
1426 {\r
1427         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
1428         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
1429         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
1430         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
1431         static const char s_dam[] = _("損傷:", "dam ");\r
1432 \r
1433         int dir;\r
1434         int plev = p_ptr->lev;\r
1435 \r
1436         switch (spell)\r
1437         {\r
1438         case 0:\r
1439                 if (name) return _("マジック・ミサイル", "Magic Missile");\r
1440                 if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");\r
1441     \r
1442                 {\r
1443                         int dice = 3 + (plev - 1) / 5;\r
1444                         int sides = 4;\r
1445 \r
1446                         if (info) return info_damage(dice, sides, 0);\r
1447 \r
1448                         if (cast)\r
1449                         {\r
1450                                 if (!get_aim_dir(&dir)) return NULL;\r
1451 \r
1452                                 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));\r
1453                         }\r
1454                 }\r
1455                 break;\r
1456 \r
1457         case 1:\r
1458                 if (name) return _("無生命感知", "Detect Unlife");\r
1459                 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");\r
1460     \r
1461                 {\r
1462                         int rad = DETECT_RAD_DEFAULT;\r
1463 \r
1464                         if (info) return info_radius(rad);\r
1465 \r
1466                         if (cast)\r
1467                         {\r
1468                                 detect_monsters_nonliving(rad);\r
1469                         }\r
1470                 }\r
1471                 break;\r
1472 \r
1473         case 2:\r
1474                 if (name) return _("邪なる祝福", "Evil Bless");\r
1475                 if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives bonus to hit and AC for a few turns.");\r
1476     \r
1477                 {\r
1478                         int base = 12;\r
1479 \r
1480                         if (info) return info_duration(base, base);\r
1481 \r
1482                         if (cast)\r
1483                         {\r
1484                                 set_blessed(randint1(base) + base, FALSE);\r
1485                         }\r
1486                 }\r
1487                 break;\r
1488 \r
1489         case 3:\r
1490                 if (name) return _("耐火炎", "Resist Fire");\r
1491                 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。", \r
1492                         "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");\r
1493     \r
1494                 {\r
1495                         int base = 20;\r
1496 \r
1497                         if (info) return info_duration(base, base);\r
1498 \r
1499                         if (cast)\r
1500                         {\r
1501                                 set_oppose_fire(randint1(base) + base, FALSE);\r
1502                         }\r
1503                 }\r
1504                 break;\r
1505 \r
1506         case 4:\r
1507                 if (name) return _("恐慌", "Horrify");\r
1508                 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");\r
1509     \r
1510                 {\r
1511                         int power = plev;\r
1512 \r
1513                         if (info) return info_power(power);\r
1514 \r
1515                         if (cast)\r
1516                         {\r
1517                                 if (!get_aim_dir(&dir)) return NULL;\r
1518 \r
1519                                 fear_monster(dir, power);\r
1520                                 stun_monster(dir, power);\r
1521                         }\r
1522                 }\r
1523                 break;\r
1524 \r
1525         case 5:\r
1526                 if (name) return _("地獄の矢", "Nether Bolt");\r
1527                 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");\r
1528     \r
1529                 {\r
1530                         int dice = 6 + (plev - 5) / 4;\r
1531                         int sides = 8;\r
1532 \r
1533                         if (info) return info_damage(dice, sides, 0);\r
1534 \r
1535                         if (cast)\r
1536                         {\r
1537                                 if (!get_aim_dir(&dir)) return NULL;\r
1538 \r
1539                                 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));\r
1540                         }\r
1541                 }\r
1542                 break;\r
1543 \r
1544         case 6:\r
1545                 if (name) return _("古代の死霊召喚", "Summon Manes");\r
1546                 if (desc) return _("古代の死霊を召喚する。", "Summons a manes.");\r
1547     \r
1548                 {\r
1549                         if (cast)\r
1550                         {\r
1551                                 if (!summon_specific(-1, p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET)))\r
1552                                 {\r
1553                                         msg_print(_("古代の死霊は現れなかった。", "No Manes arrive."));\r
1554                                 }\r
1555                         }\r
1556                 }\r
1557                 break;\r
1558 \r
1559         case 7:\r
1560                 if (name) return _("地獄の焔", "Hellish Flame");\r
1561                 if (desc) return _("邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",\r
1562                         "Fires a ball of evil power. Hurts good monsters greatly.");\r
1563     \r
1564                 {\r
1565                         int dice = 3;\r
1566                         int sides = 6;\r
1567                         int rad = (plev < 30) ? 2 : 3;\r
1568                         int base;\r
1569 \r
1570                         if (p_ptr->pclass == CLASS_MAGE ||\r
1571                             p_ptr->pclass == CLASS_HIGH_MAGE ||\r
1572                             p_ptr->pclass == CLASS_SORCERER)\r
1573                                 base = plev + plev / 2;\r
1574                         else\r
1575                                 base = plev + plev / 4;\r
1576 \r
1577 \r
1578                         if (info) return info_damage(dice, sides, base);\r
1579 \r
1580                         if (cast)\r
1581                         {\r
1582                                 if (!get_aim_dir(&dir)) return NULL;\r
1583 \r
1584                                 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides) + base, rad);\r
1585                         }\r
1586                 }\r
1587                 break;\r
1588 \r
1589         case 8:\r
1590                 if (name) return _("デーモン支配", "Dominate Demon");\r
1591                 if (desc) return _("悪魔1体を魅了する。抵抗されると無効", "Attempts to charm a demon.");\r
1592     \r
1593                 {\r
1594                         int power = plev;\r
1595 \r
1596                         if (info) return info_power(power);\r
1597 \r
1598                         if (cast)\r
1599                         {\r
1600                                 if (!get_aim_dir(&dir)) return NULL;\r
1601 \r
1602                                 control_one_demon(dir, power);\r
1603                         }\r
1604                 }\r
1605                 break;\r
1606 \r
1607         case 9:\r
1608                 if (name) return _("ビジョン", "Vision");\r
1609                 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");\r
1610     \r
1611                 {\r
1612                         int rad = DETECT_RAD_MAP;\r
1613 \r
1614                         if (info) return info_radius(rad);\r
1615 \r
1616                         if (cast)\r
1617                         {\r
1618                                 map_area(rad);\r
1619                         }\r
1620                 }\r
1621                 break;\r
1622 \r
1623         case 10:\r
1624                 if (name) return _("耐地獄", "Resist Nether");\r
1625                 if (desc) return _("一定時間、地獄への耐性を得る。", "Gives resistance to nether for a while.");\r
1626     \r
1627                 {\r
1628                         int base = 20;\r
1629 \r
1630                         if (info) return info_duration(base, base);\r
1631 \r
1632                         if (cast)\r
1633                         {\r
1634                                 set_tim_res_nether(randint1(base) + base, FALSE);\r
1635                         }\r
1636                 }\r
1637                 break;\r
1638 \r
1639         case 11:\r
1640                 if (name) return _("プラズマ・ボルト", "Plasma bolt");\r
1641                 if (desc) return _("プラズマのボルトもしくはビームを放つ。", "Fires a bolt or beam of plasma.");\r
1642     \r
1643                 {\r
1644                         int dice = 11 + (plev - 5) / 4;\r
1645                         int sides = 8;\r
1646 \r
1647                         if (info) return info_damage(dice, sides, 0);\r
1648 \r
1649                         if (cast)\r
1650                         {\r
1651                                 if (!get_aim_dir(&dir)) return NULL;\r
1652 \r
1653                                 fire_bolt_or_beam(beam_chance(), GF_PLASMA, dir, damroll(dice, sides));\r
1654                         }\r
1655                 }\r
1656                 break;\r
1657 \r
1658         case 12:\r
1659                 if (name) return _("ファイア・ボール", "Fire Ball");\r
1660                 if (desc) return _("炎の球を放つ。", "Fires a ball of fire.");\r
1661     \r
1662                 {\r
1663                         HIT_POINT dam = plev + 55;\r
1664                         int rad = 2;\r
1665 \r
1666                         if (info) return info_damage(0, 0, dam);\r
1667 \r
1668                         if (cast)\r
1669                         {\r
1670                                 if (!get_aim_dir(&dir)) return NULL;\r
1671 \r
1672                                 fire_ball(GF_FIRE, dir, dam, rad);\r
1673                         }\r
1674                 }\r
1675                 break;\r
1676 \r
1677         case 13:\r
1678                 if (name) return _("炎の刃", "Fire Branding");\r
1679                 if (desc) return _("武器に炎の属性をつける。", "Makes current weapon fire branded.");\r
1680     \r
1681                 {\r
1682                         if (cast)\r
1683                         {\r
1684                                 brand_weapon(1);\r
1685                         }\r
1686                 }\r
1687                 break;\r
1688 \r
1689         case 14:\r
1690                 if (name) return _("地獄球", "Nether Ball");\r
1691                 if (desc) return _("大きな地獄の球を放つ。", "Fires a huge ball of nether.");\r
1692     \r
1693                 {\r
1694                         HIT_POINT dam = plev * 3 / 2 + 100;\r
1695                         int rad = plev / 20 + 2;\r
1696 \r
1697                         if (info) return info_damage(0, 0, dam);\r
1698 \r
1699                         if (cast)\r
1700                         {\r
1701                                 if (!get_aim_dir(&dir)) return NULL;\r
1702 \r
1703                                 fire_ball(GF_NETHER, dir, dam, rad);\r
1704                         }\r
1705                 }\r
1706                 break;\r
1707 \r
1708         case 15:\r
1709                 if (name) return _("デーモン召喚", "Summon Demon");\r
1710                 if (desc) return _("悪魔1体を召喚する。", "Summons a demon.");\r
1711     \r
1712                 {\r
1713                         if (cast)\r
1714                         {\r
1715                                 bool pet = !one_in_(3);\r
1716                                 u32b flg = 0L;\r
1717 \r
1718                                 if (pet) flg |= PM_FORCE_PET;\r
1719                                 else flg |= PM_NO_PET;\r
1720                                 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;\r
1721 \r
1722                                 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, plev*2/3+randint1(plev/2), SUMMON_DEMON, flg))\r
1723                                 {\r
1724                                         msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));\r
1725 \r
1726                                         if (pet)\r
1727                                         {\r
1728                                                 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));\r
1729                                         }\r
1730                                         else\r
1731                                         {\r
1732                                                 msg_print(_("「卑しき者よ、我は汝の下僕にあらず! お前の魂を頂くぞ!」",\r
1733                                                                         "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));\r
1734                                         }\r
1735                                 }\r
1736                                 else\r
1737                                 {\r
1738                                         msg_print(_("悪魔は現れなかった。", "No demons arrive."));\r
1739                                 }\r
1740                                 break;\r
1741                         }\r
1742                 }\r
1743                 break;\r
1744 \r
1745         case 16:\r
1746                 if (name) return _("悪魔の目", "Devilish Eye");\r
1747                 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");\r
1748     \r
1749                 {\r
1750                         int base = 30;\r
1751                         int sides = 25;\r
1752 \r
1753                         if (info) return info_duration(base, sides);\r
1754 \r
1755                         if (cast)\r
1756                         {\r
1757                                 set_tim_esp(randint1(sides) + base, FALSE);\r
1758                         }\r
1759                 }\r
1760                 break;\r
1761 \r
1762         case 17:\r
1763                 if (name) return _("悪魔のクローク", "Devil Cloak");\r
1764                 if (desc) return _("恐怖を取り除き、一定時間、炎と冷気の耐性、炎のオーラを得る。耐性は装備による耐性に累積する。", \r
1765                         "Removes fear. Gives resistance to fire and cold, and aura of fire. These resistances can be added to which from equipment for more powerful resistances.");\r
1766     \r
1767                 {\r
1768                         TIME_EFFECT base = 20;\r
1769 \r
1770                         if (info) return info_duration(base, base);\r
1771 \r
1772                         if (cast)\r
1773                         {\r
1774                                 TIME_EFFECT dur = randint1(base) + base;\r
1775                                         \r
1776                                 set_oppose_fire(dur, FALSE);\r
1777                                 set_oppose_cold(dur, FALSE);\r
1778                                 set_tim_sh_fire(dur, FALSE);\r
1779                                 set_afraid(0);\r
1780                                 break;\r
1781                         }\r
1782                 }\r
1783                 break;\r
1784 \r
1785         case 18:\r
1786                 if (name) return _("溶岩流", "The Flow of Lava");\r
1787                 if (desc) return _("自分を中心とした炎の球を作り出し、床を溶岩に変える。", \r
1788                         "Generates a ball of fire centered on you which transforms floors to magma.");\r
1789     \r
1790                 {\r
1791                         HIT_POINT dam = (55 + plev) * 2;\r
1792                         int rad = 3;\r
1793 \r
1794                         if (info) return info_damage(0, 0, dam/2);\r
1795 \r
1796                         if (cast)\r
1797                         {\r
1798                                 fire_ball(GF_FIRE, 0, dam, rad);\r
1799                                 fire_ball_hide(GF_LAVA_FLOW, 0, 2 + randint1(2), rad);\r
1800                         }\r
1801                 }\r
1802                 break;\r
1803 \r
1804         case 19:\r
1805                 if (name) return _("プラズマ球", "Plasma Ball");\r
1806                 if (desc) return _("プラズマの球を放つ。", "Fires a ball of plasma.");\r
1807     \r
1808                 {\r
1809                         HIT_POINT dam = plev * 3 / 2 + 80;\r
1810                         int rad = 2 + plev / 40;\r
1811 \r
1812                         if (info) return info_damage(0, 0, dam);\r
1813 \r
1814                         if (cast)\r
1815                         {\r
1816                                 if (!get_aim_dir(&dir)) return NULL;\r
1817 \r
1818                                 fire_ball(GF_PLASMA, dir, dam, rad);\r
1819                         }\r
1820                 }\r
1821                 break;\r
1822 \r
1823         case 20:\r
1824                 if (name) return _("悪魔変化", "Polymorph Demon");\r
1825                 if (desc) return _("一定時間、悪魔に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔としての能力を得る。", \r
1826                         "Mimic a demon for a while. Loses abilities of original race and gets abilities as a demon.");\r
1827     \r
1828                 {\r
1829                         int base = 10 + plev / 2;\r
1830 \r
1831                         if (info) return info_duration(base, base);\r
1832 \r
1833                         if (cast)\r
1834                         {\r
1835                                 set_mimic(base + randint1(base), MIMIC_DEMON, FALSE);\r
1836                         }\r
1837                 }\r
1838                 break;\r
1839 \r
1840         case 21:\r
1841                 if (name) return _("地獄の波動", "Nather Wave");\r
1842                 if (desc) return _("視界内の全てのモンスターにダメージを与える。善良なモンスターに特に大きなダメージを与える。", \r
1843                         "Damages all monsters in sight. Hurts good monsters greatly.");\r
1844     \r
1845                 {\r
1846                         int sides1 = plev * 2;\r
1847                         int sides2 = plev * 2;\r
1848 \r
1849                         if (info) return format("%sd%d+d%d", s_dam, sides1, sides2);\r
1850 \r
1851                         if (cast)\r
1852                         {\r
1853                                 dispel_monsters(randint1(sides1));\r
1854                                 dispel_good(randint1(sides2));\r
1855                         }\r
1856                 }\r
1857                 break;\r
1858 \r
1859         case 22:\r
1860                 if (name) return _("サキュバスの接吻", "Kiss of Succubus");\r
1861                 if (desc) return _("因果混乱の球を放つ。", "Fires a ball of nexus.");\r
1862     \r
1863                 {\r
1864                         HIT_POINT dam = 100 + plev * 2;\r
1865                         int rad = 4;\r
1866 \r
1867                         if (info) return info_damage(0, 0, dam);\r
1868 \r
1869                         if (cast)\r
1870                         {\r
1871                                 if (!get_aim_dir(&dir)) return NULL;\r
1872                                 fire_ball(GF_NEXUS, dir, dam, rad);\r
1873                         }\r
1874                 }\r
1875                 break;\r
1876 \r
1877         case 23:\r
1878                 if (name) return _("破滅の手", "Doom Hand");\r
1879                 if (desc) return _("破滅の手を放つ。食らったモンスターはそのときのHPの半分前後のダメージを受ける。", "Attempts to make a monster's HP almost half.");\r
1880     \r
1881                 {\r
1882                         if (cast)\r
1883                         {\r
1884                                 if (!get_aim_dir(&dir))\r
1885                                         return NULL;\r
1886                                 else \r
1887                                         msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));\r
1888                                 \r
1889                                 fire_ball_hide(GF_HAND_DOOM, dir, plev * 2, 0);\r
1890                         }\r
1891                 }\r
1892                 break;\r
1893 \r
1894         case 24:\r
1895                 if (name) return _("士気高揚", "Raise the Morale");\r
1896                 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");\r
1897     \r
1898                 {\r
1899                         int base = 25;\r
1900 \r
1901                         if (info) return info_duration(base, base);\r
1902 \r
1903                         if (cast)\r
1904                         {\r
1905                                 set_hero(randint1(base) + base, FALSE);\r
1906                                 hp_player(10);\r
1907                                 set_afraid(0);\r
1908                         }\r
1909                 }\r
1910                 break;\r
1911 \r
1912         case 25:\r
1913                 if (name) return _("不滅の肉体", "Immortal Body");\r
1914                 if (desc) return _("一定時間、時間逆転への耐性を得る。", "Gives resistance to time for a while.");\r
1915     \r
1916                 {\r
1917                         int base = 20;\r
1918 \r
1919                         if (info) return info_duration(base, base);\r
1920 \r
1921                         if (cast)\r
1922                         {\r
1923                                 set_tim_res_time(randint1(base)+base, FALSE);\r
1924                         }\r
1925                 }\r
1926                 break;\r
1927 \r
1928         case 26:\r
1929                 if (name) return _("狂気の円環", "Insanity Circle");\r
1930                 if (desc) return _("自分を中心としたカオスの球、混乱の球を発生させ、近くのモンスターを魅了する。", \r
1931                         "Generate balls of chaos, confusion and charm centered on you.");\r
1932     \r
1933                 {\r
1934                         HIT_POINT dam = 50 + plev;\r
1935                         int power = 20 + plev;\r
1936                         int rad = 3 + plev / 20;\r
1937 \r
1938                         if (info) return format("%s%d+%d", s_dam, dam/2, dam/2);\r
1939 \r
1940                         if (cast)\r
1941                         {\r
1942                                 fire_ball(GF_CHAOS, 0, dam, rad);\r
1943                                 fire_ball(GF_CONFUSION, 0, dam, rad);\r
1944                                 fire_ball(GF_CHARM, 0, power, rad);\r
1945                         }\r
1946                 }\r
1947                 break;\r
1948 \r
1949         case 27:\r
1950                 if (name) return _("ペット爆破", "Explode Pets");\r
1951                 if (desc) return _("全てのペットを強制的に爆破させる。", "Makes all pets explode.");\r
1952     \r
1953                 {\r
1954                         if (cast)\r
1955                         {\r
1956                                 discharge_minion();\r
1957                         }\r
1958                 }\r
1959                 break;\r
1960 \r
1961         case 28:\r
1962                 if (name) return _("グレーターデーモン召喚", "Summon Greater Demon");\r
1963                 if (desc) return _("上級デーモンを召喚する。召喚するには人間('p','h','t'で表されるモンスター)の死体を捧げなければならない。", \r
1964                         "Summons greater demon. It need to sacrifice a corpse of human ('p','h' or 't').");\r
1965     \r
1966                 {\r
1967                         if (cast)\r
1968                         {\r
1969                                 if (!cast_summon_greater_demon()) return NULL;\r
1970                         }\r
1971                 }\r
1972                 break;\r
1973 \r
1974         case 29:\r
1975                 if (name) return _("地獄嵐", "Nether Storm");\r
1976                 if (desc) return _("超巨大な地獄の球を放つ。", "Generate a huge ball of nether.");\r
1977     \r
1978                 {\r
1979                         HIT_POINT dam = plev * 15;\r
1980                         int rad = plev / 5;\r
1981 \r
1982                         if (info) return info_damage(0, 0, dam);\r
1983 \r
1984                         if (cast)\r
1985                         {\r
1986                                 if (!get_aim_dir(&dir)) return NULL;\r
1987 \r
1988                                 fire_ball(GF_NETHER, dir, dam, rad);\r
1989                         }\r
1990                 }\r
1991                 break;\r
1992 \r
1993         case 30:\r
1994                 if (name) return _("血の呪い", "Bloody Curse");\r
1995                 if (desc) return _("自分がダメージを受けることによって対象に呪いをかけ、ダメージを与え様々な効果を引き起こす。",\r
1996                         "Puts blood curse which damages and causes various effects on a monster. You also take damage.");\r
1997     \r
1998                 {\r
1999                         HIT_POINT dam = 600;\r
2000                         int rad = 0;\r
2001 \r
2002                         if (info) return info_damage(0, 0, dam);\r
2003 \r
2004                         if (cast)\r
2005                         {\r
2006                                 if (!get_aim_dir(&dir)) return NULL;\r
2007 \r
2008                                 fire_ball_hide(GF_BLOOD_CURSE, dir, dam, rad);\r
2009                                 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("血の呪い", "Blood curse"), -1);\r
2010                         }\r
2011                 }\r
2012                 break;\r
2013 \r
2014         case 31:\r
2015                 if (name) return _("魔王変化", "Polymorph Demonlord");\r
2016                 if (desc) return _("悪魔の王に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔の王としての能力を得、壁を破壊しながら歩く。",\r
2017                         "Mimic a demon lord for a while. Loses abilities of original race and gets great abilities as a demon lord. Even hard walls can't stop your walking.");\r
2018     \r
2019                 {\r
2020                         int base = 15;\r
2021 \r
2022                         if (info) return info_duration(base, base);\r
2023 \r
2024                         if (cast)\r
2025                         {\r
2026                                 set_mimic(base + randint1(base), MIMIC_DEMON_LORD, FALSE);\r
2027                         }\r
2028                 }\r
2029                 break;\r
2030         }\r
2031 \r
2032         return "";\r
2033 }\r
2034 \r
2035 /*!\r
2036  * @brief 破邪領域魔法の各処理を行う\r
2037  * @param spell 魔法ID\r
2038  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)\r
2039  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。\r
2040  */\r
2041 static cptr do_crusade_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
2042 {\r
2043         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
2044         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
2045         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
2046         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
2047 \r
2048         int dir;\r
2049         int plev = p_ptr->lev;\r
2050 \r
2051         switch (spell)\r
2052         {\r
2053         case 0:\r
2054                 if (name) return _("懲罰", "Punishment");\r
2055                 if (desc) return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");\r
2056     \r
2057                 {\r
2058                         int dice = 3 + (plev - 1) / 5;\r
2059                         int sides = 4;\r
2060 \r
2061                         if (info) return info_damage(dice, sides, 0);\r
2062 \r
2063                         if (cast)\r
2064                         {\r
2065                                 if (!get_aim_dir(&dir)) return NULL;\r
2066 \r
2067                                 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));\r
2068                         }\r
2069                 }\r
2070                 break;\r
2071 \r
2072         case 1:\r
2073                 if (name) return _("邪悪存在感知", "Detect Evil");\r
2074                 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");\r
2075     \r
2076                 {\r
2077                         int rad = DETECT_RAD_DEFAULT;\r
2078 \r
2079                         if (info) return info_radius(rad);\r
2080 \r
2081                         if (cast)\r
2082                         {\r
2083                                 detect_monsters_evil(rad);\r
2084                         }\r
2085                 }\r
2086                 break;\r
2087 \r
2088         case 2:\r
2089                 if (name) return _("恐怖除去", "Remove Fear");\r
2090                 if (desc) return _("恐怖を取り除く。", "Removes fear.");\r
2091     \r
2092                 {\r
2093                         if (cast)\r
2094                         {\r
2095                                 set_afraid(0);\r
2096                         }\r
2097                 }\r
2098                 break;\r
2099 \r
2100         case 3:\r
2101                 if (name) return _("威圧", "Scare Monster");\r
2102                 if (desc) return _("モンスター1体を恐怖させる。抵抗されると無効。", "Attempts to scare a monster.");\r
2103     \r
2104                 {\r
2105                         int power = plev;\r
2106 \r
2107                         if (info) return info_power(power);\r
2108 \r
2109                         if (cast)\r
2110                         {\r
2111                                 if (!get_aim_dir(&dir)) return NULL;\r
2112 \r
2113                                 fear_monster(dir, power);\r
2114                         }\r
2115                 }\r
2116                 break;\r
2117 \r
2118         case 4:\r
2119                 if (name) return _("聖域", "Sanctuary");\r
2120                 if (desc) return _("隣接した全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep monsters in the adjacent squares.");\r
2121     \r
2122                 {\r
2123                         int power = plev;\r
2124 \r
2125                         if (info) return info_power(power);\r
2126 \r
2127                         if (cast)\r
2128                         {\r
2129                                 sleep_monsters_touch();\r
2130                         }\r
2131                 }\r
2132                 break;\r
2133 \r
2134         case 5:\r
2135                 if (name) return _("入口", "Portal");\r
2136                 if (desc) return _("中距離のテレポートをする。", "Teleport medium distance.");\r
2137     \r
2138                 {\r
2139                         POSITION range = 25 + plev / 2;\r
2140 \r
2141                         if (info) return info_range(range);\r
2142 \r
2143                         if (cast)\r
2144                         {\r
2145                                 teleport_player(range, 0L);\r
2146                         }\r
2147                 }\r
2148                 break;\r
2149 \r
2150         case 6:\r
2151                 if (name) return _("スターダスト", "Star Dust");\r
2152                 if (desc) return _("ターゲット付近に閃光のボルトを連射する。", "Fires many bolts of light near the target.");\r
2153     \r
2154                 {\r
2155                         int dice = 3 + (plev - 1) / 9;\r
2156                         int sides = 2;\r
2157 \r
2158                         if (info) return info_multi_damage_dice(dice, sides);\r
2159 \r
2160                         if (cast)\r
2161                         {\r
2162                                 if (!get_aim_dir(&dir)) return NULL;\r
2163                                 fire_blast(GF_LITE, dir, dice, sides, 10, 3);\r
2164                         }\r
2165                 }\r
2166                 break;\r
2167 \r
2168         case 7:\r
2169                 if (name) return _("身体浄化", "Purify");\r
2170                 if (desc) return _("傷、毒、朦朧から全快する。", "Heals all cut, stun and poison status.");\r
2171     \r
2172                 {\r
2173                         if (cast)\r
2174                         {\r
2175                                 set_cut(0);\r
2176                                 set_poisoned(0);\r
2177                                 set_stun(0);\r
2178                         }\r
2179                 }\r
2180                 break;\r
2181 \r
2182         case 8:\r
2183                 if (name) return _("邪悪飛ばし", "Scatter Evil");\r
2184                 if (desc) return _("邪悪なモンスター1体をテレポートさせる。抵抗されると無効。", "Attempts to teleport an evil monster away.");\r
2185     \r
2186                 {\r
2187                         int power = MAX_SIGHT * 5;\r
2188 \r
2189                         if (info) return info_power(power);\r
2190 \r
2191                         if (cast)\r
2192                         {\r
2193                                 if (!get_aim_dir(&dir)) return NULL;\r
2194                                 fire_ball(GF_AWAY_EVIL, dir, power, 0);\r
2195                         }\r
2196                 }\r
2197                 break;\r
2198 \r
2199         case 9:\r
2200                 if (name) return _("聖なる光球", "Holy Orb");\r
2201                 if (desc) return _("聖なる力をもつ宝珠を放つ。邪悪なモンスターに対して大きなダメージを与えるが、善良なモンスターには効果がない。", \r
2202                         "Fires a ball with holy power. Hurts evil monsters greatly, but don't effect good monsters.");\r
2203     \r
2204                 {\r
2205                         int dice = 3;\r
2206                         int sides = 6;\r
2207                         int rad = (plev < 30) ? 2 : 3;\r
2208                         int base;\r
2209 \r
2210                         if (p_ptr->pclass == CLASS_PRIEST ||\r
2211                             p_ptr->pclass == CLASS_HIGH_MAGE ||\r
2212                             p_ptr->pclass == CLASS_SORCERER)\r
2213                                 base = plev + plev / 2;\r
2214                         else\r
2215                                 base = plev + plev / 4;\r
2216 \r
2217 \r
2218                         if (info) return info_damage(dice, sides, base);\r
2219 \r
2220                         if (cast)\r
2221                         {\r
2222                                 if (!get_aim_dir(&dir)) return NULL;\r
2223 \r
2224                                 fire_ball(GF_HOLY_FIRE, dir, damroll(dice, sides) + base, rad);\r
2225                         }\r
2226                 }\r
2227                 break;\r
2228 \r
2229         case 10:\r
2230                 if (name) return _("悪魔払い", "Exorcism");\r
2231                 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与え、邪悪なモンスターを恐怖させる。", \r
2232                         "Damages all undead and demons in sight, and scares all evil monsters in sight.");\r
2233     \r
2234                 {\r
2235                         int sides = plev;\r
2236                         int power = plev;\r
2237 \r
2238                         if (info) return info_damage(1, sides, 0);\r
2239 \r
2240                         if (cast)\r
2241                         {\r
2242                                 dispel_undead(randint1(sides));\r
2243                                 dispel_demons(randint1(sides));\r
2244                                 turn_evil(power);\r
2245                         }\r
2246                 }\r
2247                 break;\r
2248 \r
2249         case 11:\r
2250                 if (name) return _("解呪", "Remove Curse");\r
2251                 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");\r
2252     \r
2253                 {\r
2254                         if (cast)\r
2255                         {\r
2256                                 if (remove_curse())\r
2257                                 {\r
2258                                         msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));\r
2259                                 }\r
2260                         }\r
2261                 }\r
2262                 break;\r
2263 \r
2264         case 12:\r
2265                 if (name) return _("透明視認", "Sense Unseen");\r
2266                 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");\r
2267     \r
2268                 {\r
2269                         int base = 24;\r
2270 \r
2271                         if (info) return info_duration(base, base);\r
2272 \r
2273                         if (cast)\r
2274                         {\r
2275                                 set_tim_invis(randint1(base) + base, FALSE);\r
2276                         }\r
2277                 }\r
2278                 break;\r
2279 \r
2280         case 13:\r
2281                 if (name) return _("対邪悪結界", "Protection from Evil");\r
2282                 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");\r
2283     \r
2284                 {\r
2285                         int base = 25;\r
2286                         int sides = 3 * plev;\r
2287 \r
2288                         if (info) return info_duration(base, sides);\r
2289 \r
2290                         if (cast)\r
2291                         {\r
2292                                 set_protevil(randint1(sides) + base, FALSE);\r
2293                         }\r
2294                 }\r
2295                 break;\r
2296 \r
2297         case 14:\r
2298                 if (name) return _("裁きの雷", "Judgment Thunder");\r
2299                 if (desc) return _("強力な電撃のボルトを放つ。", "Fires a powerful bolt of lightning.");\r
2300     \r
2301                 {\r
2302                         HIT_POINT dam = plev * 5;\r
2303 \r
2304                         if (info) return info_damage(0, 0, dam);\r
2305 \r
2306                         if (cast)\r
2307                         {\r
2308                                 if (!get_aim_dir(&dir)) return NULL;\r
2309                                 fire_bolt(GF_ELEC, dir, dam);\r
2310                         }\r
2311                 }\r
2312                 break;\r
2313 \r
2314         case 15:\r
2315                 if (name) return _("聖なる御言葉", "Holy Word");\r
2316                 if (desc) return _("視界内の邪悪な存在に大きなダメージを与え、体力を回復し、毒、恐怖、朦朧状態、負傷から全快する。",\r
2317                         "Damages all evil monsters in sight, heals HP somewhat, and completely heals poison, fear, stun and cut status.");\r
2318     \r
2319                 {\r
2320                         int dam_sides = plev * 6;\r
2321                         int heal = 100;\r
2322 \r
2323                         if (info) return format(_("損:1d%d/回%d", "dam:d%d/h%d"), dam_sides, heal);\r
2324                         if (cast)\r
2325                         {\r
2326                                 dispel_evil(randint1(dam_sides));\r
2327                                 hp_player(heal);\r
2328                                 set_afraid(0);\r
2329                                 set_poisoned(0);\r
2330                                 set_stun(0);\r
2331                                 set_cut(0);\r
2332                         }\r
2333                 }\r
2334                 break;\r
2335 \r
2336         case 16:\r
2337                 if (name) return _("開かれた道", "Unbarring Ways");\r
2338                 if (desc) return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");\r
2339     \r
2340                 {\r
2341                         if (cast)\r
2342                         {\r
2343                                 if (!get_aim_dir(&dir)) return NULL;\r
2344 \r
2345                                 destroy_door(dir);\r
2346                         }\r
2347                 }\r
2348                 break;\r
2349 \r
2350         case 17:\r
2351                 if (name) return _("封魔", "Arrest");\r
2352                 if (desc) return _("邪悪なモンスターの動きを止める。", "Attempts to paralyze an evil monster.");\r
2353     \r
2354                 {\r
2355                         int power = plev * 2;\r
2356 \r
2357                         if (info) return info_power(power);\r
2358 \r
2359                         if (cast)\r
2360                         {\r
2361                                 if (!get_aim_dir(&dir)) return NULL;\r
2362                                 stasis_evil(dir);\r
2363                         }\r
2364                 }\r
2365                 break;\r
2366 \r
2367         case 18:\r
2368                 if (name) return _("聖なるオーラ", "Holy Aura");\r
2369                 if (desc) return _("一定時間、邪悪なモンスターを傷つける聖なるオーラを得る。",\r
2370                         "Gives aura of holy power which injures evil monsters which attacked you for a while.");\r
2371     \r
2372                 {\r
2373                         int base = 20;\r
2374 \r
2375                         if (info) return info_duration(base, base);\r
2376 \r
2377                         if (cast)\r
2378                         {\r
2379                                 set_tim_sh_holy(randint1(base) + base, FALSE);\r
2380                         }\r
2381                 }\r
2382                 break;\r
2383 \r
2384         case 19:\r
2385                 if (name) return _("アンデッド&悪魔退散", "Dispel Undead & Demons");\r
2386                 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与える。", "Damages all undead and demons in sight.");\r
2387     \r
2388                 {\r
2389                         int sides = plev * 4;\r
2390 \r
2391                         if (info) return info_damage(1, sides, 0);\r
2392 \r
2393                         if (cast)\r
2394                         {\r
2395                                 dispel_undead(randint1(sides));\r
2396                                 dispel_demons(randint1(sides));\r
2397                         }\r
2398                 }\r
2399                 break;\r
2400 \r
2401         case 20:\r
2402                 if (name) return _("邪悪退散", "Dispel Evil");\r
2403                 if (desc) return _("視界内の全ての邪悪なモンスターにダメージを与える。", "Damages all evil monsters in sight.");\r
2404     \r
2405                 {\r
2406                         int sides = plev * 4;\r
2407 \r
2408                         if (info) return info_damage(1, sides, 0);\r
2409 \r
2410                         if (cast)\r
2411                         {\r
2412                                 dispel_evil(randint1(sides));\r
2413                         }\r
2414                 }\r
2415                 break;\r
2416 \r
2417         case 21:\r
2418                 if (name) return _("聖なる刃", "Holy Blade");\r
2419                 if (desc) return _("通常の武器に滅邪の属性をつける。", "Makes current weapon especially deadly against evil monsters.");\r
2420     \r
2421                 {\r
2422                         if (cast)\r
2423                         {\r
2424                                 brand_weapon(13);\r
2425                         }\r
2426                 }\r
2427                 break;\r
2428 \r
2429         case 22:\r
2430                 if (name) return _("スターバースト", "Star Burst");\r
2431                 if (desc) return _("巨大な閃光の球を放つ。", "Fires a huge ball of powerful light.");\r
2432     \r
2433                 {\r
2434                         HIT_POINT dam = 100 + plev * 2;\r
2435                         int rad = 4;\r
2436 \r
2437                         if (info) return info_damage(0, 0, dam);\r
2438 \r
2439                         if (cast)\r
2440                         {\r
2441                                 if (!get_aim_dir(&dir)) return NULL;\r
2442 \r
2443                                 fire_ball(GF_LITE, dir, dam, rad);\r
2444                         }\r
2445                 }\r
2446                 break;\r
2447 \r
2448         case 23:\r
2449                 if (name) return _("天使召喚", "Summon Angel");\r
2450                 if (desc) return _("天使を1体召喚する。", "Summons an angel.");\r
2451     \r
2452                 {\r
2453                         if (cast)\r
2454                         {\r
2455                                 bool pet = !one_in_(3);\r
2456                                 u32b flg = 0L;\r
2457 \r
2458                                 if (pet) flg |= PM_FORCE_PET;\r
2459                                 else flg |= PM_NO_PET;\r
2460                                 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;\r
2461 \r
2462                                 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_ANGEL, flg))\r
2463                                 {\r
2464                                         if (pet)\r
2465                                         {\r
2466                                                 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));\r
2467                                         }\r
2468                                         else\r
2469                                         {\r
2470                                                 msg_print(_("「我は汝の下僕にあらず! 悪行者よ、悔い改めよ!」", "Mortal! Repent of thy impiousness."));\r
2471                                         }\r
2472                                 }\r
2473                         }\r
2474                 }\r
2475                 break;\r
2476 \r
2477         case 24:\r
2478                 if (name) return _("士気高揚", "Heroism");\r
2479                 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");\r
2480     \r
2481                 {\r
2482                         int base = 25;\r
2483 \r
2484                         if (info) return info_duration(base, base);\r
2485 \r
2486                         if (cast)\r
2487                         {\r
2488                                 set_hero(randint1(base) + base, FALSE);\r
2489                                 hp_player(10);\r
2490                                 set_afraid(0);\r
2491                         }\r
2492                 }\r
2493                 break;\r
2494 \r
2495         case 25:\r
2496                 if (name) return _("呪い退散", "Dispel Curse");\r
2497                 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");\r
2498     \r
2499                 {\r
2500                         if (cast)\r
2501                         {\r
2502                                 if (remove_all_curse())\r
2503                                 {\r
2504                                         msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));\r
2505                                 }\r
2506                         }\r
2507                 }\r
2508                 break;\r
2509 \r
2510         case 26:\r
2511                 if (name) return _("邪悪追放", "Banish Evil");\r
2512                 if (desc) return _("視界内の全ての邪悪なモンスターをテレポートさせる。抵抗されると無効。", \r
2513                         "Teleports all evil monsters in sight away unless resisted.");\r
2514     \r
2515                 {\r
2516                         int power = 100;\r
2517 \r
2518                         if (info) return info_power(power);\r
2519 \r
2520                         if (cast)\r
2521                         {\r
2522                                 if (banish_evil(power))\r
2523                                 {\r
2524                                         msg_print(_("神聖な力が邪悪を打ち払った!", "The holy power banishes evil!"));\r
2525                                 }\r
2526                         }\r
2527                 }\r
2528                 break;\r
2529 \r
2530         case 27:\r
2531                 if (name) return _("ハルマゲドン", "Armageddon");\r
2532                 if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroy everything in nearby area.");\r
2533     \r
2534                 {\r
2535                         int base = 12;\r
2536                         int sides = 4;\r
2537 \r
2538                         if (cast)\r
2539                         {\r
2540                                 destroy_area(p_ptr->y, p_ptr->x, base + randint1(sides), FALSE);\r
2541                         }\r
2542                 }\r
2543                 break;\r
2544 \r
2545         case 28:\r
2546                 if (name) return _("目には目を", "An Eye for an Eye");\r
2547                 if (desc) return _("一定時間、自分がダメージを受けたときに攻撃を行ったモンスターに対して同等のダメージを与える。", \r
2548                         "Gives special aura for a while. When you are attacked by a monster, the monster are injured with same amount of damage as you take.");\r
2549     \r
2550                 {\r
2551                         int base = 10;\r
2552 \r
2553                         if (info) return info_duration(base, base);\r
2554 \r
2555                         if (cast)\r
2556                         {\r
2557                                 set_tim_eyeeye(randint1(base) + base, FALSE);\r
2558                         }\r
2559                 }\r
2560                 break;\r
2561 \r
2562         case 29:\r
2563                 if (name) return _("神の怒り", "Wrath of the God");\r
2564                 if (desc) return _("ターゲットの周囲に分解の球を多数落とす。", "Drops many balls of disintegration near the target.");\r
2565     \r
2566                 {\r
2567                         HIT_POINT dam = plev * 3 + 25;\r
2568                         int rad = 2;\r
2569 \r
2570                         if (info) return info_multi_damage(dam);\r
2571 \r
2572                         if (cast)\r
2573                         {\r
2574                                 if (!cast_wrath_of_the_god(dam, rad)) return NULL;\r
2575                         }\r
2576                 }\r
2577                 break;\r
2578 \r
2579         case 30:\r
2580                 if (name) return _("神威", "Divine Intervention");\r
2581                 if (desc) return _("隣接するモンスターに聖なるダメージを与え、視界内のモンスターにダメージ、減速、朦朧、混乱、恐怖、眠りを与える。さらに体力を回復する。", \r
2582                         "Damages all adjacent monsters with holy power. Damages and attempt to slow, stun, confuse, scare and freeze all monsters in sight. And heals HP.");\r
2583     \r
2584                 {\r
2585                         int b_dam = plev * 11;\r
2586                         int d_dam = plev * 4;\r
2587                         int heal = 100;\r
2588                         int power = plev * 4;\r
2589 \r
2590                         if (info) return format(_("回%d/損%d+%d", "h%d/dm%d+%d"), heal, d_dam, b_dam/2);\r
2591                         if (cast)\r
2592                         {\r
2593                                 project(0, 1, p_ptr->y, p_ptr->x, b_dam, GF_HOLY_FIRE, PROJECT_KILL, -1);\r
2594                                 dispel_monsters(d_dam);\r
2595                                 slow_monsters(plev);\r
2596                                 stun_monsters(power);\r
2597                                 confuse_monsters(power);\r
2598                                 turn_monsters(power);\r
2599                                 stasis_monsters(power);\r
2600                                 hp_player(heal);\r
2601                         }\r
2602                 }\r
2603                 break;\r
2604 \r
2605         case 31:\r
2606                 if (name) return _("聖戦", "Crusade");\r
2607                 if (desc) return _("視界内の善良なモンスターをペットにしようとし、ならなかった場合及び善良でないモンスターを恐怖させる。さらに多数の加速された騎士を召喚し、ヒーロー、祝福、加速、対邪悪結界を得る。", \r
2608                         "Attempts to charm all good monsters in sight, and scare all non-charmed monsters, and summons great number of knights, and gives heroism, bless, speed and protection from evil.");\r
2609     \r
2610                 {\r
2611                         if (cast)\r
2612                         {\r
2613                                 int base = 25;\r
2614                                 int sp_sides = 20 + plev;\r
2615                                 int sp_base = plev;\r
2616 \r
2617                                 int i;\r
2618                                 crusade();\r
2619                                 for (i = 0; i < 12; i++)\r
2620                                 {\r
2621                                         int attempt = 10;\r
2622                                         POSITION my = 0, mx = 0;\r
2623 \r
2624                                         while (attempt--)\r
2625                                         {\r
2626                                                 scatter(&my, &mx, p_ptr->y, p_ptr->x, 4, 0);\r
2627 \r
2628                                                 /* Require empty grids */\r
2629                                                 if (cave_empty_bold2(my, mx)) break;\r
2630                                         }\r
2631                                         if (attempt < 0) continue;\r
2632                                         summon_specific(-1, my, mx, plev, SUMMON_KNIGHTS, (PM_ALLOW_GROUP | PM_FORCE_PET | PM_HASTE));\r
2633                                 }\r
2634                                 set_hero(randint1(base) + base, FALSE);\r
2635                                 set_blessed(randint1(base) + base, FALSE);\r
2636                                 set_fast(randint1(sp_sides) + sp_base, FALSE);\r
2637                                 set_protevil(randint1(base) + base, FALSE);\r
2638                                 set_afraid(0);\r
2639                         }\r
2640                 }\r
2641                 break;\r
2642         }\r
2643 \r
2644         return "";\r
2645 }\r
2646 \r
2647 \r
2648 /*!\r
2649  * @brief 歌の各処理を行う\r
2650  * @param spell 歌ID\r
2651  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP)\r
2652  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。\r
2653  */\r
2654 static cptr do_music_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
2655 {\r
2656         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
2657         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
2658         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
2659         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
2660         bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;\r
2661         bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;\r
2662         bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;\r
2663         static const char s_dam[] = _("損傷:", "dam ");\r
2664 \r
2665         int dir;\r
2666         int plev = p_ptr->lev;\r
2667 \r
2668         switch (spell)\r
2669         {\r
2670         case 0:\r
2671                 if (name) return _("遅鈍の歌", "Song of Holding");\r
2672                 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");\r
2673     \r
2674                 /* Stop singing before start another */\r
2675                 if (cast || fail) stop_singing();\r
2676 \r
2677                 if (cast)\r
2678                 {\r
2679                         msg_print(_("ゆっくりとしたメロディを口ずさみ始めた...", "You start humming a slow, steady melody..."));\r
2680                         start_singing(spell, MUSIC_SLOW);\r
2681                 }\r
2682 \r
2683                 {\r
2684                         int power = plev;\r
2685 \r
2686                         if (info) return info_power(power);\r
2687 \r
2688                         if (cont)\r
2689                         {\r
2690                                 slow_monsters(plev);\r
2691                         }\r
2692                 }\r
2693                 break;\r
2694 \r
2695         case 1:\r
2696                 if (name) return _("祝福の歌", "Song of Blessing");\r
2697                 if (desc) return _("命中率とACのボーナスを得る。", "Gives bonus to hit and AC for a few turns.");\r
2698     \r
2699                 /* Stop singing before start another */\r
2700                 if (cast || fail) stop_singing();\r
2701 \r
2702                 if (cast)\r
2703                 {\r
2704                         msg_print(_("厳かなメロディを奏で始めた...", "The holy power of the Music of the Ainur enters you..."));\r
2705                         start_singing(spell, MUSIC_BLESS);\r
2706                 }\r
2707 \r
2708                 if (stop)\r
2709                 {\r
2710                         if (!p_ptr->blessed)\r
2711                         {\r
2712                                 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));\r
2713                         }\r
2714                 }\r
2715 \r
2716                 break;\r
2717 \r
2718         case 2:\r
2719                 if (name) return _("崩壊の音色", "Wrecking Note");\r
2720                 if (desc) return _("轟音のボルトを放つ。", "Fires a bolt of sound.");\r
2721     \r
2722                 /* Stop singing before start another */\r
2723                 if (cast || fail) stop_singing();\r
2724 \r
2725                 {\r
2726                         int dice = 4 + (plev - 1) / 5;\r
2727                         int sides = 4;\r
2728 \r
2729                         if (info) return info_damage(dice, sides, 0);\r
2730 \r
2731                         if (cast)\r
2732                         {\r
2733                                 if (!get_aim_dir(&dir)) return NULL;\r
2734 \r
2735                                 fire_bolt(GF_SOUND, dir, damroll(dice, sides));\r
2736                         }\r
2737                 }\r
2738                 break;\r
2739 \r
2740         case 3:\r
2741                 if (name) return _("朦朧の旋律", "Stun Pattern");\r
2742                 if (desc) return _("視界内の全てのモンスターを朦朧させる。抵抗されると無効。", "Attempts to stun all monsters in sight.");\r
2743     \r
2744                 /* Stop singing before start another */\r
2745                 if (cast || fail) stop_singing();\r
2746 \r
2747                 if (cast)\r
2748                 {\r
2749                         msg_print(_("眩惑させるメロディを奏で始めた...", "You weave a pattern of sounds to bewilder and daze..."));\r
2750                         start_singing(spell, MUSIC_STUN);\r
2751                 }\r
2752 \r
2753                 {\r
2754                         int dice = plev / 10;\r
2755                         int sides = 2;\r
2756 \r
2757                         if (info) return info_power_dice(dice, sides);\r
2758 \r
2759                         if (cont)\r
2760                         {\r
2761                                 stun_monsters(damroll(dice, sides));\r
2762                         }\r
2763                 }\r
2764 \r
2765                 break;\r
2766 \r
2767         case 4:\r
2768                 if (name) return _("生命の流れ", "Flow of Life");\r
2769                 if (desc) return _("体力を少し回復させる。", "Heals HP a little.");\r
2770     \r
2771                 /* Stop singing before start another */\r
2772                 if (cast || fail) stop_singing();\r
2773 \r
2774                 if (cast)\r
2775                 {\r
2776                         msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing a song of healing..."));\r
2777                         start_singing(spell, MUSIC_L_LIFE);\r
2778                 }\r
2779 \r
2780                 {\r
2781                         int dice = 2;\r
2782                         int sides = 6;\r
2783 \r
2784                         if (info) return info_heal(dice, sides, 0);\r
2785 \r
2786                         if (cont)\r
2787                         {\r
2788                                 hp_player(damroll(dice, sides));\r
2789                         }\r
2790                 }\r
2791 \r
2792                 break;\r
2793 \r
2794         case 5:\r
2795                 if (name) return _("太陽の歌", "Song of the Sun");\r
2796                 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");\r
2797     \r
2798                 /* Stop singing before start another */\r
2799                 if (cast || fail) stop_singing();\r
2800 \r
2801                 {\r
2802                         int dice = 2;\r
2803                         int sides = plev / 2;\r
2804                         int rad = plev / 10 + 1;\r
2805 \r
2806                         if (info) return info_damage(dice, sides, 0);\r
2807 \r
2808                         if (cast)\r
2809                         {\r
2810                                 msg_print(_("光り輝く歌が辺りを照らした。", "Your uplifting song brings brightness to dark places..."));\r
2811                                 lite_area(damroll(dice, sides), rad);\r
2812                         }\r
2813                 }\r
2814                 break;\r
2815 \r
2816         case 6:\r
2817                 if (name) return _("恐怖の歌", "Song of Fear");\r
2818                 if (desc) return _("視界内の全てのモンスターを恐怖させる。抵抗されると無効。", "Attempts to scare all monsters in sight.");\r
2819     \r
2820                 /* Stop singing before start another */\r
2821                 if (cast || fail) stop_singing();\r
2822 \r
2823                 if (cast)\r
2824                 {\r
2825                         msg_print(_("おどろおどろしいメロディを奏で始めた...", "You start weaving a fearful pattern..."));\r
2826                         start_singing(spell, MUSIC_FEAR);                       \r
2827                 }\r
2828 \r
2829                 {\r
2830                         int power = plev;\r
2831 \r
2832                         if (info) return info_power(power);\r
2833 \r
2834                         if (cont)\r
2835                         {\r
2836                                 project_hack(GF_TURN_ALL, power);\r
2837                         }\r
2838                 }\r
2839 \r
2840                 break;\r
2841 \r
2842         case 7:\r
2843                 if (name) return _("戦いの歌", "Heroic Ballad");\r
2844                 if (desc) return _("ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");\r
2845 \r
2846                 /* Stop singing before start another */\r
2847                 if (cast || fail) stop_singing();\r
2848 \r
2849                 if (cast)\r
2850                 {\r
2851                         msg_print(_("激しい戦いの歌を歌った...", "You start singing a song of intense fighting..."));\r
2852 \r
2853                         (void)hp_player(10);\r
2854                         (void)set_afraid(0);\r
2855 \r
2856                         /* Recalculate hitpoints */\r
2857                         p_ptr->update |= (PU_HP);\r
2858 \r
2859                         start_singing(spell, MUSIC_HERO);\r
2860                 }\r
2861 \r
2862                 if (stop)\r
2863                 {\r
2864                         if (!p_ptr->hero)\r
2865                         {\r
2866                                 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));\r
2867                                 /* Recalculate hitpoints */\r
2868                                 p_ptr->update |= (PU_HP);\r
2869                         }\r
2870                 }\r
2871 \r
2872                 break;\r
2873 \r
2874         case 8:\r
2875                 if (name) return _("霊的知覚", "Clairaudience");\r
2876                 if (desc) return _("近くの罠/扉/階段を感知する。レベル15で全てのモンスター、20で財宝とアイテムを感知できるようになる。レベル25で周辺の地形を感知し、40でその階全体を永久に照らし、ダンジョン内のすべてのアイテムを感知する。この効果は歌い続けることで順に起こる。", \r
2877                         "Detects traps, doors and stairs in your vicinity. And detects all monsters at level 15, treasures and items at level 20. Maps nearby area at level 25. Lights and know the whole level at level 40. These effects occurs by turns while this song continues.");\r
2878     \r
2879                 /* Stop singing before start another */\r
2880                 if (cast || fail) stop_singing();\r
2881 \r
2882                 if (cast)\r
2883                 {\r
2884                         msg_print(_("静かな音楽が感覚を研ぎ澄まさせた...", "Your quiet music sharpens your sense of hearing..."));\r
2885                         /* Hack -- Initialize the turn count */\r
2886                         SINGING_COUNT(p_ptr) = 0;\r
2887                         start_singing(spell, MUSIC_DETECT);\r
2888                 }\r
2889 \r
2890                 {\r
2891                         int rad = DETECT_RAD_DEFAULT;\r
2892 \r
2893                         if (info) return info_radius(rad);\r
2894 \r
2895                         if (cont)\r
2896                         {\r
2897                                 int count = SINGING_COUNT(p_ptr);\r
2898 \r
2899                                 if (count >= 19) wiz_lite(FALSE);\r
2900                                 if (count >= 11)\r
2901                                 {\r
2902                                         map_area(rad);\r
2903                                         if (plev > 39 && count < 19)\r
2904                                                 SINGING_COUNT(p_ptr) = count + 1;\r
2905                                 }\r
2906                                 if (count >= 6)\r
2907                                 {\r
2908                                         /* There are too many hidden treasure.  So... */\r
2909                                         /* detect_treasure(rad); */\r
2910                                         detect_objects_gold(rad);\r
2911                                         detect_objects_normal(rad);\r
2912 \r
2913                                         if (plev > 24 && count < 11)\r
2914                                                 SINGING_COUNT(p_ptr) = count + 1;\r
2915                                 }\r
2916                                 if (count >= 3)\r
2917                                 {\r
2918                                         detect_monsters_invis(rad);\r
2919                                         detect_monsters_normal(rad);\r
2920 \r
2921                                         if (plev > 19 && count < 6)\r
2922                                                 SINGING_COUNT(p_ptr) = count + 1;\r
2923                                 }\r
2924                                 detect_traps(rad, TRUE);\r
2925                                 detect_doors(rad);\r
2926                                 detect_stairs(rad);\r
2927 \r
2928                                 if (plev > 14 && count < 3)\r
2929                                         SINGING_COUNT(p_ptr) = count + 1;\r
2930                         }\r
2931                 }\r
2932 \r
2933                 break;\r
2934 \r
2935         case 9:\r
2936                 if (name) return _("魂の歌", "Soul Shriek");\r
2937                 if (desc) return _("視界内の全てのモンスターに対して精神攻撃を行う。", "Damages all monsters in sight with PSI damages.");\r
2938 \r
2939                 /* Stop singing before start another */\r
2940                 if (cast || fail) stop_singing();\r
2941 \r
2942                 if (cast)\r
2943                 {\r
2944                         msg_print(_("精神を捻じ曲げる歌を歌った...", "You start singing a song of soul in pain..."));\r
2945                         start_singing(spell, MUSIC_PSI);\r
2946                 }\r
2947 \r
2948                 {\r
2949                         int dice = 1;\r
2950                         int sides = plev * 3 / 2;\r
2951 \r
2952                         if (info) return info_damage(dice, sides, 0);\r
2953 \r
2954                         if (cont)\r
2955                         {\r
2956                                 project_hack(GF_PSI, damroll(dice, sides));\r
2957                         }\r
2958                 }\r
2959 \r
2960                 break;\r
2961 \r
2962         case 10:\r
2963                 if (name) return _("知識の歌", "Song of Lore");\r
2964                 if (desc) return _("自分のいるマスと隣りのマスに落ちているアイテムを鑑定する。", "Identifies all items which are in the adjacent squares.");\r
2965     \r
2966                 /* Stop singing before start another */\r
2967                 if (cast || fail) stop_singing();\r
2968 \r
2969                 if (cast)\r
2970                 {\r
2971                         msg_print(_("この世界の知識が流れ込んできた...", "You recall the rich lore of the world..."));\r
2972                         start_singing(spell, MUSIC_ID);\r
2973                 }\r
2974 \r
2975                 {\r
2976                         int rad = 1;\r
2977 \r
2978                         if (info) return info_radius(rad);\r
2979 \r
2980                         /*\r
2981                          * 歌の開始時にも効果発動:\r
2982                          * MP不足で鑑定が発動される前に歌が中断してしまうのを防止。\r
2983                          */\r
2984                         if (cont || cast)\r
2985                         {\r
2986                                 project(0, rad, p_ptr->y, p_ptr->x, 0, GF_IDENTIFY, PROJECT_ITEM, -1);\r
2987                         }\r
2988                 }\r
2989 \r
2990                 break;\r
2991 \r
2992         case 11:\r
2993                 if (name) return _("隠遁の歌", "Hiding Tune");\r
2994                 if (desc) return _("隠密行動能力を上昇させる。", "Gives improved stealth.");\r
2995 \r
2996                 /* Stop singing before start another */\r
2997                 if (cast || fail) stop_singing();\r
2998 \r
2999                 if (cast)\r
3000                 {\r
3001                         msg_print(_("あなたの姿が景色にとけこんでいった...", "Your song carries you beyond the sight of mortal eyes..."));\r
3002                         start_singing(spell, MUSIC_STEALTH);\r
3003                 }\r
3004 \r
3005                 if (stop)\r
3006                 {\r
3007                         if (!p_ptr->tim_stealth)\r
3008                         {\r
3009                                 msg_print(_("姿がはっきりと見えるようになった。", "You are no longer hided."));\r
3010                         }\r
3011                 }\r
3012 \r
3013                 break;\r
3014 \r
3015         case 12:\r
3016                 if (name) return _("幻影の旋律", "Illusion Pattern");\r
3017                 if (desc) return _("視界内の全てのモンスターを混乱させる。抵抗されると無効。", "Attempts to confuse all monsters in sight.");\r
3018     \r
3019                 /* Stop singing before start another */\r
3020                 if (cast || fail) stop_singing();\r
3021 \r
3022                 if (cast)\r
3023                 {\r
3024                         msg_print(_("辺り一面に幻影が現れた...", "You weave a pattern of sounds to beguile and confuse..."));\r
3025                         start_singing(spell, MUSIC_CONF);\r
3026                 }\r
3027 \r
3028                 {\r
3029                         int power = plev * 2;\r
3030 \r
3031                         if (info) return info_power(power);\r
3032 \r
3033                         if (cont)\r
3034                         {\r
3035                                 confuse_monsters(power);\r
3036                         }\r
3037                 }\r
3038 \r
3039                 break;\r
3040 \r
3041         case 13:\r
3042                 if (name) return _("破滅の叫び", "Doomcall");\r
3043                 if (desc) return _("視界内の全てのモンスターに対して轟音攻撃を行う。", "Damages all monsters in sight with booming sound.");\r
3044     \r
3045                 /* Stop singing before start another */\r
3046                 if (cast || fail) stop_singing();\r
3047 \r
3048                 if (cast)\r
3049                 {\r
3050                         msg_print(_("轟音が響いた...", "The fury of the Downfall of Numenor lashes out..."));\r
3051                         start_singing(spell, MUSIC_SOUND);\r
3052                 }\r
3053 \r
3054                 {\r
3055                         int dice = 10 + plev / 5;\r
3056                         int sides = 7;\r
3057 \r
3058                         if (info) return info_damage(dice, sides, 0);\r
3059 \r
3060                         if (cont)\r
3061                         {\r
3062                                 project_hack(GF_SOUND, damroll(dice, sides));\r
3063                         }\r
3064                 }\r
3065 \r
3066                 break;\r
3067 \r
3068         case 14:\r
3069                 if (name) return _("フィリエルの歌", "Firiel's Song");\r
3070                 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");\r
3071     \r
3072                 {\r
3073                         /* Stop singing before start another */\r
3074                         if (cast || fail) stop_singing();\r
3075 \r
3076                         if (cast)\r
3077                         {\r
3078                                 msg_print(_("生命と復活のテーマを奏で始めた...", "The themes of life and revival are woven into your song..."));\r
3079                                 animate_dead(0, p_ptr->y, p_ptr->x);\r
3080                         }\r
3081                 }\r
3082                 break;\r
3083 \r
3084         case 15:\r
3085                 if (name) return _("旅の仲間", "Fellowship Chant");\r
3086                 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");\r
3087 \r
3088                 /* Stop singing before start another */\r
3089                 if (cast || fail) stop_singing();\r
3090 \r
3091                 if (cast)\r
3092                 {\r
3093                         msg_print(_("安らかなメロディを奏で始めた...", "You weave a slow, soothing melody of imploration..."));\r
3094                         start_singing(spell, MUSIC_CHARM);\r
3095                 }\r
3096 \r
3097                 {\r
3098                         int dice = 10 + plev / 15;\r
3099                         int sides = 6;\r
3100 \r
3101                         if (info) return info_power_dice(dice, sides);\r
3102 \r
3103                         if (cont)\r
3104                         {\r
3105                                 charm_monsters(damroll(dice, sides));\r
3106                         }\r
3107                 }\r
3108 \r
3109                 break;\r
3110 \r
3111         case 16:\r
3112                 if (name) return _("分解音波", "Sound of disintegration");\r
3113                 if (desc) return _("壁を掘り進む。自分の足元のアイテムは蒸発する。", "Makes you be able to burrow into walls. Objects under your feet evaporate.");\r
3114 \r
3115                 /* Stop singing before start another */\r
3116                 if (cast || fail) stop_singing();\r
3117 \r
3118                 if (cast)\r
3119                 {\r
3120                         msg_print(_("粉砕するメロディを奏で始めた...", "You weave a violent pattern of sounds to break wall."));\r
3121                         start_singing(spell, MUSIC_WALL);\r
3122                 }\r
3123 \r
3124                 {\r
3125                         /*\r
3126                          * 歌の開始時にも効果発動:\r
3127                          * MP不足で効果が発動される前に歌が中断してしまうのを防止。\r
3128                          */\r
3129                         if (cont || cast)\r
3130                         {\r
3131                                 project(0, 0, p_ptr->y, p_ptr->x,\r
3132                                         0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1);\r
3133                         }\r
3134                 }\r
3135                 break;\r
3136 \r
3137         case 17:\r
3138                 if (name) return _("元素耐性", "Finrod's Resistance");\r
3139                 if (desc) return _("酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。", \r
3140                         "Gives resistance to fire, cold, electricity, acid and poison. These resistances can be added to which from equipment for more powerful resistances.");\r
3141     \r
3142                 /* Stop singing before start another */\r
3143                 if (cast || fail) stop_singing();\r
3144 \r
3145                 if (cast)\r
3146                 {\r
3147                         msg_print(_("元素の力に対する忍耐の歌を歌った。", "You sing a song of perseverance against powers..."));\r
3148                         start_singing(spell, MUSIC_RESIST);\r
3149                 }\r
3150 \r
3151                 if (stop)\r
3152                 {\r
3153                         if (!p_ptr->oppose_acid)\r
3154                         {\r
3155                                 msg_print(_("酸への耐性が薄れた気がする。", "You feel less resistant to acid."));\r
3156                         }\r
3157 \r
3158                         if (!p_ptr->oppose_elec)\r
3159                         {\r
3160                                 msg_print(_("電撃への耐性が薄れた気がする。", "You feel less resistant to elec."));\r
3161                         }\r
3162 \r
3163                         if (!p_ptr->oppose_fire)\r
3164                         {\r
3165                                 msg_print(_("火への耐性が薄れた気がする。", "You feel less resistant to fire."));\r
3166                         }\r
3167 \r
3168                         if (!p_ptr->oppose_cold)\r
3169                         {\r
3170                                 msg_print(_("冷気への耐性が薄れた気がする。", "You feel less resistant to cold."));\r
3171                         }\r
3172 \r
3173                         if (!p_ptr->oppose_pois)\r
3174                         {\r
3175                                 msg_print(_("毒への耐性が薄れた気がする。", "You feel less resistant to pois."));\r
3176                         }\r
3177                 }\r
3178 \r
3179                 break;\r
3180 \r
3181         case 18:\r
3182                 if (name) return _("ホビットのメロディ", "Hobbit Melodies");\r
3183                 if (desc) return _("加速する。", "Hastes you.");\r
3184 \r
3185                 /* Stop singing before start another */\r
3186                 if (cast || fail) stop_singing();\r
3187 \r
3188                 if (cast)\r
3189                 {\r
3190                         msg_print(_("軽快な歌を口ずさみ始めた...", "You start singing joyful pop song..."));\r
3191                         start_singing(spell, MUSIC_SPEED);\r
3192                 }\r
3193 \r
3194                 if (stop)\r
3195                 {\r
3196                         if (!p_ptr->fast)\r
3197                         {\r
3198                                 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));\r
3199                         }\r
3200                 }\r
3201 \r
3202                 break;\r
3203 \r
3204         case 19:\r
3205                 if (name) return _("歪んだ世界", "World Contortion");\r
3206                 if (desc) return _("近くのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all nearby monsters away unless resisted.");\r
3207     \r
3208                 {\r
3209                         int rad = plev / 15 + 1;\r
3210                         int power = plev * 3 + 1;\r
3211 \r
3212                         if (info) return info_radius(rad);\r
3213 \r
3214                         /* Stop singing before start another */\r
3215                         if (cast || fail) stop_singing();\r
3216 \r
3217                         if (cast)\r
3218                         {\r
3219                                 msg_print(_("歌が空間を歪めた...", "Reality whirls wildly as you sing a dizzying melody..."));\r
3220                                 project(0, rad, p_ptr->y, p_ptr->x, power, GF_AWAY_ALL, PROJECT_KILL, -1);\r
3221                         }\r
3222                 }\r
3223                 break;\r
3224 \r
3225         case 20:\r
3226                 if (name) return _("退散の歌", "Dispelling chant");\r
3227                 if (desc) return _("視界内の全てのモンスターにダメージを与える。邪悪なモンスターに特に大きなダメージを与える。", \r
3228                         "Damages all monsters in sight. Hurts evil monsters greatly.");\r
3229     \r
3230                 /* Stop singing before start another */\r
3231                 if (cast || fail) stop_singing();\r
3232 \r
3233                 if (cast)\r
3234                 {\r
3235                         msg_print(_("耐えられない不協和音が敵を責め立てた...", "You cry out in an ear-wracking voice..."));\r
3236                         start_singing(spell, MUSIC_DISPEL);\r
3237                 }\r
3238 \r
3239                 {\r
3240                         int m_sides = plev * 3;\r
3241                         int e_sides = plev * 3;\r
3242 \r
3243                         if (info) return format("%s1d%d+1d%d", s_dam, m_sides, e_sides);\r
3244 \r
3245                         if (cont)\r
3246                         {\r
3247                                 dispel_monsters(randint1(m_sides));\r
3248                                 dispel_evil(randint1(e_sides));\r
3249                         }\r
3250                 }\r
3251                 break;\r
3252 \r
3253         case 21:\r
3254                 if (name) return _("サルマンの甘言", "The Voice of Saruman");\r
3255                 if (desc) return _("視界内の全てのモンスターを減速させ、眠らせようとする。抵抗されると無効。", "Attempts to slow and sleep all monsters in sight.");\r
3256     \r
3257                 /* Stop singing before start another */\r
3258                 if (cast || fail) stop_singing();\r
3259 \r
3260                 if (cast)\r
3261                 {\r
3262                         msg_print(_("優しく、魅力的な歌を口ずさみ始めた...", "You start humming a gentle and attractive song..."));\r
3263                         start_singing(spell, MUSIC_SARUMAN);\r
3264                 }\r
3265 \r
3266                 {\r
3267                         int power = plev;\r
3268 \r
3269                         if (info) return info_power(power);\r
3270 \r
3271                         if (cont)\r
3272                         {\r
3273                                 slow_monsters(plev);\r
3274                                 sleep_monsters(plev);\r
3275                         }\r
3276                 }\r
3277 \r
3278                 break;\r
3279 \r
3280         case 22:\r
3281                 if (name) return _("嵐の音色", "Song of the Tempest");\r
3282                 if (desc) return _("轟音のビームを放つ。", "Fires a beam of sound.");\r
3283     \r
3284                 {\r
3285                         int dice = 15 + (plev - 1) / 2;\r
3286                         int sides = 10;\r
3287 \r
3288                         if (info) return info_damage(dice, sides, 0);\r
3289 \r
3290                         /* Stop singing before start another */\r
3291                         if (cast || fail) stop_singing();\r
3292 \r
3293                         if (cast)\r
3294                         {\r
3295                                 if (!get_aim_dir(&dir)) return NULL;\r
3296 \r
3297                                 fire_beam(GF_SOUND, dir, damroll(dice, sides));\r
3298                         }\r
3299                 }\r
3300                 break;\r
3301 \r
3302         case 23:\r
3303                 if (name) return _("もう一つの世界", "Ambarkanta");\r
3304                 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");\r
3305     \r
3306                 {\r
3307                         int base = 15;\r
3308                         int sides = 20;\r
3309 \r
3310                         if (info) return info_delay(base, sides);\r
3311 \r
3312                         /* Stop singing before start another */\r
3313                         if (cast || fail) stop_singing();\r
3314 \r
3315                         if (cast)\r
3316                         {\r
3317                                 msg_print(_("周囲が変化し始めた...", "You sing of the primeval shaping of Middle-earth..."));\r
3318                                 alter_reality();\r
3319                         }\r
3320                 }\r
3321                 break;\r
3322 \r
3323         case 24:\r
3324                 if (name) return _("破壊の旋律", "Wrecking Pattern");\r
3325                 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。", \r
3326                         "Shakes dungeon structure, and results in random swapping of floors and walls.");\r
3327 \r
3328                 /* Stop singing before start another */\r
3329                 if (cast || fail) stop_singing();\r
3330 \r
3331                 if (cast)\r
3332                 {\r
3333                         msg_print(_("破壊的な歌が響きわたった...", "You weave a pattern of sounds to contort and shatter..."));\r
3334                         start_singing(spell, MUSIC_QUAKE);\r
3335                 }\r
3336 \r
3337                 {\r
3338                         int rad = 10;\r
3339 \r
3340                         if (info) return info_radius(rad);\r
3341 \r
3342                         if (cont)\r
3343                         {\r
3344                                 earthquake(p_ptr->y, p_ptr->x, 10);\r
3345                         }\r
3346                 }\r
3347 \r
3348                 break;\r
3349 \r
3350 \r
3351         case 25:\r
3352                 if (name) return _("停滞の歌", "Stationary Shriek");\r
3353                 if (desc) return _("視界内の全てのモンスターを麻痺させようとする。抵抗されると無効。", "Attempts to freeze all monsters in sight.");\r
3354     \r
3355                 /* Stop singing before start another */\r
3356                 if (cast || fail) stop_singing();\r
3357 \r
3358                 if (cast)\r
3359                 {\r
3360                         msg_print(_("ゆっくりとしたメロディを奏で始めた...", "You weave a very slow pattern which is almost likely to stop..."));\r
3361                         start_singing(spell, MUSIC_STASIS);\r
3362                 }\r
3363 \r
3364                 {\r
3365                         int power = plev * 4;\r
3366 \r
3367                         if (info) return info_power(power);\r
3368 \r
3369                         if (cont)\r
3370                         {\r
3371                                 stasis_monsters(power);\r
3372                         }\r
3373                 }\r
3374 \r
3375                 break;\r
3376 \r
3377         case 26:\r
3378                 if (name) return _("守りの歌", "Endurance");\r
3379                 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。", \r
3380                         "Sets a glyph on the floor beneath you. Monsters cannot attack you if you are on a glyph, but can try to break glyph.");\r
3381     \r
3382                 {\r
3383                         /* Stop singing before start another */\r
3384                         if (cast || fail) stop_singing();\r
3385 \r
3386                         if (cast)\r
3387                         {\r
3388                                 msg_print(_("歌が神聖な場を作り出した...", "The holy power of the Music is creating sacred field..."));\r
3389                                 warding_glyph();\r
3390                         }\r
3391                 }\r
3392                 break;\r
3393 \r
3394         case 27:\r
3395                 if (name) return _("英雄の詩", "The Hero's Poem");\r
3396                 if (desc) return _("加速し、ヒーロー気分になり、視界内の全てのモンスターにダメージを与える。", \r
3397                         "Hastes you. Gives heroism. Damages all monsters in sight.");\r
3398     \r
3399                 /* Stop singing before start another */\r
3400                 if (cast || fail) stop_singing();\r
3401 \r
3402                 if (cast)\r
3403                 {\r
3404                         msg_print(_("英雄の歌を口ずさんだ...", "You chant a powerful, heroic call to arms..."));\r
3405                         (void)hp_player(10);\r
3406                         (void)set_afraid(0);\r
3407 \r
3408                         /* Recalculate hitpoints */\r
3409                         p_ptr->update |= (PU_HP);\r
3410 \r
3411                         start_singing(spell, MUSIC_SHERO);\r
3412                 }\r
3413 \r
3414                 if (stop)\r
3415                 {\r
3416                         if (!p_ptr->hero)\r
3417                         {\r
3418                                 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));\r
3419                                 /* Recalculate hitpoints */\r
3420                                 p_ptr->update |= (PU_HP);\r
3421                         }\r
3422 \r
3423                         if (!p_ptr->fast)\r
3424                         {\r
3425                                 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));\r
3426                         }\r
3427                 }\r
3428 \r
3429                 {\r
3430                         int dice = 1;\r
3431                         int sides = plev * 3;\r
3432 \r
3433                         if (info) return info_damage(dice, sides, 0);\r
3434 \r
3435                         if (cont)\r
3436                         {\r
3437                                 dispel_monsters(damroll(dice, sides));\r
3438                         }\r
3439                 }\r
3440                 break;\r
3441 \r
3442         case 28:\r
3443                 if (name) return _("ヤヴァンナの助け", "Relief of Yavanna");\r
3444                 if (desc) return _("強力な回復の歌で、負傷と朦朧状態も全快する。", "Powerful healing song. Also heals cut and stun completely.");\r
3445     \r
3446                 /* Stop singing before start another */\r
3447                 if (cast || fail) stop_singing();\r
3448 \r
3449                 if (cast)\r
3450                 {\r
3451                         msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing the song..."));\r
3452                         start_singing(spell, MUSIC_H_LIFE);\r
3453                 }\r
3454 \r
3455                 {\r
3456                         int dice = 15;\r
3457                         int sides = 10;\r
3458 \r
3459                         if (info) return info_heal(dice, sides, 0);\r
3460 \r
3461                         if (cont)\r
3462                         {\r
3463                                 hp_player(damroll(dice, sides));\r
3464                                 set_stun(0);\r
3465                                 set_cut(0);\r
3466                         }\r
3467                 }\r
3468 \r
3469                 break;\r
3470 \r
3471         case 29:\r
3472                 if (name) return _("再生の歌", "Goddess' rebirth");\r
3473                 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");\r
3474     \r
3475                 {\r
3476                         /* Stop singing before start another */\r
3477                         if (cast || fail) stop_singing();\r
3478 \r
3479                         if (cast)\r
3480                         {\r
3481                                 msg_print(_("暗黒の中に光と美をふりまいた。体が元の活力を取り戻した。",\r
3482                                                         "You strewed light and beauty in the dark as you sing. You feel refreshed."));\r
3483                                 (void)do_res_stat(A_STR);\r
3484                                 (void)do_res_stat(A_INT);\r
3485                                 (void)do_res_stat(A_WIS);\r
3486                                 (void)do_res_stat(A_DEX);\r
3487                                 (void)do_res_stat(A_CON);\r
3488                                 (void)do_res_stat(A_CHR);\r
3489                                 (void)restore_level();\r
3490                         }\r
3491                 }\r
3492                 break;\r
3493 \r
3494         case 30:\r
3495                 if (name) return _("サウロンの魔術", "Wizardry of Sauron");\r
3496                 if (desc) return _("非常に強力でごく小さい轟音の球を放つ。", "Fires an extremely powerful tiny ball of sound.");\r
3497     \r
3498                 {\r
3499                         int dice = 50 + plev;\r
3500                         int sides = 10;\r
3501                         int rad = 0;\r
3502 \r
3503                         if (info) return info_damage(dice, sides, 0);\r
3504 \r
3505                         /* Stop singing before start another */\r
3506                         if (cast || fail) stop_singing();\r
3507 \r
3508                         if (cast)\r
3509                         {\r
3510                                 if (!get_aim_dir(&dir)) return NULL;\r
3511 \r
3512                                 fire_ball(GF_SOUND, dir, damroll(dice, sides), rad);\r
3513                         }\r
3514                 }\r
3515                 break;\r
3516 \r
3517         case 31:\r
3518                 if (name) return _("フィンゴルフィンの挑戦", "Fingolfin's Challenge");\r
3519                 if (desc) return _("ダメージを受けなくなるバリアを張る。", \r
3520                         "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks.");\r
3521     \r
3522                 /* Stop singing before start another */\r
3523                 if (cast || fail) stop_singing();\r
3524 \r
3525                 if (cast)\r
3526                 {\r
3527                         msg_print(_("フィンゴルフィンの冥王への挑戦を歌った...",\r
3528                                                 "You recall the valor of Fingolfin's challenge to the Dark Lord..."));\r
3529 \r
3530                         /* Redraw map */\r
3531                         p_ptr->redraw |= (PR_MAP);\r
3532                 \r
3533                         /* Update monsters */\r
3534                         p_ptr->update |= (PU_MONSTERS);\r
3535                 \r
3536                         /* Window stuff */\r
3537                         p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);\r
3538 \r
3539                         start_singing(spell, MUSIC_INVULN);\r
3540                 }\r
3541 \r
3542                 if (stop)\r
3543                 {\r
3544                         if (!p_ptr->invuln)\r
3545                         {\r
3546                                 msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));\r
3547                                 /* Redraw map */\r
3548                                 p_ptr->redraw |= (PR_MAP);\r
3549 \r
3550                                 /* Update monsters */\r
3551                                 p_ptr->update |= (PU_MONSTERS);\r
3552 \r
3553                                 /* Window stuff */\r
3554                                 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);\r
3555                         }\r
3556                 }\r
3557 \r
3558                 break;\r
3559         }\r
3560 \r
3561         return "";\r
3562 }\r
3563 \r
3564 /*!\r
3565  * @brief 剣術の各処理を行う\r
3566  * @param spell 剣術ID\r
3567  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_CAST)\r
3568  * @return SPELL_NAME / SPELL_DESC 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。\r
3569  */\r
3570 static cptr do_hissatsu_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
3571 {\r
3572         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
3573         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
3574         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
3575 \r
3576         int dir;\r
3577         int plev = p_ptr->lev;\r
3578 \r
3579         switch (spell)\r
3580         {\r
3581         case 0:\r
3582                 if (name) return _("飛飯綱", "Tobi-Izuna");\r
3583                 if (desc) return _("2マス離れたところにいるモンスターを攻撃する。", "Attacks a two squares distant monster.");\r
3584     \r
3585                 if (cast)\r
3586                 {\r
3587                         project_length = 2;\r
3588                         if (!get_aim_dir(&dir)) return NULL;\r
3589 \r
3590                         project_hook(GF_ATTACK, dir, HISSATSU_2, PROJECT_STOP | PROJECT_KILL);\r
3591                 }\r
3592                 break;\r
3593 \r
3594         case 1:\r
3595                 if (name) return _("五月雨斬り", "3-Way Attack");\r
3596                 if (desc) return _("3方向に対して攻撃する。", "Attacks in 3 directions in one time.");\r
3597     \r
3598                 if (cast)\r
3599                 {\r
3600                         int cdir;\r
3601                         int y, x;\r
3602 \r
3603                         if (!get_rep_dir2(&dir)) return NULL;\r
3604                         if (dir == 5) return NULL;\r
3605 \r
3606                         for (cdir = 0;cdir < 8; cdir++)\r
3607                         {\r
3608                                 if (cdd[cdir] == dir) break;\r
3609                         }\r
3610 \r
3611                         if (cdir == 8) return NULL;\r
3612 \r
3613                         y = p_ptr->y + ddy_cdd[cdir];\r
3614                         x = p_ptr->x + ddx_cdd[cdir];\r
3615                         if (cave[y][x].m_idx)\r
3616                                 py_attack(y, x, 0);\r
3617                         else\r
3618                                 msg_print(_("攻撃は空を切った。", "You attack the empty air."));\r
3619                         \r
3620                         y = p_ptr->y + ddy_cdd[(cdir + 7) % 8];\r
3621                         x = p_ptr->x + ddx_cdd[(cdir + 7) % 8];\r
3622                         if (cave[y][x].m_idx)\r
3623                                 py_attack(y, x, 0);\r
3624                         else\r
3625                                 msg_print(_("攻撃は空を切った。", "You attack the empty air."));\r
3626                         \r
3627                         y = p_ptr->y + ddy_cdd[(cdir + 1) % 8];\r
3628                         x = p_ptr->x + ddx_cdd[(cdir + 1) % 8];\r
3629                         if (cave[y][x].m_idx)\r
3630                                 py_attack(y, x, 0);\r
3631                         else\r
3632                                 msg_print(_("攻撃は空を切った。", "You attack the empty air."));\r
3633                 }\r
3634                 break;\r
3635 \r
3636         case 2:\r
3637                 if (name) return _("ブーメラン", "Boomerang");\r
3638                 if (desc) return _("武器を手元に戻ってくるように投げる。戻ってこないこともある。", \r
3639                         "Throws current weapon. And it'll return to your hand unless failed.");\r
3640     \r
3641                 if (cast)\r
3642                 {\r
3643                         if (!do_cmd_throw(1, TRUE, -1)) return NULL;\r
3644                 }\r
3645                 break;\r
3646 \r
3647         case 3:\r
3648                 if (name) return _("焔霊", "Burning Strike");\r
3649                 if (desc) return _("火炎耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to fire.");\r
3650     \r
3651                 if (cast)\r
3652                 {\r
3653                         int y, x;\r
3654 \r
3655                         if (!get_rep_dir2(&dir)) return NULL;\r
3656                         if (dir == 5) return NULL;\r
3657 \r
3658                         y = p_ptr->y + ddy[dir];\r
3659                         x = p_ptr->x + ddx[dir];\r
3660 \r
3661                         if (cave[y][x].m_idx)\r
3662                                 py_attack(y, x, HISSATSU_FIRE);\r
3663                         else\r
3664                         {\r
3665                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
3666                                 return NULL;\r
3667                         }\r
3668                 }\r
3669                 break;\r
3670 \r
3671         case 4:\r
3672                 if (name) return _("殺気感知", "Detect Ferocity");\r
3673                 if (desc) return _("近くの思考することができるモンスターを感知する。", "Detects all monsters except mindless in your vicinity.");\r
3674     \r
3675                 if (cast)\r
3676                 {\r
3677                         detect_monsters_mind(DETECT_RAD_DEFAULT);\r
3678                 }\r
3679                 break;\r
3680 \r
3681         case 5:\r
3682                 if (name) return _("みね打ち", "Strike to Stun");\r
3683                 if (desc) return _("相手にダメージを与えないが、朦朧とさせる。", "Attempts to stun a monster in the adjacent.");\r
3684     \r
3685                 if (cast)\r
3686                 {\r
3687                         int y, x;\r
3688 \r
3689                         if (!get_rep_dir2(&dir)) return NULL;\r
3690                         if (dir == 5) return NULL;\r
3691 \r
3692                         y = p_ptr->y + ddy[dir];\r
3693                         x = p_ptr->x + ddx[dir];\r
3694 \r
3695                         if (cave[y][x].m_idx)\r
3696                                 py_attack(y, x, HISSATSU_MINEUCHI);\r
3697                         else\r
3698                         {\r
3699                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
3700                                 return NULL;\r
3701                         }\r
3702                 }\r
3703                 break;\r
3704 \r
3705         case 6:\r
3706                 if (name) return _("カウンター", "Counter");\r
3707                 if (desc) return _("相手に攻撃されたときに反撃する。反撃するたびにMPを消費。", \r
3708                         "Prepares to counterattack. When attack by a monster, strikes back using SP each time.");\r
3709     \r
3710                 if (cast)\r
3711                 {\r
3712                         if (p_ptr->riding)\r
3713                         {\r
3714                                 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));\r
3715                                 return NULL;\r
3716                         }\r
3717                         msg_print(_("相手の攻撃に対して身構えた。", "You prepare to counter blow."));\r
3718                         p_ptr->counter = TRUE;\r
3719                 }\r
3720                 break;\r
3721 \r
3722         case 7:\r
3723                 if (name) return _("払い抜け", "Harainuke");\r
3724                 if (desc) return _("攻撃した後、反対側に抜ける。", \r
3725                         "Attacks monster with your weapons normally, then move through counter side of the monster.");\r
3726     \r
3727                 if (cast)\r
3728                 {\r
3729                         POSITION y, x;\r
3730 \r
3731                         if (p_ptr->riding)\r
3732                         {\r
3733                                 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));\r
3734                                 return NULL;\r
3735                         }\r
3736         \r
3737                         if (!get_rep_dir2(&dir)) return NULL;\r
3738         \r
3739                         if (dir == 5) return NULL;\r
3740                         y = p_ptr->y + ddy[dir];\r
3741                         x = p_ptr->x + ddx[dir];\r
3742         \r
3743                         if (!cave[y][x].m_idx)\r
3744                         {\r
3745                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
3746                                 return NULL;\r
3747                         }\r
3748         \r
3749                         py_attack(y, x, 0);\r
3750         \r
3751                         if (!player_can_enter(cave[y][x].feat, 0) || is_trap(cave[y][x].feat))\r
3752                                 break;\r
3753         \r
3754                         y += ddy[dir];\r
3755                         x += ddx[dir];\r
3756         \r
3757                         if (player_can_enter(cave[y][x].feat, 0) && !is_trap(cave[y][x].feat) && !cave[y][x].m_idx)\r
3758                         {\r
3759                                 msg_print(NULL);\r
3760         \r
3761                                 /* Move the player */\r
3762                                 (void)move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);\r
3763                         }\r
3764                 }\r
3765                 break;\r
3766 \r
3767         case 8:\r
3768                 if (name) return _("サーペンツタン", "Serpent's Tongue");\r
3769                 if (desc) return _("毒耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to poison.");\r
3770     \r
3771                 if (cast)\r
3772                 {\r
3773                         int y, x;\r
3774 \r
3775                         if (!get_rep_dir2(&dir)) return NULL;\r
3776                         if (dir == 5) return NULL;\r
3777 \r
3778                         y = p_ptr->y + ddy[dir];\r
3779                         x = p_ptr->x + ddx[dir];\r
3780 \r
3781                         if (cave[y][x].m_idx)\r
3782                                 py_attack(y, x, HISSATSU_POISON);\r
3783                         else\r
3784                         {\r
3785                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
3786                                 return NULL;\r
3787                         }\r
3788                 }\r
3789                 break;\r
3790 \r
3791         case 9:\r
3792                 if (name) return _("斬魔剣弐の太刀", "Zammaken");\r
3793                 if (desc) return _("生命のない邪悪なモンスターに大ダメージを与えるが、他のモンスターには全く効果がない。", \r
3794                         "Attacks an evil unliving monster with great damage. No effect to other  monsters.");\r
3795     \r
3796                 if (cast)\r
3797                 {\r
3798                         int y, x;\r
3799 \r
3800                         if (!get_rep_dir2(&dir)) return NULL;\r
3801                         if (dir == 5) return NULL;\r
3802 \r
3803                         y = p_ptr->y + ddy[dir];\r
3804                         x = p_ptr->x + ddx[dir];\r
3805 \r
3806                         if (cave[y][x].m_idx)\r
3807                                 py_attack(y, x, HISSATSU_ZANMA);\r
3808                         else\r
3809                         {\r
3810                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
3811                                 return NULL;\r
3812                         }\r
3813                 }\r
3814                 break;\r
3815 \r
3816         case 10:\r
3817                 if (name) return _("裂風剣", "Wind Blast");\r
3818                 if (desc) return _("攻撃した相手を後方へ吹き飛ばす。", "Attacks an adjacent monster, and blow it away.");\r
3819     \r
3820                 if (cast)\r
3821                 {\r
3822                         int y, x;\r
3823 \r
3824                         if (!get_rep_dir2(&dir)) return NULL;\r
3825                         if (dir == 5) return NULL;\r
3826 \r
3827                         y = p_ptr->y + ddy[dir];\r
3828                         x = p_ptr->x + ddx[dir];\r
3829 \r
3830                         if (cave[y][x].m_idx)\r
3831                                 py_attack(y, x, 0);\r
3832                         else\r
3833                         {\r
3834                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
3835                                 return NULL;\r
3836                         }\r
3837                         if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)\r
3838                         {\r
3839                                 return "";\r
3840                         }\r
3841                         if (cave[y][x].m_idx)\r
3842                         {\r
3843                                 int i;\r
3844                                 POSITION ty = y, tx = x;\r
3845                                 POSITION oy = y, ox = x;\r
3846                                 MONSTER_IDX m_idx = cave[y][x].m_idx;\r
3847                                 monster_type *m_ptr = &m_list[m_idx];\r
3848                                 char m_name[80];\r
3849         \r
3850                                 monster_desc(m_name, m_ptr, 0);\r
3851         \r
3852                                 for (i = 0; i < 5; i++)\r
3853                                 {\r
3854                                         y += ddy[dir];\r
3855                                         x += ddx[dir];\r
3856                                         if (cave_empty_bold(y, x))\r
3857                                         {\r
3858                                                 ty = y;\r
3859                                                 tx = x;\r
3860                                         }\r
3861                                         else break;\r
3862                                 }\r
3863                                 if ((ty != oy) || (tx != ox))\r
3864                                 {\r
3865                                         msg_format(_("%sを吹き飛ばした!", "You blow %s away!"), m_name);\r
3866                                         cave[oy][ox].m_idx = 0;\r
3867                                         cave[ty][tx].m_idx = m_idx;\r
3868                                         m_ptr->fy = ty;\r
3869                                         m_ptr->fx = tx;\r
3870         \r
3871                                         update_mon(m_idx, TRUE);\r
3872                                         lite_spot(oy, ox);\r
3873                                         lite_spot(ty, tx);\r
3874         \r
3875                                         if (r_info[m_ptr->r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))\r
3876                                                 p_ptr->update |= (PU_MON_LITE);\r
3877                                 }\r
3878                         }\r
3879                 }\r
3880                 break;\r
3881 \r
3882         case 11:\r
3883                 if (name) return _("刀匠の目利き", "Judge");\r
3884                 if (desc) return _("武器・防具を1つ識別する。レベル45以上で武器・防具の能力を完全に知ることができる。", \r
3885                         "Identifies a weapon or armor. Or *identifies* these at level 45.");\r
3886     \r
3887                 if (cast)\r
3888                 {\r
3889                         if (plev > 44)\r
3890                         {\r
3891                                 if (!identify_fully(TRUE)) return NULL;\r
3892                         }\r
3893                         else\r
3894                         {\r
3895                                 if (!ident_spell(TRUE)) return NULL;\r
3896                         }\r
3897                 }\r
3898                 break;\r
3899 \r
3900         case 12:\r
3901                 if (name) return _("破岩斬", "Rock Smash");\r
3902                 if (desc) return _("岩を壊し、岩石系のモンスターに大ダメージを与える。", "Breaks rock. Or greatly damage a monster made by rocks.");\r
3903     \r
3904                 if (cast)\r
3905                 {\r
3906                         int y, x;\r
3907 \r
3908                         if (!get_rep_dir2(&dir)) return NULL;\r
3909                         if (dir == 5) return NULL;\r
3910 \r
3911                         y = p_ptr->y + ddy[dir];\r
3912                         x = p_ptr->x + ddx[dir];\r
3913 \r
3914                         if (cave[y][x].m_idx)\r
3915                                 py_attack(y, x, HISSATSU_HAGAN);\r
3916         \r
3917                         if (!cave_have_flag_bold(y, x, FF_HURT_ROCK)) break;\r
3918         \r
3919                         /* Destroy the feature */\r
3920                         cave_alter_feat(y, x, FF_HURT_ROCK);\r
3921         \r
3922                         /* Update some things */\r
3923                         p_ptr->update |= (PU_FLOW);\r
3924                 }\r
3925                 break;\r
3926 \r
3927         case 13:\r
3928                 if (name) return _("乱れ雪月花", "Midare-Setsugekka");\r
3929                 if (desc) return _("攻撃回数が増え、冷気耐性のないモンスターに大ダメージを与える。", \r
3930                         "Attacks a monster with increased number of attacks and more damage unless it has resistance to cold.");\r
3931     \r
3932                 if (cast)\r
3933                 {\r
3934                         int y, x;\r
3935 \r
3936                         if (!get_rep_dir2(&dir)) return NULL;\r
3937                         if (dir == 5) return NULL;\r
3938 \r
3939                         y = p_ptr->y + ddy[dir];\r
3940                         x = p_ptr->x + ddx[dir];\r
3941 \r
3942                         if (cave[y][x].m_idx)\r
3943                                 py_attack(y, x, HISSATSU_COLD);\r
3944                         else\r
3945                         {\r
3946                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
3947                                 return NULL;\r
3948                         }\r
3949                 }\r
3950                 break;\r
3951 \r
3952         case 14:\r
3953                 if (name) return _("急所突き", "Spot Aiming");\r
3954                 if (desc) return _("モンスターを一撃で倒す攻撃を繰り出す。失敗すると1点しかダメージを与えられない。", \r
3955                         "Attempts to kill a monster instantly. If failed cause only 1HP of damage.");\r
3956     \r
3957                 if (cast)\r
3958                 {\r
3959                         int y, x;\r
3960 \r
3961                         if (!get_rep_dir2(&dir)) return NULL;\r
3962                         if (dir == 5) return NULL;\r
3963 \r
3964                         y = p_ptr->y + ddy[dir];\r
3965                         x = p_ptr->x + ddx[dir];\r
3966 \r
3967                         if (cave[y][x].m_idx)\r
3968                                 py_attack(y, x, HISSATSU_KYUSHO);\r
3969                         else\r
3970                         {\r
3971                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
3972                                 return NULL;\r
3973                         }\r
3974                 }\r
3975                 break;\r
3976 \r
3977         case 15:\r
3978                 if (name) return _("魔神斬り", "Majingiri");\r
3979                 if (desc) return _("会心の一撃で攻撃する。攻撃がかわされやすい。", \r
3980                         "Attempts to attack with critical hit. But this attack is easy to evade for a monster.");\r
3981     \r
3982                 if (cast)\r
3983                 {\r
3984                         int y, x;\r
3985 \r
3986                         if (!get_rep_dir2(&dir)) return NULL;\r
3987                         if (dir == 5) return NULL;\r
3988 \r
3989                         y = p_ptr->y + ddy[dir];\r
3990                         x = p_ptr->x + ddx[dir];\r
3991 \r
3992                         if (cave[y][x].m_idx)\r
3993                                 py_attack(y, x, HISSATSU_MAJIN);\r
3994                         else\r
3995                         {\r
3996                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
3997                                 return NULL;\r
3998                         }\r
3999                 }\r
4000                 break;\r
4001 \r
4002         case 16:\r
4003                 if (name) return _("捨て身", "Desperate Attack");\r
4004                 if (desc) return _("強力な攻撃を繰り出す。次のターンまでの間、食らうダメージが増える。", \r
4005                         "Attacks with all of your power. But all damages you take will be doubled for one turn.");\r
4006     \r
4007                 if (cast)\r
4008                 {\r
4009                         int y, x;\r
4010 \r
4011                         if (!get_rep_dir2(&dir)) return NULL;\r
4012                         if (dir == 5) return NULL;\r
4013 \r
4014                         y = p_ptr->y + ddy[dir];\r
4015                         x = p_ptr->x + ddx[dir];\r
4016 \r
4017                         if (cave[y][x].m_idx)\r
4018                                 py_attack(y, x, HISSATSU_SUTEMI);\r
4019                         else\r
4020                         {\r
4021                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
4022                                 return NULL;\r
4023                         }\r
4024                         p_ptr->sutemi = TRUE;\r
4025                 }\r
4026                 break;\r
4027 \r
4028         case 17:\r
4029                 if (name) return _("雷撃鷲爪斬", "Lightning Eagle");\r
4030                 if (desc) return _("電撃耐性のないモンスターに非常に大きいダメージを与える。", \r
4031                         "Attacks a monster with more damage unless it has resistance to electricity.");\r
4032     \r
4033                 if (cast)\r
4034                 {\r
4035                         int y, x;\r
4036 \r
4037                         if (!get_rep_dir2(&dir)) return NULL;\r
4038                         if (dir == 5) return NULL;\r
4039 \r
4040                         y = p_ptr->y + ddy[dir];\r
4041                         x = p_ptr->x + ddx[dir];\r
4042 \r
4043                         if (cave[y][x].m_idx)\r
4044                                 py_attack(y, x, HISSATSU_ELEC);\r
4045                         else\r
4046                         {\r
4047                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
4048                                 return NULL;\r
4049                         }\r
4050                 }\r
4051                 break;\r
4052 \r
4053         case 18:\r
4054                 if (name) return _("入身", "Rush Attack");\r
4055                 if (desc) return _("素早く相手に近寄り攻撃する。", "Steps close to a monster and attacks at a time.");\r
4056     \r
4057                 if (cast)\r
4058                 {\r
4059                         if (!rush_attack(NULL)) return NULL;\r
4060                 }\r
4061                 break;\r
4062 \r
4063         case 19:\r
4064                 if (name) return _("赤流渦", "Bloody Maelstrom");\r
4065                 if (desc) return _("自分自身も傷を作りつつ、その傷が深いほど大きい威力で全方向の敵を攻撃できる。生きていないモンスターには効果がない。", \r
4066                         "Attacks all adjacent monsters with power corresponding to your cut status. Then increases your cut status. No effect to unliving monsters.");\r
4067     \r
4068                 if (cast)\r
4069                 {\r
4070                         int y = 0, x = 0;\r
4071 \r
4072                         cave_type       *c_ptr;\r
4073                         monster_type    *m_ptr;\r
4074         \r
4075                         if (p_ptr->cut < 300)\r
4076                                 set_cut(p_ptr->cut + 300);\r
4077                         else\r
4078                                 set_cut(p_ptr->cut * 2);\r
4079         \r
4080                         for (dir = 0; dir < 8; dir++)\r
4081                         {\r
4082                                 y = p_ptr->y + ddy_ddd[dir];\r
4083                                 x = p_ptr->x + ddx_ddd[dir];\r
4084                                 c_ptr = &cave[y][x];\r
4085         \r
4086                                 /* Get the monster */\r
4087                                 m_ptr = &m_list[c_ptr->m_idx];\r
4088         \r
4089                                 /* Hack -- attack monsters */\r
4090                                 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))\r
4091                                 {\r
4092                                         if (!monster_living(&r_info[m_ptr->r_idx]))\r
4093                                         {\r
4094                                                 char m_name[80];\r
4095         \r
4096                                                 monster_desc(m_name, m_ptr, 0);\r
4097                                                 msg_format(_("%sには効果がない!", "%s is unharmed!"), m_name);\r
4098                                         }\r
4099                                         else py_attack(y, x, HISSATSU_SEKIRYUKA);\r
4100                                 }\r
4101                         }\r
4102                 }\r
4103                 break;\r
4104 \r
4105         case 20:\r
4106                 if (name) return _("激震撃", "Earthquake Blow");\r
4107                 if (desc) return _("地震を起こす。", "Shakes dungeon structure, and results in random swapping of floors and walls.");\r
4108     \r
4109                 if (cast)\r
4110                 {\r
4111                         int y,x;\r
4112 \r
4113                         if (!get_rep_dir2(&dir)) return NULL;\r
4114                         if (dir == 5) return NULL;\r
4115 \r
4116                         y = p_ptr->y + ddy[dir];\r
4117                         x = p_ptr->x + ddx[dir];\r
4118 \r
4119                         if (cave[y][x].m_idx)\r
4120                                 py_attack(y, x, HISSATSU_QUAKE);\r
4121                         else\r
4122                                 earthquake(p_ptr->y, p_ptr->x, 10);\r
4123                 }\r
4124                 break;\r
4125 \r
4126         case 21:\r
4127                 if (name) return _("地走り", "Crack");\r
4128                 if (desc) return _("衝撃波のビームを放つ。", "Fires a beam of shock wave.");\r
4129     \r
4130                 if (cast)\r
4131                 {\r
4132                         int total_damage = 0, basedam, i;\r
4133                         u32b flgs[TR_FLAG_SIZE];\r
4134                         object_type *o_ptr;\r
4135                         if (!get_aim_dir(&dir)) return NULL;\r
4136                         msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));\r
4137                         for (i = 0; i < 2; i++)\r
4138                         {\r
4139                                 int damage;\r
4140         \r
4141                                 if (!buki_motteruka(INVEN_RARM+i)) break;\r
4142                                 o_ptr = &inventory[INVEN_RARM+i];\r
4143                                 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;\r
4144                                 damage = o_ptr->to_d * 100;\r
4145                                 object_flags(o_ptr, flgs);\r
4146                                 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))\r
4147                                 {\r
4148                                         /* vorpal blade */\r
4149                                         basedam *= 5;\r
4150                                         basedam /= 3;\r
4151                                 }\r
4152                                 else if (have_flag(flgs, TR_VORPAL))\r
4153                                 {\r
4154                                         /* vorpal flag only */\r
4155                                         basedam *= 11;\r
4156                                         basedam /= 9;\r
4157                                 }\r
4158                                 damage += basedam;\r
4159                                 damage *= p_ptr->num_blow[i];\r
4160                                 total_damage += damage / 200;\r
4161                                 if (i) total_damage = total_damage*7/10;\r
4162                         }\r
4163                         fire_beam(GF_FORCE, dir, total_damage);\r
4164                 }\r
4165                 break;\r
4166 \r
4167         case 22:\r
4168                 if (name) return _("気迫の雄叫び", "War Cry");\r
4169                 if (desc) return _("視界内の全モンスターに対して轟音の攻撃を行う。さらに、近くにいるモンスターを怒らせる。", \r
4170                         "Damages all monsters in sight with sound. Aggravate nearby monsters.");\r
4171     \r
4172                 if (cast)\r
4173                 {\r
4174                         msg_print(_("雄叫びをあげた!", "You roar out!"));\r
4175                         project_hack(GF_SOUND, randint1(plev * 3));\r
4176                         aggravate_monsters(0);\r
4177                 }\r
4178                 break;\r
4179 \r
4180         case 23:\r
4181                 if (name) return _("無双三段", "Musou-Sandan");\r
4182                 if (desc) return _("強力な3段攻撃を繰り出す。", "Attacks with powerful 3 strikes.");\r
4183     \r
4184                 if (cast)\r
4185                 {\r
4186                         int i;\r
4187 \r
4188                         if (!get_rep_dir2(&dir)) return NULL;\r
4189                         if (dir == 5) return NULL;\r
4190 \r
4191                         for (i = 0; i < 3; i++)\r
4192                         {\r
4193                                 POSITION y, x;\r
4194                                 POSITION ny, nx;\r
4195                                 MONSTER_IDX m_idx;\r
4196                                 cave_type *c_ptr;\r
4197                                 monster_type *m_ptr;\r
4198         \r
4199                                 y = p_ptr->y + ddy[dir];\r
4200                                 x = p_ptr->x + ddx[dir];\r
4201                                 c_ptr = &cave[y][x];\r
4202         \r
4203                                 if (c_ptr->m_idx)\r
4204                                         py_attack(y, x, HISSATSU_3DAN);\r
4205                                 else\r
4206                                 {\r
4207                                         msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
4208                                         return NULL;\r
4209                                 }\r
4210         \r
4211                                 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)\r
4212                                 {\r
4213                                         return "";\r
4214                                 }\r
4215         \r
4216                                 /* Monster is dead? */\r
4217                                 if (!c_ptr->m_idx) break;\r
4218         \r
4219                                 ny = y + ddy[dir];\r
4220                                 nx = x + ddx[dir];\r
4221                                 m_idx = c_ptr->m_idx;\r
4222                                 m_ptr = &m_list[m_idx];\r
4223         \r
4224                                 /* Monster cannot move back? */\r
4225                                 if (!monster_can_enter(ny, nx, &r_info[m_ptr->r_idx], 0))\r
4226                                 {\r
4227                                         /* -more- */\r
4228                                         if (i < 2) msg_print(NULL);\r
4229                                         continue;\r
4230                                 }\r
4231         \r
4232                                 c_ptr->m_idx = 0;\r
4233                                 cave[ny][nx].m_idx = m_idx;\r
4234                                 m_ptr->fy = ny;\r
4235                                 m_ptr->fx = nx;\r
4236         \r
4237                                 update_mon(m_idx, TRUE);\r
4238         \r
4239                                 /* Redraw the old spot */\r
4240                                 lite_spot(y, x);\r
4241         \r
4242                                 /* Redraw the new spot */\r
4243                                 lite_spot(ny, nx);\r
4244         \r
4245                                 /* Player can move forward? */\r
4246                                 if (player_can_enter(c_ptr->feat, 0))\r
4247                                 {\r
4248                                         /* Move the player */\r
4249                                         if (!move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP)) break;\r
4250                                 }\r
4251                                 else\r
4252                                 {\r
4253                                         break;\r
4254                                 }\r
4255 \r
4256                                 /* -more- */\r
4257                                 if (i < 2) msg_print(NULL);\r
4258                         }\r
4259                 }\r
4260                 break;\r
4261 \r
4262         case 24:\r
4263                 if (name) return _("吸血鬼の牙", "Vampire's Fang");\r
4264                 if (desc) return _("攻撃した相手の体力を吸いとり、自分の体力を回復させる。生命を持たないモンスターには通じない。", \r
4265                         "Attacks with vampiric strikes which absorbs HP from a monster and gives them to you. No effect to unliving monsters.");\r
4266     \r
4267                 if (cast)\r
4268                 {\r
4269                         int y, x;\r
4270 \r
4271                         if (!get_rep_dir2(&dir)) return NULL;\r
4272                         if (dir == 5) return NULL;\r
4273 \r
4274                         y = p_ptr->y + ddy[dir];\r
4275                         x = p_ptr->x + ddx[dir];\r
4276 \r
4277                         if (cave[y][x].m_idx)\r
4278                                 py_attack(y, x, HISSATSU_DRAIN);\r
4279                         else\r
4280                         {\r
4281                                         msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
4282                                 return NULL;\r
4283                         }\r
4284                 }\r
4285                 break;\r
4286 \r
4287         case 25:\r
4288                 if (name) return _("幻惑", "Moon Dazzling");\r
4289                 if (desc) return _("視界内の起きている全モンスターに朦朧、混乱、眠りを与えようとする。", "Attempts to stun, confuse and sleep all waking monsters.");\r
4290     \r
4291                 if (cast)\r
4292                 {\r
4293                         msg_print(_("武器を不規則に揺らした...", "You irregularly wave your weapon..."));\r
4294                         project_hack(GF_ENGETSU, plev * 4);\r
4295                         project_hack(GF_ENGETSU, plev * 4);\r
4296                         project_hack(GF_ENGETSU, plev * 4);\r
4297                 }\r
4298                 break;\r
4299 \r
4300         case 26:\r
4301                 if (name) return _("百人斬り", "Hundred Slaughter");\r
4302                 if (desc) return _("連続して入身でモンスターを攻撃する。攻撃するたびにMPを消費。MPがなくなるか、モンスターを倒せなかったら百人斬りは終了する。", \r
4303                         "Performs a series of rush attacks. The series continues while killing each monster in a time and SP remains.");\r
4304     \r
4305                 if (cast)\r
4306                 {\r
4307                         const int mana_cost_per_monster = 8;\r
4308                         bool is_new = TRUE;\r
4309                         bool mdeath;\r
4310 \r
4311                         do\r
4312                         {\r
4313                                 if (!rush_attack(&mdeath)) break;\r
4314                                 if (is_new)\r
4315                                 {\r
4316                                         /* Reserve needed mana point */\r
4317                                         p_ptr->csp -= technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;\r
4318                                         is_new = FALSE;\r
4319                                 }\r
4320                                 else\r
4321                                         p_ptr->csp -= mana_cost_per_monster;\r
4322 \r
4323                                 if (!mdeath) break;\r
4324                                 command_dir = 0;\r
4325 \r
4326                                 p_ptr->redraw |= PR_MANA;\r
4327                                 handle_stuff();\r
4328                         }\r
4329                         while (p_ptr->csp > mana_cost_per_monster);\r
4330 \r
4331                         if (is_new) return NULL;\r
4332         \r
4333                         /* Restore reserved mana */\r
4334                         p_ptr->csp += technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;\r
4335                 }\r
4336                 break;\r
4337 \r
4338         case 27:\r
4339                 if (name) return _("天翔龍閃", "Dragonic Flash");\r
4340                 if (desc) return _("視界内の場所を指定して、その場所と自分の間にいる全モンスターを攻撃し、その場所に移動する。", \r
4341                         "Runs toward given location while attacking all monsters on the path.");\r
4342     \r
4343                 if (cast)\r
4344                 {\r
4345                         POSITION y, x;\r
4346 \r
4347                         if (!tgt_pt(&x, &y)) return NULL;\r
4348 \r
4349                         if (!cave_player_teleportable_bold(y, x, 0L) ||\r
4350                             (distance(y, x, p_ptr->y, p_ptr->x) > MAX_SIGHT / 2) ||\r
4351                             !projectable(p_ptr->y, p_ptr->x, y, x))\r
4352                         {\r
4353                                 msg_print(_("失敗!", "You cannot move to that place!"));\r
4354                                 break;\r
4355                         }\r
4356                         if (p_ptr->anti_tele)\r
4357                         {\r
4358                                 msg_print(_("不思議な力がテレポートを防いだ!", "A mysterious force prevents you from teleporting!"));\r
4359                                 break;\r
4360                         }\r
4361                         project(0, 0, y, x, HISSATSU_ISSEN, GF_ATTACK, PROJECT_BEAM | PROJECT_KILL, -1);\r
4362                         teleport_player_to(y, x, 0L);\r
4363                 }\r
4364                 break;\r
4365 \r
4366         case 28:\r
4367                 if (name) return _("二重の剣撃", "Twin Slash");\r
4368                 if (desc) return _("1ターンで2度攻撃を行う。", "double attacks at a time.");\r
4369     \r
4370                 if (cast)\r
4371                 {\r
4372                         int x, y;\r
4373         \r
4374                         if (!get_rep_dir(&dir, FALSE)) return NULL;\r
4375 \r
4376                         y = p_ptr->y + ddy[dir];\r
4377                         x = p_ptr->x + ddx[dir];\r
4378 \r
4379                         if (cave[y][x].m_idx)\r
4380                         {\r
4381                                 py_attack(y, x, 0);\r
4382                                 if (cave[y][x].m_idx)\r
4383                                 {\r
4384                                         handle_stuff();\r
4385                                         py_attack(y, x, 0);\r
4386                                 }\r
4387                         }\r
4388                         else\r
4389                         {\r
4390                                 msg_print(_("その方向にはモンスターはいません。", "You don't see any monster in this direction"));\r
4391                                 return NULL;\r
4392                         }\r
4393                 }\r
4394                 break;\r
4395 \r
4396         case 29:\r
4397                 if (name) return _("虎伏絶刀勢", "Kofuku-Zettousei");\r
4398                 if (desc) return _("強力な攻撃を行い、近くの場所にも効果が及ぶ。", "Performs a powerful attack which even effect nearby monsters.");\r
4399     \r
4400                 if (cast)\r
4401                 {\r
4402                         int total_damage = 0, basedam, i;\r
4403                         int y, x;\r
4404                         u32b flgs[TR_FLAG_SIZE];\r
4405                         object_type *o_ptr;\r
4406         \r
4407                         if (!get_rep_dir2(&dir)) return NULL;\r
4408                         if (dir == 5) return NULL;\r
4409 \r
4410                         y = p_ptr->y + ddy[dir];\r
4411                         x = p_ptr->x + ddx[dir];\r
4412 \r
4413                         if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)\r
4414                         {\r
4415                                 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));\r
4416                                 return "";\r
4417                         }\r
4418                         msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));\r
4419                         for (i = 0; i < 2; i++)\r
4420                         {\r
4421                                 int damage;\r
4422                                 if (!buki_motteruka(INVEN_RARM+i)) break;\r
4423                                 o_ptr = &inventory[INVEN_RARM+i];\r
4424                                 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;\r
4425                                 damage = o_ptr->to_d * 100;\r
4426                                 object_flags(o_ptr, flgs);\r
4427                                 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))\r
4428                                 {\r
4429                                         /* vorpal blade */\r
4430                                         basedam *= 5;\r
4431                                         basedam /= 3;\r
4432                                 }\r
4433                                 else if (have_flag(flgs, TR_VORPAL))\r
4434                                 {\r
4435                                         /* vorpal flag only */\r
4436                                         basedam *= 11;\r
4437                                         basedam /= 9;\r
4438                                 }\r
4439                                 damage += basedam;\r
4440                                 damage += p_ptr->to_d[i] * 100;\r
4441                                 damage *= p_ptr->num_blow[i];\r
4442                                 total_damage += (damage / 100);\r
4443                         }\r
4444                         project(0, (cave_have_flag_bold(y, x, FF_PROJECT) ? 5 : 0), y, x, total_damage * 3 / 2, GF_METEOR, PROJECT_KILL | PROJECT_JUMP | PROJECT_ITEM, -1);\r
4445                 }\r
4446                 break;\r
4447 \r
4448         case 30:\r
4449                 if (name) return _("慶雲鬼忍剣", "Keiun-Kininken");\r
4450                 if (desc) return _("自分もダメージをくらうが、相手に非常に大きなダメージを与える。アンデッドには特に効果がある。", \r
4451                         "Attacks a monster with extremely powerful damage. But you also takes some damages. Hurts a undead monster greatly.");\r
4452     \r
4453                 if (cast)\r
4454                 {\r
4455                         int y, x;\r
4456 \r
4457                         if (!get_rep_dir2(&dir)) return NULL;\r
4458                         if (dir == 5) return NULL;\r
4459 \r
4460                         y = p_ptr->y + ddy[dir];\r
4461                         x = p_ptr->x + ddx[dir];\r
4462 \r
4463                         if (cave[y][x].m_idx)\r
4464                                 py_attack(y, x, HISSATSU_UNDEAD);\r
4465                         else\r
4466                         {\r
4467                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
4468                                 return NULL;\r
4469                         }\r
4470                         take_hit(DAMAGE_NOESCAPE, 100 + randint1(100), _("慶雲鬼忍剣を使った衝撃", "exhaustion on using Keiun-Kininken"), -1);\r
4471                 }\r
4472                 break;\r
4473 \r
4474         case 31:\r
4475                 if (name) return _("切腹", "Harakiri");\r
4476                 if (desc) return _("「武士道とは、死ぬことと見つけたり。」", "'Busido is found in death'");\r
4477 \r
4478                 if (cast)\r
4479                 {\r
4480                         int i;\r
4481                         if (!get_check(_("本当に自殺しますか?", "Do you really want to commit suicide? "))) return NULL;\r
4482                                 /* Special Verification for suicide */\r
4483                         prt(_("確認のため '@' を押して下さい。", "Please verify SUICIDE by typing the '@' sign: "), 0, 0);\r
4484         \r
4485                         flush();\r
4486                         i = inkey();\r
4487                         prt("", 0, 0);\r
4488                         if (i != '@') return NULL;\r
4489                         if (p_ptr->total_winner)\r
4490                         {\r
4491                                 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);\r
4492                                 p_ptr->total_winner = TRUE;\r
4493                         }\r
4494                         else\r
4495                         {\r
4496                                 msg_print(_("武士道とは、死ぬことと見つけたり。", "Meaning of Bushi-do is found in the death."));\r
4497                                 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);\r
4498                         }\r
4499                 }\r
4500                 break;\r
4501         }\r
4502 \r
4503         return "";\r
4504 }\r
4505 \r
4506 /*!\r
4507  * @brief 呪術領域の武器呪縛の対象にできる武器かどうかを返す。 / An "item_tester_hook" for offer\r
4508  * @param o_ptr オブジェクト構造体の参照ポインタ\r
4509  * @return 呪縛可能な武器ならばTRUEを返す\r
4510  */\r
4511 static bool item_tester_hook_weapon_except_bow(object_type *o_ptr)\r
4512 {\r
4513         switch (o_ptr->tval)\r
4514         {\r
4515                 case TV_SWORD:\r
4516                 case TV_HAFTED:\r
4517                 case TV_POLEARM:\r
4518                 case TV_DIGGING:\r
4519                 {\r
4520                         return (TRUE);\r
4521                 }\r
4522         }\r
4523 \r
4524         return (FALSE);\r
4525 }\r
4526 \r
4527 /*!\r
4528  * @brief 呪術領域の各処理に使える呪われた装備かどうかを返す。 / An "item_tester_hook" for offer\r
4529  * @param o_ptr オブジェクト構造体の参照ポインタ\r
4530  * @return 使える装備ならばTRUEを返す\r
4531  */\r
4532 static bool item_tester_hook_cursed(object_type *o_ptr)\r
4533 {\r
4534         return (bool)(object_is_cursed(o_ptr));\r
4535 }\r
4536 \r
4537 /*!\r
4538  * @brief 呪術領域魔法の各処理を行う\r
4539  * @param spell 魔法ID\r
4540  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_CONT / SPELL_STOP)\r
4541  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。\r
4542  */\r
4543 static cptr do_hex_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
4544 {\r
4545         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
4546         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
4547         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
4548         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
4549         bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;\r
4550         bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;\r
4551 \r
4552         bool add = TRUE;\r
4553 \r
4554         PLAYER_LEVEL plev = p_ptr->lev;\r
4555         HIT_POINT power;\r
4556 \r
4557         switch (spell)\r
4558         {\r
4559         /*** 1st book (0-7) ***/\r
4560         case 0:\r
4561                 if (name) return _("邪なる祝福", "Evily blessing");\r
4562                 if (desc) return _("祝福により攻撃精度と防御力が上がる。", "Attempts to increase +to_hit of a weapon and AC");\r
4563                 if (cast)\r
4564                 {\r
4565                         if (!p_ptr->blessed)\r
4566                         {\r
4567                                 msg_print(_("高潔な気分になった!", "You feel righteous!"));\r
4568                         }\r
4569                 }\r
4570                 if (stop)\r
4571                 {\r
4572                         if (!p_ptr->blessed)\r
4573                         {\r
4574                                 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));\r
4575                         }\r
4576                 }\r
4577                 break;\r
4578 \r
4579         case 1:\r
4580                 if (name) return _("軽傷の治癒", "Cure light wounds");\r
4581                 if (desc) return _("HPや傷を少し回復させる。", "Heals cut and HP a little.");\r
4582                 if (info) return info_heal(1, 10, 0);\r
4583                 if (cast)\r
4584                 {\r
4585                         msg_print(_("気分が良くなってくる。", "You feel better and better."));\r
4586                 }\r
4587                 if (cast || cont)\r
4588                 {\r
4589                         hp_player(damroll(1, 10));\r
4590                         set_cut(p_ptr->cut - 10);\r
4591                 }\r
4592                 break;\r
4593 \r
4594         case 2:\r
4595                 if (name) return _("悪魔のオーラ", "Demonic aura");\r
4596                 if (desc) return _("炎のオーラを身にまとい、回復速度が速くなる。", "Gives fire aura and regeneration.");\r
4597                 if (cast)\r
4598                 {\r
4599                         msg_print(_("体が炎のオーラで覆われた。", "You have enveloped by fiery aura!"));\r
4600                 }\r
4601                 if (stop)\r
4602                 {\r
4603                         msg_print(_("炎のオーラが消え去った。", "Fiery aura disappeared."));\r
4604                 }\r
4605                 break;\r
4606 \r
4607         case 3:\r
4608                 if (name) return _("悪臭霧", "Stinking mist");\r
4609                 if (desc) return _("視界内のモンスターに微弱量の毒のダメージを与える。", "Deals few damages of poison to all monsters in your sight.");\r
4610                 power = plev / 2 + 5;\r
4611                 if (info) return info_damage(1, power, 0);\r
4612                 if (cast || cont)\r
4613                 {\r
4614                         project_hack(GF_POIS, randint1(power));\r
4615                 }\r
4616                 break;\r
4617 \r
4618         case 4:\r
4619                 if (name) return _("腕力強化", "Extra might");\r
4620                 if (desc) return _("術者の腕力を上昇させる。", "Attempts to increase your strength.");\r
4621                 if (cast)\r
4622                 {\r
4623                         msg_print(_("何だか力が湧いて来る。", "You feel you get stronger."));\r
4624                 }\r
4625                 break;\r
4626 \r
4627         case 5:\r
4628                 if (name) return _("武器呪縛", "Curse weapon");\r
4629                 if (desc) return _("装備している武器を呪う。", "Curses your weapon.");\r
4630                 if (cast)\r
4631                 {\r
4632                         OBJECT_IDX item;\r
4633                         cptr q, s;\r
4634                         char o_name[MAX_NLEN];\r
4635                         object_type *o_ptr;\r
4636                         u32b f[TR_FLAG_SIZE];\r
4637 \r
4638                         item_tester_hook = item_tester_hook_weapon_except_bow;\r
4639                         q = _("どれを呪いますか?", "Which weapon do you curse?");\r
4640                         s = _("武器を装備していない。", "You wield no weapons.");\r
4641 \r
4642                         if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;\r
4643 \r
4644                         o_ptr = &inventory[item];\r
4645                         object_desc(o_name, o_ptr, OD_NAME_ONLY);\r
4646                         object_flags(o_ptr, f);\r
4647 \r
4648                         if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;\r
4649 \r
4650                         if (!one_in_(3) &&\r
4651                                 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))\r
4652                         {\r
4653                                 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);\r
4654                                 if (one_in_(3))\r
4655                                 {\r
4656                                         if (o_ptr->to_d > 0)\r
4657                                         {\r
4658                                                 o_ptr->to_d -= randint1(3) % 2;\r
4659                                                 if (o_ptr->to_d < 0) o_ptr->to_d = 0;\r
4660                                         }\r
4661                                         if (o_ptr->to_h > 0)\r
4662                                         {\r
4663                                                 o_ptr->to_h -= randint1(3) % 2;\r
4664                                                 if (o_ptr->to_h < 0) o_ptr->to_h = 0;\r
4665                                         }\r
4666                                         if (o_ptr->to_a > 0)\r
4667                                         {\r
4668                                                 o_ptr->to_a -= randint1(3) % 2;\r
4669                                                 if (o_ptr->to_a < 0) o_ptr->to_a = 0;\r
4670                                         }\r
4671                                         msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);\r
4672                                 }\r
4673                         }\r
4674                         else\r
4675                         {\r
4676                                 int curse_rank = 0;\r
4677                                 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);\r
4678                                 o_ptr->curse_flags |= (TRC_CURSED);\r
4679 \r
4680                                 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))\r
4681                                 {\r
4682 \r
4683                                         if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);\r
4684                                         if (one_in_(666))\r
4685                                         {\r
4686                                                 o_ptr->curse_flags |= (TRC_TY_CURSE);\r
4687                                                 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);\r
4688 \r
4689                                                 add_flag(o_ptr->art_flags, TR_AGGRAVATE);\r
4690                                                 add_flag(o_ptr->art_flags, TR_VORPAL);\r
4691                                                 add_flag(o_ptr->art_flags, TR_VAMPIRIC);\r
4692                                                 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));\r
4693                                                 curse_rank = 2;\r
4694                                         }\r
4695                                 }\r
4696 \r
4697                                 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);\r
4698                         }\r
4699 \r
4700                         p_ptr->update |= (PU_BONUS);\r
4701                         add = FALSE;\r
4702                 }\r
4703                 break;\r
4704 \r
4705         case 6:\r
4706                 if (name) return _("邪悪感知", "Evil detection");\r
4707                 if (desc) return _("周囲の邪悪なモンスターを感知する。", "Detects evil monsters.");\r
4708                 if (info) return info_range(MAX_SIGHT);\r
4709                 if (cast)\r
4710                 {\r
4711                         msg_print(_("邪悪な生物の存在を感じ取ろうとした。", "You attend to the presence of evil creatures."));\r
4712                 }\r
4713                 break;\r
4714 \r
4715         case 7:\r
4716                 if (name) return _("我慢", "Patience");\r
4717                 if (desc) return _("数ターン攻撃を耐えた後、受けたダメージを地獄の業火として周囲に放出する。", \r
4718                         "Bursts hell fire strongly after patients any damage while few turns.");\r
4719                 power = MIN(200, (HEX_REVENGE_POWER(p_ptr) * 2));\r
4720                 if (info) return info_damage(0, 0, power);\r
4721                 if (cast)\r
4722                 {\r
4723                         int a = 3 - (p_ptr->pspeed - 100) / 10;\r
4724                         MAGIC_NUM2 r = 3 + randint1(3) + MAX(0, MIN(3, a));\r
4725 \r
4726                         if (HEX_REVENGE_TURN(p_ptr) > 0)\r
4727                         {\r
4728                                 msg_print(_("すでに我慢をしている。", "You are already patienting."));\r
4729                                 return NULL;\r
4730                         }\r
4731 \r
4732                         HEX_REVENGE_TYPE(p_ptr) = 1;\r
4733                         HEX_REVENGE_TURN(p_ptr) = r;\r
4734                         HEX_REVENGE_POWER(p_ptr) = 0;\r
4735                         msg_print(_("じっと耐えることにした。", "You decide to patient all damages."));\r
4736                         add = FALSE;\r
4737                 }\r
4738                 if (cont)\r
4739                 {\r
4740                         int rad = 2 + (power / 50);\r
4741 \r
4742                         HEX_REVENGE_TURN(p_ptr)--;\r
4743 \r
4744                         if ((HEX_REVENGE_TURN(p_ptr) <= 0) || (power >= 200))\r
4745                         {\r
4746                                 msg_print(_("我慢が解かれた!", "Time for end of patioence!"));\r
4747                                 if (power)\r
4748                                 {\r
4749                                         project(0, rad, p_ptr->y, p_ptr->x, power, GF_HELL_FIRE,\r
4750                                                 (PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);\r
4751                                 }\r
4752                                 if (p_ptr->wizard)\r
4753                                 {\r
4754                                         msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);\r
4755                                 }\r
4756 \r
4757                                 /* Reset */\r
4758                                 HEX_REVENGE_TYPE(p_ptr) = 0;\r
4759                                 HEX_REVENGE_TURN(p_ptr) = 0;\r
4760                                 HEX_REVENGE_POWER(p_ptr) = 0;\r
4761                         }\r
4762                 }\r
4763                 break;\r
4764 \r
4765         /*** 2nd book (8-15) ***/\r
4766         case 8:\r
4767                 if (name) return _("氷の鎧", "Ice armor");\r
4768                 if (desc) return _("氷のオーラを身にまとい、防御力が上昇する。", "Gives fire aura and bonus to AC.");\r
4769                 if (cast)\r
4770                 {\r
4771                         msg_print(_("体が氷の鎧で覆われた。", "You have enveloped by ice armor!"));\r
4772                 }\r
4773                 if (stop)\r
4774                 {\r
4775                         msg_print(_("氷の鎧が消え去った。", "Ice armor disappeared."));\r
4776                 }\r
4777                 break;\r
4778 \r
4779         case 9:\r
4780                 if (name) return _("重傷の治癒", "Cure serious wounds");\r
4781                 if (desc) return _("体力や傷を多少回復させる。", "Heals cut and HP more.");\r
4782                 if (info) return info_heal(2, 10, 0);\r
4783                 if (cast)\r
4784                 {\r
4785                         msg_print(_("気分が良くなってくる。", "You feel better and better."));\r
4786                 }\r
4787                 if (cast || cont)\r
4788                 {\r
4789                         hp_player(damroll(2, 10));\r
4790                         set_cut((p_ptr->cut / 2) - 10);\r
4791                 }\r
4792                 break;\r
4793 \r
4794         case 10:\r
4795                 if (name) return _("薬品吸入", "Inhail potion");\r
4796                 if (desc) return _("呪文詠唱を中止することなく、薬の効果を得ることができる。", "Quaffs a potion without canceling of casting a spell.");\r
4797                 if (cast)\r
4798                 {\r
4799                         CASTING_HEX_FLAGS(p_ptr) |= (1L << HEX_INHAIL);\r
4800                         do_cmd_quaff_potion();\r
4801                         CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_INHAIL);\r
4802                         add = FALSE;\r
4803                 }\r
4804                 break;\r
4805 \r
4806         case 11:\r
4807                 if (name) return _("衰弱の霧", "Hypodynamic mist");\r
4808                 if (desc) return _("視界内のモンスターに微弱量の衰弱属性のダメージを与える。", \r
4809                         "Deals few damages of hypodynamia to all monsters in your sight.");\r
4810                 power = (plev / 2) + 5;\r
4811                 if (info) return info_damage(1, power, 0);\r
4812                 if (cast || cont)\r
4813                 {\r
4814                         project_hack(GF_HYPODYNAMIA, randint1(power));\r
4815                 }\r
4816                 break;\r
4817 \r
4818         case 12:\r
4819                 if (name) return _("魔剣化", "Swords to runeswords");\r
4820                 if (desc) return _("武器の攻撃力を上げる。切れ味を得、呪いに応じて与えるダメージが上昇し、善良なモンスターに対するダメージが2倍になる。", \r
4821                         "Gives vorpal ability to your weapon. Increases damages by your weapon acccording to curse of your weapon.");\r
4822                 if (cast)\r
4823                 {\r
4824 #ifdef JP\r
4825                         msg_print("あなたの武器が黒く輝いた。");\r
4826 #else\r
4827                         if (!empty_hands(FALSE))\r
4828                                 msg_print("Your weapons glow bright black.");\r
4829                         else\r
4830                                 msg_print("Your weapon glows bright black.");\r
4831 #endif\r
4832                 }\r
4833                 if (stop)\r
4834                 {\r
4835 #ifdef JP\r
4836                         msg_print("武器の輝きが消え去った。");\r
4837 #else\r
4838                         msg_format("Brightness of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");\r
4839 #endif\r
4840                 }\r
4841                 break;\r
4842 \r
4843         case 13:\r
4844                 if (name) return _("混乱の手", "Touch of confusion");\r
4845                 if (desc) return _("攻撃した際モンスターを混乱させる。", "Confuses a monster when you attack.");\r
4846                 if (cast)\r
4847                 {\r
4848                         msg_print(_("あなたの手が赤く輝き始めた。", "Your hands glow bright red."));\r
4849                 }\r
4850                 if (stop)\r
4851                 {\r
4852                         msg_print(_("手の輝きがなくなった。", "Brightness on your hands disappeard."));\r
4853                 }\r
4854                 break;\r
4855 \r
4856         case 14:\r
4857                 if (name) return _("肉体強化", "Building up");\r
4858                 if (desc) return _("術者の腕力、器用さ、耐久力を上昇させる。攻撃回数の上限を 1 増加させる。", \r
4859                         "Attempts to increases your strength, dexterity and constitusion.");\r
4860                 if (cast)\r
4861                 {\r
4862                         msg_print(_("身体が強くなった気がした。", "You feel your body is developed more now."));\r
4863                 }\r
4864                 break;\r
4865 \r
4866         case 15:\r
4867                 if (name) return _("反テレポート結界", "Anti teleport barrier");\r
4868                 if (desc) return _("視界内のモンスターのテレポートを阻害するバリアを張る。", "Obstructs all teleportations by monsters in your sight.");\r
4869                 power = plev * 3 / 2;\r
4870                 if (info) return info_power(power);\r
4871                 if (cast)\r
4872                 {\r
4873                         msg_print(_("テレポートを防ぐ呪いをかけた。", "You feel anyone can not teleport except you."));\r
4874                 }\r
4875                 break;\r
4876 \r
4877         /*** 3rd book (16-23) ***/\r
4878         case 16:\r
4879                 if (name) return _("衝撃のクローク", "Cloak of shock");\r
4880                 if (desc) return _("電気のオーラを身にまとい、動きが速くなる。", "Gives lightning aura and a bonus to speed.");\r
4881                 if (cast)\r
4882                 {\r
4883                         msg_print(_("体が稲妻のオーラで覆われた。", "You have enveloped by electrical aura!"));\r
4884                 }\r
4885                 if (stop)\r
4886                 {\r
4887                         msg_print(_("稲妻のオーラが消え去った。", "Electrical aura disappeared."));\r
4888                 }\r
4889                 break;\r
4890 \r
4891         case 17:\r
4892                 if (name) return _("致命傷の治癒", "Cure critical wounds");\r
4893                 if (desc) return _("体力や傷を回復させる。", "Heals cut and HP greatry.");\r
4894                 if (info) return info_heal(4, 10, 0);\r
4895                 if (cast)\r
4896                 {\r
4897                         msg_print(_("気分が良くなってくる。", "You feel better and better."));\r
4898                 }\r
4899                 if (cast || cont)\r
4900                 {\r
4901                         hp_player(damroll(4, 10));\r
4902                         set_stun(0);\r
4903                         set_cut(0);\r
4904                         set_poisoned(0);\r
4905                 }\r
4906                 break;\r
4907 \r
4908         case 18:\r
4909                 if (name) return _("呪力封入", "Recharging");\r
4910                 if (desc) return _("魔法の道具に魔力を再充填する。", "Recharges a magic device.");\r
4911                 power = plev * 2;\r
4912                 if (info) return info_power(power);\r
4913                 if (cast)\r
4914                 {\r
4915                         if (!recharge(power)) return NULL;\r
4916                         add = FALSE;\r
4917                 }\r
4918                 break;\r
4919 \r
4920         case 19:\r
4921                 if (name) return _("死者復活", "Animate Dead");\r
4922                 if (desc) return _("死体を蘇らせてペットにする。", "Raises corpses and skeletons from dead.");\r
4923                 if (cast)\r
4924                 {\r
4925                         msg_print(_("死者への呼びかけを始めた。", "You start to call deads.!"));\r
4926                 }\r
4927                 if (cast || cont)\r
4928                 {\r
4929                         animate_dead(0, p_ptr->y, p_ptr->x);\r
4930                 }\r
4931                 break;\r
4932 \r
4933         case 20:\r
4934                 if (name) return _("防具呪縛", "Curse armor");\r
4935                 if (desc) return _("装備している防具に呪いをかける。", "Curse a piece of armour that you wielding.");\r
4936                 if (cast)\r
4937                 {\r
4938                         OBJECT_IDX item;\r
4939                         cptr q, s;\r
4940                         char o_name[MAX_NLEN];\r
4941                         object_type *o_ptr;\r
4942                         u32b f[TR_FLAG_SIZE];\r
4943 \r
4944                         item_tester_hook = object_is_armour;\r
4945                         q = _("どれを呪いますか?", "Which piece of armour do you curse?");\r
4946                         s = _("防具を装備していない。", "You wield no piece of armours.");\r
4947 \r
4948                         if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;\r
4949 \r
4950                         o_ptr = &inventory[item];\r
4951                         object_desc(o_name, o_ptr, OD_NAME_ONLY);\r
4952                         object_flags(o_ptr, f);\r
4953 \r
4954                         if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;\r
4955 \r
4956                         if (!one_in_(3) &&\r
4957                                 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))\r
4958                         {\r
4959                                 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);\r
4960                                 if (one_in_(3))\r
4961                                 {\r
4962                                         if (o_ptr->to_d > 0)\r
4963                                         {\r
4964                                                 o_ptr->to_d -= randint1(3) % 2;\r
4965                                                 if (o_ptr->to_d < 0) o_ptr->to_d = 0;\r
4966                                         }\r
4967                                         if (o_ptr->to_h > 0)\r
4968                                         {\r
4969                                                 o_ptr->to_h -= randint1(3) % 2;\r
4970                                                 if (o_ptr->to_h < 0) o_ptr->to_h = 0;\r
4971                                         }\r
4972                                         if (o_ptr->to_a > 0)\r
4973                                         {\r
4974                                                 o_ptr->to_a -= randint1(3) % 2;\r
4975                                                 if (o_ptr->to_a < 0) o_ptr->to_a = 0;\r
4976                                         }\r
4977                                         msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);\r
4978                                 }\r
4979                         }\r
4980                         else\r
4981                         {\r
4982                                 int curse_rank = 0;\r
4983                                 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);\r
4984                                 o_ptr->curse_flags |= (TRC_CURSED);\r
4985 \r
4986                                 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))\r
4987                                 {\r
4988 \r
4989                                         if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);\r
4990                                         if (one_in_(666))\r
4991                                         {\r
4992                                                 o_ptr->curse_flags |= (TRC_TY_CURSE);\r
4993                                                 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);\r
4994 \r
4995                                                 add_flag(o_ptr->art_flags, TR_AGGRAVATE);\r
4996                                                 add_flag(o_ptr->art_flags, TR_RES_POIS);\r
4997                                                 add_flag(o_ptr->art_flags, TR_RES_DARK);\r
4998                                                 add_flag(o_ptr->art_flags, TR_RES_NETHER);\r
4999                                                 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));\r
5000                                                 curse_rank = 2;\r
5001                                         }\r
5002                                 }\r
5003 \r
5004                                 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);\r
5005                         }\r
5006 \r
5007                         p_ptr->update |= (PU_BONUS);\r
5008                         add = FALSE;\r
5009                 }\r
5010                 break;\r
5011 \r
5012         case 21:\r
5013                 if (name) return _("影のクローク", "Cloak of shadow");\r
5014                 if (desc) return _("影のオーラを身にまとい、敵に影のダメージを与える。", "Gives aura of shadow.");\r
5015                 if (cast)\r
5016                 {\r
5017                         object_type *o_ptr = &inventory[INVEN_OUTER];\r
5018 \r
5019                         if (!o_ptr->k_idx)\r
5020                         {\r
5021                                 msg_print(_("クロークを身につけていない!", "You don't ware any cloak."));\r
5022                                 return NULL;\r
5023                         }\r
5024                         else if (!object_is_cursed(o_ptr))\r
5025                         {\r
5026                                 msg_print(_("クロークは呪われていない!", "Your cloak is not cursed."));\r
5027                                 return NULL;\r
5028                         }\r
5029                         else\r
5030                         {\r
5031                                 msg_print(_("影のオーラを身にまとった。", "You have enveloped by shadow aura!"));\r
5032                         }\r
5033                 }\r
5034                 if (cont)\r
5035                 {\r
5036                         object_type *o_ptr = &inventory[INVEN_OUTER];\r
5037 \r
5038                         if ((!o_ptr->k_idx) || (!object_is_cursed(o_ptr)))\r
5039                         {\r
5040                                 do_spell(REALM_HEX, spell, SPELL_STOP);\r
5041                                 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << spell);\r
5042                                 CASTING_HEX_NUM(p_ptr)--;\r
5043                                 if (!SINGING_SONG_ID(p_ptr)) set_action(ACTION_NONE);\r
5044                         }\r
5045                 }\r
5046                 if (stop)\r
5047                 {\r
5048                         msg_print(_("影のオーラが消え去った。", "Shadow aura disappeared."));\r
5049                 }\r
5050                 break;\r
5051 \r
5052         case 22:\r
5053                 if (name) return _("苦痛を魔力に", "Pains to mana");\r
5054                 if (desc) return _("視界内のモンスターに精神ダメージ与え、魔力を吸い取る。", "Deals psychic damages to all monsters in sight, and drains some mana.");\r
5055                 power = plev * 3 / 2;\r
5056                 if (info) return info_damage(1, power, 0);\r
5057                 if (cast || cont)\r
5058                 {\r
5059                         project_hack(GF_PSI_DRAIN, randint1(power));\r
5060                 }\r
5061                 break;\r
5062 \r
5063         case 23:\r
5064                 if (name) return _("目には目を", "Eye for an eye");\r
5065                 if (desc) return _("打撃や魔法で受けたダメージを、攻撃元のモンスターにも与える。", "Returns same damage which you got to the monster which damaged you.");\r
5066                 if (cast)\r
5067                 {\r
5068                         msg_print(_("復讐したい欲望にかられた。", "You wish strongly you want to revenge anything."));\r
5069                 }\r
5070                 break;\r
5071 \r
5072         /*** 4th book (24-31) ***/\r
5073         case 24:\r
5074                 if (name) return _("反増殖結界", "Anti multiply barrier");\r
5075                 if (desc) return _("その階の増殖するモンスターの増殖を阻止する。", "Obstructs all multiplying by monsters in entire floor.");\r
5076                 if (cast)\r
5077                 {\r
5078                         msg_print(_("増殖を阻止する呪いをかけた。", "You feel anyone can not already multiply."));\r
5079                 }\r
5080                 break;\r
5081 \r
5082         case 25:\r
5083                 if (name) return _("全復活", "Restoration");\r
5084                 if (desc) return _("経験値を徐々に復活し、減少した能力値を回復させる。", "Restores experience and status.");\r
5085                 if (cast)\r
5086                 {\r
5087                         msg_print(_("体が元の活力を取り戻し始めた。", "You feel your lost status starting to return."));\r
5088                 }\r
5089                 if (cast || cont)\r
5090                 {\r
5091                         bool flag = FALSE;\r
5092                         int d = (p_ptr->max_exp - p_ptr->exp);\r
5093                         int r = (p_ptr->exp / 20);\r
5094                         int i;\r
5095 \r
5096                         if (d > 0)\r
5097                         {\r
5098                                 if (d < r)\r
5099                                         p_ptr->exp = p_ptr->max_exp;\r
5100                                 else\r
5101                                         p_ptr->exp += r;\r
5102 \r
5103                                 /* Check the experience */\r
5104                                 check_experience();\r
5105 \r
5106                                 flag = TRUE;\r
5107                         }\r
5108                         for (i = A_STR; i < 6; i ++)\r
5109                         {\r
5110                                 if (p_ptr->stat_cur[i] < p_ptr->stat_max[i])\r
5111                                 {\r
5112                                         if (p_ptr->stat_cur[i] < 18)\r
5113                                                 p_ptr->stat_cur[i]++;\r
5114                                         else\r
5115                                                 p_ptr->stat_cur[i] += 10;\r
5116 \r
5117                                         if (p_ptr->stat_cur[i] > p_ptr->stat_max[i])\r
5118                                                 p_ptr->stat_cur[i] = p_ptr->stat_max[i];\r
5119 \r
5120                                         /* Recalculate bonuses */\r
5121                                         p_ptr->update |= (PU_BONUS);\r
5122 \r
5123                                         flag = TRUE;\r
5124                                 }\r
5125                         }\r
5126 \r
5127                         if (!flag)\r
5128                         {\r
5129                                 msg_format(_("%sの呪文の詠唱をやめた。", "Finish casting '%^s'."), do_spell(REALM_HEX, HEX_RESTORE, SPELL_NAME));\r
5130                                 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_RESTORE);\r
5131                                 if (cont) CASTING_HEX_NUM(p_ptr)--;\r
5132                                 if (CASTING_HEX_NUM(p_ptr)) p_ptr->action = ACTION_NONE;\r
5133 \r
5134                                 /* Redraw status */\r
5135                                 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);\r
5136                                 p_ptr->redraw |= (PR_EXTRA);\r
5137 \r
5138                                 return "";\r
5139                         }\r
5140                 }\r
5141                 break;\r
5142 \r
5143         case 26:\r
5144                 if (name) return _("呪力吸収", "Drain curse power");\r
5145                 if (desc) return _("呪われた武器の呪いを吸収して魔力を回復する。", "Drains curse on your weapon and heals SP a little.");\r
5146                 if (cast)\r
5147                 {\r
5148                         OBJECT_IDX item;\r
5149                         cptr s, q;\r
5150                         u32b f[TR_FLAG_SIZE];\r
5151                         object_type *o_ptr;\r
5152 \r
5153                         item_tester_hook = item_tester_hook_cursed;\r
5154                         q = _("どの装備品から吸収しますか?", "Which cursed equipment do you drain mana from?");\r
5155                         s = _("呪われたアイテムを装備していない。", "You have no cursed equipment.");\r
5156 \r
5157                         if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;\r
5158 \r
5159                         o_ptr = &inventory[item];\r
5160                         object_flags(o_ptr, f);\r
5161 \r
5162                         p_ptr->csp += (p_ptr->lev / 5) + randint1(p_ptr->lev / 5);\r
5163                         if (have_flag(f, TR_TY_CURSE) || (o_ptr->curse_flags & TRC_TY_CURSE)) p_ptr->csp += randint1(5);\r
5164                         if (p_ptr->csp > p_ptr->msp) p_ptr->csp = p_ptr->msp;\r
5165 \r
5166                         if (o_ptr->curse_flags & TRC_PERMA_CURSE)\r
5167                         {\r
5168                                 /* Nothing */\r
5169                         }\r
5170                         else if (o_ptr->curse_flags & TRC_HEAVY_CURSE)\r
5171                         {\r
5172                                 if (one_in_(7))\r
5173                                 {\r
5174                                         msg_print(_("呪いを全て吸い取った。", "Heavy curse vanished away."));\r
5175                                         o_ptr->curse_flags = 0L;\r
5176                                 }\r
5177                         }\r
5178                         else if ((o_ptr->curse_flags & (TRC_CURSED)) && one_in_(3))\r
5179                         {\r
5180                                 msg_print(_("呪いを全て吸い取った。", "Curse vanished away."));\r
5181                                 o_ptr->curse_flags = 0L;\r
5182                         }\r
5183 \r
5184                         add = FALSE;\r
5185                 }\r
5186                 break;\r
5187 \r
5188         case 27:\r
5189                 if (name) return _("吸血の刃", "Swords to vampires");\r
5190                 if (desc) return _("吸血属性で攻撃する。", "Gives vampiric ability to your weapon.");\r
5191                 if (cast)\r
5192                 {\r
5193 #ifdef JP\r
5194                         msg_print("あなたの武器が血を欲している。");\r
5195 #else\r
5196                         if (!empty_hands(FALSE))\r
5197                                 msg_print("Your weapons want more blood now.");\r
5198                         else\r
5199                                 msg_print("Your weapon wants more blood now.");\r
5200 #endif\r
5201                 }\r
5202                 if (stop)\r
5203                 {\r
5204 #ifdef JP\r
5205                         msg_print("武器の渇望が消え去った。");\r
5206 #else\r
5207                         msg_format("Thirsty of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");\r
5208 #endif\r
5209                 }\r
5210                 break;\r
5211 \r
5212         case 28:\r
5213                 if (name) return _("朦朧の言葉", "Word of stun");\r
5214                 if (desc) return _("視界内のモンスターを朦朧とさせる。", "Stuns all monsters in your sight.");\r
5215                 power = plev * 4;\r
5216                 if (info) return info_power(power);\r
5217                 if (cast || cont)\r
5218                 {\r
5219                         stun_monsters(power);\r
5220                 }\r
5221                 break;\r
5222 \r
5223         case 29:\r
5224                 if (name) return _("影移動", "Moving into shadow");\r
5225                 if (desc) return _("モンスターの隣のマスに瞬間移動する。", "Teleports you close to a monster.");\r
5226                 if (cast)\r
5227                 {\r
5228                         int i, dir;\r
5229                         POSITION y, x;\r
5230                         bool flag;\r
5231 \r
5232                         for (i = 0; i < 3; i++)\r
5233                         {\r
5234                                 if (!tgt_pt(&x, &y)) return FALSE;\r
5235 \r
5236                                 flag = FALSE;\r
5237 \r
5238                                 for (dir = 0; dir < 8; dir++)\r
5239                                 {\r
5240                                         int dy = y + ddy_ddd[dir];\r
5241                                         int dx = x + ddx_ddd[dir];\r
5242                                         if (dir == 5) continue;\r
5243                                         if(cave[dy][dx].m_idx) flag = TRUE;\r
5244                                 }\r
5245 \r
5246                                 if (!cave_empty_bold(y, x) || (cave[y][x].info & CAVE_ICKY) ||\r
5247                                         (distance(y, x, p_ptr->y, p_ptr->x) > plev + 2))\r
5248                                 {\r
5249                                         msg_print(_("そこには移動できない。", "Can not teleport to there."));\r
5250                                         continue;\r
5251                                 }\r
5252                                 break;\r
5253                         }\r
5254 \r
5255                         if (flag && randint0(plev * plev / 2))\r
5256                         {\r
5257                                 teleport_player_to(y, x, 0L);\r
5258                         }\r
5259                         else\r
5260                         {\r
5261                                 msg_print(_("おっと!", "Oops!"));\r
5262                                 teleport_player(30, 0L);\r
5263                         }\r
5264 \r
5265                         add = FALSE;\r
5266                 }\r
5267                 break;\r
5268 \r
5269         case 30:\r
5270                 if (name) return _("反魔法結界", "Anti magic barrier");\r
5271                 if (desc) return _("視界内のモンスターの魔法を阻害するバリアを張る。", "Obstructs all magic spell of monsters in your sight.");\r
5272                 power = plev * 3 / 2;\r
5273                 if (info) return info_power(power);\r
5274                 if (cast)\r
5275                 {\r
5276                         msg_print(_("魔法を防ぐ呪いをかけた。", "You feel anyone can not cast spells except you."));\r
5277                 }\r
5278                 break;\r
5279 \r
5280         case 31:\r
5281                 if (name) return _("復讐の宣告", "Revenge sentence");\r
5282                 if (desc) return _("数ターン後にそれまで受けたダメージに応じた威力の地獄の劫火の弾を放つ。", \r
5283                         "Fires  a ball of hell fire to try revenging after few turns.");\r
5284                 power = HEX_REVENGE_POWER(p_ptr);\r
5285                 if (info) return info_damage(0, 0, power);\r
5286                 if (cast)\r
5287                 {\r
5288                         MAGIC_NUM2 r;\r
5289                         int a = 3 - (p_ptr->pspeed - 100) / 10;\r
5290                         r = 1 + randint1(2) + MAX(0, MIN(3, a));\r
5291 \r
5292                         if (HEX_REVENGE_TURN(p_ptr) > 0)\r
5293                         {\r
5294                                 msg_print(_("すでに復讐は宣告済みだ。", "You already pronounced your revenge."));\r
5295                                 return NULL;\r
5296                         }\r
5297 \r
5298                         HEX_REVENGE_TYPE(p_ptr) = 2;\r
5299                         HEX_REVENGE_TURN(p_ptr) = r;\r
5300                         msg_format(_("あなたは復讐を宣告した。あと %d ターン。", "You pronounce your revenge. %d turns left."), r);\r
5301                         add = FALSE;\r
5302                 }\r
5303                 if (cont)\r
5304                 {\r
5305                         HEX_REVENGE_TURN(p_ptr)--;\r
5306 \r
5307                         if (HEX_REVENGE_TURN(p_ptr) <= 0)\r
5308                         {\r
5309                                 int dir;\r
5310 \r
5311                                 if (power)\r
5312                                 {\r
5313                                         command_dir = 0;\r
5314 \r
5315                                         do\r
5316                                         {\r
5317                                                 msg_print(_("復讐の時だ!", "Time to revenge!"));\r
5318                                         }\r
5319                                         while (!get_aim_dir(&dir));\r
5320 \r
5321                                         fire_ball(GF_HELL_FIRE, dir, power, 1);\r
5322 \r
5323                                         if (p_ptr->wizard)\r
5324                                         {\r
5325                                                 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);\r
5326                                         }\r
5327                                 }\r
5328                                 else\r
5329                                 {\r
5330                                         msg_print(_("復讐する気が失せた。", "You are not a mood to revenge."));\r
5331                                 }\r
5332                                 HEX_REVENGE_POWER(p_ptr) = 0;\r
5333                         }\r
5334                 }\r
5335                 break;\r
5336         }\r
5337 \r
5338         /* start casting */\r
5339         if ((cast) && (add))\r
5340         {\r
5341                 /* add spell */\r
5342                 CASTING_HEX_FLAGS(p_ptr) |= 1L << (spell);\r
5343                 CASTING_HEX_NUM(p_ptr)++;\r
5344 \r
5345                 if (p_ptr->action != ACTION_SPELL) set_action(ACTION_SPELL);\r
5346         }\r
5347 \r
5348         /* Redraw status */\r
5349         if (!info)\r
5350         {\r
5351                 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);\r
5352                 p_ptr->redraw |= (PR_EXTRA | PR_HP | PR_MANA);\r
5353         }\r
5354 \r
5355         return "";\r
5356 }\r
5357 \r
5358 \r
5359 /*!\r
5360  * @brief 魔法処理のメインルーチン\r
5361  * @param realm 魔法領域のID\r
5362  * @param spell 各領域の魔法ID\r
5363  * @param mode 求める処理\r
5364  * @return 各領域魔法に各種テキストを求めた場合は文字列参照ポインタ、そうでない場合はNULLポインタを返す。\r
5365  */\r
5366 cptr do_spell(REALM_IDX realm, SPELL_IDX spell, BIT_FLAGS mode)\r
5367 {\r
5368         switch (realm)\r
5369         {\r
5370         case REALM_LIFE:     return do_life_spell(spell, mode);\r
5371         case REALM_SORCERY:  return do_sorcery_spell(spell, mode);\r
5372         case REALM_NATURE:   return do_nature_spell(spell, mode);\r
5373         case REALM_CHAOS:    return do_chaos_spell(spell, mode);\r
5374         case REALM_DEATH:    return do_death_spell(spell, mode);\r
5375         case REALM_TRUMP:    return do_trump_spell(spell, mode);\r
5376         case REALM_ARCANE:   return do_arcane_spell(spell, mode);\r
5377         case REALM_CRAFT:    return do_craft_spell(spell, mode);\r
5378         case REALM_DAEMON:   return do_daemon_spell(spell, mode);\r
5379         case REALM_CRUSADE:  return do_crusade_spell(spell, mode);\r
5380         case REALM_MUSIC:    return do_music_spell(spell, mode);\r
5381         case REALM_HISSATSU: return do_hissatsu_spell(spell, mode);\r
5382         case REALM_HEX:      return do_hex_spell(spell, mode);\r
5383         }\r
5384 \r
5385         return NULL;\r
5386 }\r