OSDN Git Service

fa4f2568320f23989eb5c7a5e50f98dce1863ca5
[hengband/hengband.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-life.h"\r
16 \r
17 /*!\r
18  * @brief\r
19  * 魔法の効果を「キャプション:ダイス+定数値」のフォーマットで出力する / Generate dice info string such as "foo 2d10"\r
20  * @param str キャプション\r
21  * @param dice ダイス数\r
22  * @param sides ダイス目\r
23  * @param base 固定値\r
24  * @return フォーマットに従い整形された文字列\r
25  */\r
26 cptr info_string_dice(cptr str, int dice, int sides, int base)\r
27 {\r
28         /* Fix value */\r
29         if (!dice)\r
30                 return format("%s%d", str, base);\r
31 \r
32         /* Dice only */\r
33         else if (!base)\r
34                 return format("%s%dd%d", str, dice, sides);\r
35 \r
36         /* Dice plus base value */\r
37         else\r
38                 return format("%s%dd%d%+d", str, dice, sides, base);\r
39 }\r
40 \r
41 \r
42 /*!\r
43  * @brief 魔法によるダメージを出力する / Generate damage-dice info string such as "dam 2d10"\r
44  * @param dice ダイス数\r
45  * @param sides ダイス目\r
46  * @param base 固定値\r
47  * @return フォーマットに従い整形された文字列\r
48  */\r
49 cptr info_damage(int dice, int sides, int base)\r
50 {\r
51         return info_string_dice(_("損傷:", "dam "), dice, sides, base);\r
52 }\r
53 \r
54 /*!\r
55  * @brief 魔法の効果時間を出力する / Generate duration info string such as "dur 20+1d20"\r
56  * @param base 固定値\r
57  * @param sides ダイス目\r
58  * @return フォーマットに従い整形された文字列\r
59  */\r
60 cptr info_duration(int base, int sides)\r
61 {\r
62         return format(_("期間:%d+1d%d", "dur %d+1d%d"), base, sides);\r
63 }\r
64 \r
65 /*!\r
66  * @brief 魔法の効果範囲を出力する / Generate range info string such as "range 5"\r
67  * @param range 効果範囲\r
68  * @return フォーマットに従い整形された文字列\r
69  */\r
70 cptr info_range(POSITION range)\r
71 {\r
72         return format(_("範囲:%d", "range %d"), range);\r
73 }\r
74 \r
75 /*!\r
76  * @brief 魔法による回復量を出力する / Generate heal info string such as "heal 2d8"\r
77  * @param dice ダイス数\r
78  * @param sides ダイス目\r
79  * @param base 固定値\r
80  * @return フォーマットに従い整形された文字列\r
81  */\r
82 cptr info_heal(int dice, int sides, int base)\r
83 {\r
84         return info_string_dice(_("回復:", "heal "), dice, sides, base);\r
85 }\r
86 \r
87 /*!\r
88  * @brief 魔法効果発動までの遅延ターンを出力する / Generate delay info string such as "delay 15+1d15"\r
89  * @param base 固定値\r
90  * @param sides ダイス目\r
91  * @return フォーマットに従い整形された文字列\r
92  */\r
93 cptr info_delay(int base, int sides)\r
94 {\r
95         return format(_("遅延:%d+1d%d", "delay %d+1d%d"), base, sides);\r
96 }\r
97 \r
98 \r
99 /*!\r
100  * @brief 魔法によるダメージを出力する(固定値&複数回処理) / Generate multiple-damage info string such as "dam 25 each"\r
101  * @param dam 固定値\r
102  * @return フォーマットに従い整形された文字列\r
103  */\r
104 cptr info_multi_damage(HIT_POINT dam)\r
105 {\r
106         return format(_("損傷:各%d", "dam %d each"), dam);\r
107 }\r
108 \r
109 \r
110 /*!\r
111  * @brief 魔法によるダメージを出力する(ダイスのみ&複数回処理) / Generate multiple-damage-dice info string such as "dam 5d2 each"\r
112  * @param dice ダイス数\r
113  * @param sides ダイス目\r
114  * @return フォーマットに従い整形された文字列\r
115  */\r
116 cptr info_multi_damage_dice(int dice, int sides)\r
117 {\r
118         return format(_("損傷:各%dd%d", "dam %dd%d each"), dice, sides);\r
119 }\r
120 \r
121 /*!\r
122  * @brief 魔法による一般的な効力値を出力する(固定値) / Generate power info string such as "power 100"\r
123  * @param power 固定値\r
124  * @return フォーマットに従い整形された文字列\r
125  */\r
126 cptr info_power(int power)\r
127 {\r
128         return format(_("効力:%d", "power %d"), power);\r
129 }\r
130 \r
131 \r
132 /*!\r
133  * @brief 魔法による一般的な効力値を出力する(ダイス値) / Generate power info string such as "power 100"\r
134  * @param dice ダイス数\r
135  * @param sides ダイス目\r
136  * @return フォーマットに従い整形された文字列\r
137  */\r
138 /*\r
139  * Generate power info string such as "power 1d100"\r
140  */\r
141 cptr info_power_dice(int dice, int sides)\r
142 {\r
143         return format(_("効力:%dd%d", "power %dd%d"), dice, sides);\r
144 }\r
145 \r
146 \r
147 /*!\r
148  * @brief 魔法の効果半径を出力する / Generate radius info string such as "rad 100"\r
149  * @param rad 効果半径\r
150  * @return フォーマットに従い整形された文字列\r
151  */\r
152 cptr info_radius(int rad)\r
153 {\r
154         return format(_("半径:%d", "rad %d"), rad);\r
155 }\r
156 \r
157 \r
158 /*!\r
159  * @brief 魔法効果の限界重量を出力する / Generate weight info string such as "max wgt 15"\r
160  * @param weight 最大重量\r
161  * @return フォーマットに従い整形された文字列\r
162  */\r
163 cptr info_weight(int weight)\r
164 {\r
165 #ifdef JP\r
166         return format("最大重量:%d.%dkg", lbtokg1(weight), lbtokg2(weight));\r
167 #else\r
168         return format("max wgt %d", weight/10);\r
169 #endif\r
170 }\r
171 \r
172 \r
173 /*!\r
174  * @brief 歌の開始を処理する / Start singing if the player is a Bard \r
175  * @param spell 領域魔法としてのID\r
176  * @param song 魔法効果のID\r
177  * @return なし\r
178  */\r
179 static void start_singing(SPELL_IDX spell, MAGIC_NUM1 song)\r
180 {\r
181         /* Remember the song index */\r
182         SINGING_SONG_EFFECT(p_ptr) = (MAGIC_NUM1)song;\r
183 \r
184         /* Remember the index of the spell which activated the song */\r
185         SINGING_SONG_ID(p_ptr) = (MAGIC_NUM2)spell;\r
186 \r
187 \r
188         /* Now the player is singing */\r
189         set_action(ACTION_SING);\r
190 \r
191 \r
192         /* Recalculate bonuses */\r
193         p_ptr->update |= (PU_BONUS);\r
194 \r
195         /* Redraw status bar */\r
196         p_ptr->redraw |= (PR_STATUS);\r
197 }\r
198 \r
199 /*!\r
200  * @brief 歌の停止を処理する / Stop singing if the player is a Bard \r
201  * @return なし\r
202  */\r
203 void stop_singing(void)\r
204 {\r
205         if (p_ptr->pclass != CLASS_BARD) return;\r
206 \r
207         /* Are there interupted song? */\r
208         if (INTERUPTING_SONG_EFFECT(p_ptr))\r
209         {\r
210                 /* Forget interupted song */\r
211                 INTERUPTING_SONG_EFFECT(p_ptr) = MUSIC_NONE;\r
212                 return;\r
213         }\r
214 \r
215         /* The player is singing? */\r
216         if (!SINGING_SONG_EFFECT(p_ptr)) return;\r
217 \r
218         /* Hack -- if called from set_action(), avoid recursive loop */\r
219         if (p_ptr->action == ACTION_SING) set_action(ACTION_NONE);\r
220 \r
221         /* Message text of each song or etc. */\r
222         do_spell(REALM_MUSIC, SINGING_SONG_ID(p_ptr), SPELL_STOP);\r
223 \r
224         SINGING_SONG_EFFECT(p_ptr) = MUSIC_NONE;\r
225         SINGING_SONG_ID(p_ptr) = 0;\r
226 \r
227         /* Recalculate bonuses */\r
228         p_ptr->update |= (PU_BONUS);\r
229 \r
230         /* Redraw status bar */\r
231         p_ptr->redraw |= (PR_STATUS);\r
232 }\r
233 \r
234 \r
235 \r
236 /*!\r
237  * @brief 仙術領域魔法の各処理を行う\r
238  * @param spell 魔法ID\r
239  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)\r
240  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。\r
241  */\r
242 static cptr do_sorcery_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
243 {\r
244         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
245         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
246         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
247         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
248 \r
249         int dir;\r
250         int plev = p_ptr->lev;\r
251 \r
252         switch (spell)\r
253         {\r
254         case 0:\r
255                 if (name) return _("モンスター感知", "Detect Monsters");\r
256                 if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");\r
257     \r
258                 {\r
259                         int rad = DETECT_RAD_DEFAULT;\r
260 \r
261                         if (info) return info_radius(rad);\r
262 \r
263                         if (cast)\r
264                         {\r
265                                 detect_monsters_normal(rad);\r
266                         }\r
267                 }\r
268                 break;\r
269 \r
270         case 1:\r
271                 if (name) return _("ショート・テレポート", "Phase Door");\r
272                 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");\r
273     \r
274                 {\r
275                         POSITION range = 10;\r
276 \r
277                         if (info) return info_range(range);\r
278 \r
279                         if (cast)\r
280                         {\r
281                                 teleport_player(range, 0L);\r
282                         }\r
283                 }\r
284                 break;\r
285 \r
286         case 2:\r
287                 if (name) return _("罠と扉感知", "Detect Doors and Traps");\r
288                 if (desc) return _("近くの全ての扉と罠を感知する。", "Detects traps, doors, and stairs in your vicinity.");\r
289     \r
290                 {\r
291                         int rad = DETECT_RAD_DEFAULT;\r
292 \r
293                         if (info) return info_radius(rad);\r
294 \r
295                         if (cast)\r
296                         {\r
297                                 detect_traps(rad, TRUE);\r
298                                 detect_doors(rad);\r
299                                 detect_stairs(rad);\r
300                         }\r
301                 }\r
302                 break;\r
303 \r
304         case 3:\r
305                 if (name) return _("ライト・エリア", "Light Area");\r
306                 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");\r
307     \r
308                 {\r
309                         int dice = 2;\r
310                         int sides = plev / 2;\r
311                         int rad = plev / 10 + 1;\r
312 \r
313                         if (info) return info_damage(dice, sides, 0);\r
314 \r
315                         if (cast)\r
316                         {\r
317                                 lite_area(damroll(dice, sides), rad);\r
318                         }\r
319                 }\r
320                 break;\r
321 \r
322         case 4:\r
323                 if (name) return _("パニック・モンスター", "Confuse Monster");\r
324                 if (desc) return _("モンスター1体を混乱させる。抵抗されると無効。", "Attempts to confuse a monster.");\r
325     \r
326                 {\r
327                         int power = (plev * 3) / 2;\r
328 \r
329                         if (info) return info_power(power);\r
330 \r
331                         if (cast)\r
332                         {\r
333                                 if (!get_aim_dir(&dir)) return NULL;\r
334 \r
335                                 confuse_monster(dir, power);\r
336                         }\r
337                 }\r
338                 break;\r
339 \r
340         case 5:\r
341                 if (name) return _("テレポート", "Teleport");\r
342                 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");\r
343     \r
344                 {\r
345                         POSITION range = plev * 5;\r
346 \r
347                         if (info) return info_range(range);\r
348 \r
349                         if (cast)\r
350                         {\r
351                                 teleport_player(range, 0L);\r
352                         }\r
353                 }\r
354                 break;\r
355 \r
356         case 6:\r
357                 if (name) return _("スリープ・モンスター", "Sleep Monster");\r
358                 if (desc) return _("モンスター1体を眠らせる。抵抗されると無効。", "Attempts to sleep a monster.");\r
359     \r
360                 {\r
361                         int power = plev;\r
362 \r
363                         if (info) return info_power(power);\r
364 \r
365                         if (cast)\r
366                         {\r
367                                 if (!get_aim_dir(&dir)) return NULL;\r
368 \r
369                                 sleep_monster(dir, plev);\r
370                         }\r
371                 }\r
372                 break;\r
373 \r
374         case 7:\r
375                 if (name) return _("魔力充填", "Recharging");\r
376                 if (desc) return _("杖/魔法棒の充填回数を増やすか、充填中のロッドの充填時間を減らす。", "Recharges staffs, wands or rods.");\r
377     \r
378                 {\r
379                         int power = plev * 4;\r
380 \r
381                         if (info) return info_power(power);\r
382 \r
383                         if (cast)\r
384                         {\r
385                                 if (!recharge(power)) return NULL;\r
386                         }\r
387                 }\r
388                 break;\r
389 \r
390         case 8:\r
391                 if (name) return _("魔法の地図", "Magic Mapping");\r
392                 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");\r
393     \r
394                 {\r
395                         int rad = DETECT_RAD_MAP;\r
396 \r
397                         if (info) return info_radius(rad);\r
398 \r
399                         if (cast)\r
400                         {\r
401                                 map_area(rad);\r
402                         }\r
403                 }\r
404                 break;\r
405 \r
406         case 9:\r
407                 if (name) return _("鑑定", "Identify");\r
408                 if (desc) return _("アイテムを識別する。", "Identifies an item.");\r
409     \r
410                 {\r
411                         if (cast)\r
412                         {\r
413                                 if (!ident_spell(FALSE)) return NULL;\r
414                         }\r
415                 }\r
416                 break;\r
417 \r
418         case 10:\r
419                 if (name) return _("スロウ・モンスター", "Slow Monster");\r
420                 if (desc) return _("モンスター1体を減速さる。抵抗されると無効。", "Attempts to slow a monster.");\r
421     \r
422                 {\r
423                         int power = plev;\r
424 \r
425                         if (info) return info_power(power);\r
426 \r
427                         if (cast)\r
428                         {\r
429                                 if (!get_aim_dir(&dir)) return NULL;\r
430 \r
431                                 slow_monster(dir, plev);\r
432                         }\r
433                 }\r
434                 break;\r
435 \r
436         case 11:\r
437                 if (name) return _("周辺スリープ", "Mass Sleep");\r
438                 if (desc) return _("視界内の全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep all monsters in sight.");\r
439     \r
440                 {\r
441                         int power = plev;\r
442 \r
443                         if (info) return info_power(power);\r
444 \r
445                         if (cast)\r
446                         {\r
447                                 sleep_monsters(plev);\r
448                         }\r
449                 }\r
450                 break;\r
451 \r
452         case 12:\r
453                 if (name) return _("テレポート・モンスター", "Teleport Away");\r
454                 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");\r
455     \r
456                 {\r
457                         int power = plev;\r
458 \r
459                         if (info) return info_power(power);\r
460 \r
461                         if (cast)\r
462                         {\r
463                                 if (!get_aim_dir(&dir)) return NULL;\r
464 \r
465                                 fire_beam(GF_AWAY_ALL, dir, power);\r
466                         }\r
467                 }\r
468                 break;\r
469 \r
470         case 13:\r
471                 if (name) return _("スピード", "Haste Self");\r
472                 if (desc) return _("一定時間、加速する。", "Hastes you for a while.");\r
473     \r
474                 {\r
475                         int base = plev;\r
476                         int sides = 20 + plev;\r
477 \r
478                         if (info) return info_duration(base, sides);\r
479 \r
480                         if (cast)\r
481                         {\r
482                                 set_fast(randint1(sides) + base, FALSE);\r
483                         }\r
484                 }\r
485                 break;\r
486 \r
487         case 14:\r
488                 if (name) return _("真・感知", "Detection True");\r
489                 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",\r
490                         "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");\r
491     \r
492                 {\r
493                         int rad = DETECT_RAD_DEFAULT;\r
494 \r
495                         if (info) return info_radius(rad);\r
496 \r
497                         if (cast)\r
498                         {\r
499                                 detect_all(rad);\r
500                         }\r
501                 }\r
502                 break;\r
503 \r
504         case 15:\r
505                 if (name) return _("真・鑑定", "Identify True");\r
506                 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");\r
507     \r
508                 {\r
509                         if (cast)\r
510                         {\r
511                                 if (!identify_fully(FALSE)) return NULL;\r
512                         }\r
513                 }\r
514                 break;\r
515 \r
516         case 16:\r
517                 if (name) return _("物体と財宝感知", "Detect items and Treasure");\r
518                 if (desc) return _("近くの全てのアイテムと財宝を感知する。", "Detects all treasures and items in your vicinity.");\r
519     \r
520                 {\r
521                         int rad = DETECT_RAD_DEFAULT;\r
522 \r
523                         if (info) return info_radius(rad);\r
524 \r
525                         if (cast)\r
526                         {\r
527                                 detect_objects_normal(rad);\r
528                                 detect_treasure(rad);\r
529                                 detect_objects_gold(rad);\r
530                         }\r
531                 }\r
532                 break;\r
533 \r
534         case 17:\r
535                 if (name) return _("チャーム・モンスター", "Charm Monster");\r
536                 if (desc) return _("モンスター1体を魅了する。抵抗されると無効。", "Attempts to charm a monster.");\r
537     \r
538                 {\r
539                         int power = plev;\r
540 \r
541                         if (info) return info_power(power);\r
542 \r
543                         if (cast)\r
544                         {\r
545                                 if (!get_aim_dir(&dir)) return NULL;\r
546 \r
547                                 charm_monster(dir, power);\r
548                         }\r
549                 }\r
550                 break;\r
551 \r
552         case 18:\r
553                 if (name) return _("精神感知", "Sense Minds");\r
554                 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");\r
555     \r
556                 {\r
557                         int base = 25;\r
558                         int sides = 30;\r
559 \r
560                         if (info) return info_duration(base, sides);\r
561 \r
562                         if (cast)\r
563                         {\r
564                                 set_tim_esp(randint1(sides) + base, FALSE);\r
565                         }\r
566                 }\r
567                 break;\r
568 \r
569         case 19:\r
570                 if (name) return _("街移動", "Teleport to town");\r
571                 if (desc) return _("街へ移動する。地上にいるときしか使えない。", "Teleport to a town which you choose in a moment. Can only be used outdoors.");\r
572     \r
573                 {\r
574                         if (cast)\r
575                         {\r
576                                 if (!tele_town()) return NULL;\r
577                         }\r
578                 }\r
579                 break;\r
580 \r
581         case 20:\r
582                 if (name) return _("自己分析", "Self Knowledge");\r
583                 if (desc) return _("現在の自分の状態を完全に知る。",\r
584                         "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");\r
585     \r
586                 {\r
587                         if (cast)\r
588                         {\r
589                                 self_knowledge();\r
590                         }\r
591                 }\r
592                 break;\r
593 \r
594         case 21:\r
595                 if (name) return _("テレポート・レベル", "Teleport Level");\r
596                 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");\r
597     \r
598                 {\r
599                         if (cast)\r
600                         {\r
601                                 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;\r
602                                 teleport_level(0);\r
603                         }\r
604                 }\r
605                 break;\r
606 \r
607         case 22:\r
608                 if (name) return _("帰還の呪文", "Word of Recall");\r
609                 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。", \r
610                         "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");\r
611     \r
612                 {\r
613                         int base = 15;\r
614                         int sides = 20;\r
615 \r
616                         if (info) return info_delay(base, sides);\r
617 \r
618                         if (cast)\r
619                         {\r
620                                 if (!word_of_recall()) return NULL;\r
621                         }\r
622                 }\r
623                 break;\r
624 \r
625         case 23:\r
626                 if (name) return _("次元の扉", "Dimension Door");\r
627                 if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleport to given location.");\r
628     \r
629                 {\r
630                         POSITION range = plev / 2 + 10;\r
631 \r
632                         if (info) return info_range(range);\r
633 \r
634                         if (cast)\r
635                         {\r
636                                 msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));\r
637                                 if (!dimension_door()) return NULL;\r
638                         }\r
639                 }\r
640                 break;\r
641 \r
642         case 24:\r
643                 if (name) return _("調査", "Probing");\r
644                 if (desc) return _("モンスターの属性、残り体力、最大体力、スピード、正体を知る。",\r
645                         "Proves all monsters' alignment, HP, speed and their true character.");\r
646     \r
647                 {\r
648                         if (cast)\r
649                         {\r
650                                 probing();\r
651                         }\r
652                 }\r
653                 break;\r
654 \r
655         case 25:\r
656                 if (name) return _("爆発のルーン", "Explosive Rune");\r
657                 if (desc) return _("自分のいる床の上に、モンスターが通ると爆発してダメージを与えるルーンを描く。", \r
658                         "Sets a glyph under you. The glyph will explode when a monster moves on it.");\r
659     \r
660                 {\r
661                         int dice = 7;\r
662                         int sides = 7;\r
663                         int base = plev;\r
664 \r
665                         if (info) return info_damage(dice, sides, base);\r
666 \r
667                         if (cast)\r
668                         {\r
669                                 explosive_rune();\r
670                         }\r
671                 }\r
672                 break;\r
673 \r
674         case 26:\r
675                 if (name) return _("念動力", "Telekinesis");\r
676                 if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");\r
677     \r
678                 {\r
679                         int weight = plev * 15;\r
680 \r
681                         if (info) return info_weight(weight);\r
682 \r
683                         if (cast)\r
684                         {\r
685                                 if (!get_aim_dir(&dir)) return NULL;\r
686 \r
687                                 fetch(dir, weight, FALSE);\r
688                         }\r
689                 }\r
690                 break;\r
691 \r
692         case 27:\r
693                 if (name) return _("千里眼", "Clairvoyance");\r
694                 if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。さらに、一定時間テレパシー能力を得る。",\r
695                         "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");\r
696     \r
697                 {\r
698                         int base = 25;\r
699                         int sides = 30;\r
700 \r
701                         if (info) return info_duration(base, sides);\r
702 \r
703                         if (cast)\r
704                         {\r
705                                 chg_virtue(V_KNOWLEDGE, 1);\r
706                                 chg_virtue(V_ENLIGHTEN, 1);\r
707 \r
708                                 wiz_lite(FALSE);\r
709 \r
710                                 if (!p_ptr->telepathy)\r
711                                 {\r
712                                         set_tim_esp(randint1(sides) + base, FALSE);\r
713                                 }\r
714                         }\r
715                 }\r
716                 break;\r
717 \r
718         case 28:\r
719                 if (name) return _("魅了の視線", "Charm monsters");\r
720                 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");\r
721     \r
722                 {\r
723                         int power = plev * 2;\r
724 \r
725                         if (info) return info_power(power);\r
726 \r
727                         if (cast)\r
728                         {\r
729                                 charm_monsters(power);\r
730                         }\r
731                 }\r
732                 break;\r
733 \r
734         case 29:\r
735                 if (name) return _("錬金術", "Alchemy");\r
736                 if (desc) return _("アイテム1つをお金に変える。", "Turns an item into 1/3 of its value in gold.");\r
737     \r
738                 {\r
739                         if (cast)\r
740                         {\r
741                                 if (!alchemy()) return NULL;\r
742                         }\r
743                 }\r
744                 break;\r
745 \r
746         case 30:\r
747                 if (name) return _("怪物追放", "Banishment");\r
748                 if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");\r
749     \r
750                 {\r
751                         int power = plev * 4;\r
752 \r
753                         if (info) return info_power(power);\r
754 \r
755                         if (cast)\r
756                         {\r
757                                 banish_monsters(power);\r
758                         }\r
759                 }\r
760                 break;\r
761 \r
762         case 31:\r
763                 if (name) return _("無傷の球", "Globe of Invulnerability");\r
764                 if (desc) return _("一定時間、ダメージを受けなくなるバリアを張る。切れた瞬間に少しターンを消費するので注意。",\r
765                         "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks or duration time is exceeded.");\r
766     \r
767                 {\r
768                         int base = 4;\r
769 \r
770                         if (info) return info_duration(base, base);\r
771 \r
772                         if (cast)\r
773                         {\r
774                                 set_invuln(randint1(base) + base, FALSE);\r
775                         }\r
776                 }\r
777                 break;\r
778         }\r
779 \r
780         return "";\r
781 }\r
782 \r
783 \r
784 /*!\r
785  * @brief 自然領域魔法の各処理を行う\r
786  * @param spell 魔法ID\r
787  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)\r
788  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。\r
789  */\r
790 static cptr do_nature_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
791 {\r
792         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
793         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
794         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
795         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
796 \r
797         static const char s_dam[] = _("損傷:", "dam ");\r
798         static const char s_rng[] = _("射程", "rng ");\r
799 \r
800         int dir;\r
801         int plev = p_ptr->lev;\r
802 \r
803         switch (spell)\r
804         {\r
805         case 0:\r
806                 if (name) return _("モンスター感知", "Detect Creatures");\r
807                 if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");\r
808     \r
809                 {\r
810                         int rad = DETECT_RAD_DEFAULT;\r
811 \r
812                         if (info) return info_radius(rad);\r
813 \r
814                         if (cast)\r
815                         {\r
816                                 detect_monsters_normal(rad);\r
817                         }\r
818                 }\r
819                 break;\r
820 \r
821         case 1:\r
822                 if (name) return _("稲妻", "Lightning");\r
823                 if (desc) return _("電撃の短いビームを放つ。", "Fires a short beam of lightning.");\r
824     \r
825                 {\r
826                         int dice = 3 + (plev - 1) / 5;\r
827                         int sides = 4;\r
828                         POSITION range = plev / 6 + 2;\r
829 \r
830                         if (info) return format("%s%dd%d %s%d", s_dam, dice, sides, s_rng, range);\r
831 \r
832                         if (cast)\r
833                         {\r
834                                 project_length = range;\r
835 \r
836                                 if (!get_aim_dir(&dir)) return NULL;\r
837 \r
838                                 fire_beam(GF_ELEC, dir, damroll(dice, sides));\r
839                         }\r
840                 }\r
841                 break;\r
842 \r
843         case 2:\r
844                 if (name) return _("罠と扉感知", "Detect Doors and Traps");\r
845                 if (desc) return _("近くの全ての罠と扉を感知する。", "Detects traps, doors, and stairs in your vicinity.");\r
846     \r
847                 {\r
848                         int rad = DETECT_RAD_DEFAULT;\r
849 \r
850                         if (info) return info_radius(rad);\r
851 \r
852                         if (cast)\r
853                         {\r
854                                 detect_traps(rad, TRUE);\r
855                                 detect_doors(rad);\r
856                                 detect_stairs(rad);\r
857                         }\r
858                 }\r
859                 break;\r
860 \r
861         case 3:\r
862                 if (name) return _("食糧生成", "Produce Food");\r
863                 if (desc) return _("食料を一つ作り出す。", "Produces a Ration of Food.");\r
864     \r
865                 {\r
866                         if (cast)\r
867                         {\r
868                                 object_type forge, *q_ptr = &forge;\r
869                                 msg_print(_("食料を生成した。", "A food ration is produced."));\r
870 \r
871                                 /* Create the food ration */\r
872                                 object_prep(q_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION));\r
873 \r
874                                 /* Drop the object from heaven */\r
875                                 drop_near(q_ptr, -1, p_ptr->y, p_ptr->x);\r
876                         }\r
877                 }\r
878                 break;\r
879 \r
880         case 4:\r
881                 if (name) return _("日の光", "Daylight");\r
882                 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");\r
883     \r
884                 {\r
885                         int dice = 2;\r
886                         int sides = plev / 2;\r
887                         int rad = (plev / 10) + 1;\r
888 \r
889                         if (info) return info_damage(dice, sides, 0);\r
890 \r
891                         if (cast)\r
892                         {\r
893                                 lite_area(damroll(dice, sides), rad);\r
894 \r
895                                 if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)\r
896                                 {\r
897                                         msg_print(_("日の光があなたの肉体を焦がした!", "The daylight scorches your flesh!"));\r
898                                         take_hit(DAMAGE_NOESCAPE, damroll(2, 2), _("日の光", "daylight"), -1);\r
899                                 }\r
900                         }\r
901                 }\r
902                 break;\r
903 \r
904         case 5:\r
905                 if (name) return _("動物習し", "Animal Taming");\r
906                 if (desc) return _("動物1体を魅了する。抵抗されると無効。", "Attempts to charm an animal.");\r
907     \r
908                 {\r
909                         int power = plev;\r
910 \r
911                         if (info) return info_power(power);\r
912 \r
913                         if (cast)\r
914                         {\r
915                                 if (!get_aim_dir(&dir)) return NULL;\r
916 \r
917                                 charm_animal(dir, power);\r
918                         }\r
919                 }\r
920                 break;\r
921 \r
922         case 6:\r
923                 if (name) return _("環境への耐性", "Resist Environment");\r
924                 if (desc) return _("一定時間、冷気、炎、電撃に対する耐性を得る。装備による耐性に累積する。",\r
925                         "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");\r
926     \r
927                 {\r
928                         int base = 20;\r
929 \r
930                         if (info) return info_duration(base, base);\r
931 \r
932                         if (cast)\r
933                         {\r
934                                 set_oppose_cold(randint1(base) + base, FALSE);\r
935                                 set_oppose_fire(randint1(base) + base, FALSE);\r
936                                 set_oppose_elec(randint1(base) + base, FALSE);\r
937                         }\r
938                 }\r
939                 break;\r
940 \r
941         case 7:\r
942                 if (name) return _("傷と毒治療", "Cure Wounds & Poison");\r
943                 if (desc) return _("怪我を全快させ、毒を体から完全に取り除き、体力を少し回復させる。", "Heals all cut and poison status. Heals HP a little.");\r
944     \r
945                 {\r
946                         int dice = 2;\r
947                         int sides = 8;\r
948 \r
949                         if (info) return info_heal(dice, sides, 0);\r
950 \r
951                         if (cast)\r
952                         {\r
953                                 hp_player(damroll(dice, sides));\r
954                                 set_cut(0);\r
955                                 set_poisoned(0);\r
956                         }\r
957                 }\r
958                 break;\r
959 \r
960         case 8:\r
961                 if (name) return _("岩石溶解", "Stone to Mud");\r
962                 if (desc) return _("壁を溶かして床にする。", "Turns one rock square to mud.");\r
963     \r
964                 {\r
965                         int dice = 1;\r
966                         int sides = 30;\r
967                         int base = 20;\r
968 \r
969                         if (info) return info_damage(dice, sides, base);\r
970 \r
971                         if (cast)\r
972                         {\r
973                                 if (!get_aim_dir(&dir)) return NULL;\r
974 \r
975                                 wall_to_mud(dir, 20 + randint1(30));\r
976                         }\r
977                 }\r
978                 break;\r
979 \r
980         case 9:\r
981                 if (name) return _("アイス・ボルト", "Frost Bolt");\r
982                 if (desc) return _("冷気のボルトもしくはビームを放つ。", "Fires a bolt or beam of cold.");\r
983     \r
984                 {\r
985                         int dice = 3 + (plev - 5) / 4;\r
986                         int sides = 8;\r
987 \r
988                         if (info) return info_damage(dice, sides, 0);\r
989 \r
990                         if (cast)\r
991                         {\r
992                                 if (!get_aim_dir(&dir)) return NULL;\r
993                                 fire_bolt_or_beam(beam_chance() - 10, GF_COLD, dir, damroll(dice, sides));\r
994                         }\r
995                 }\r
996                 break;\r
997 \r
998         case 10:\r
999                 if (name) return _("自然の覚醒", "Nature Awareness");\r
1000                 if (desc) return _("周辺の地形を感知し、近くの罠、扉、階段、全てのモンスターを感知する。",\r
1001                         "Maps nearby area. Detects all monsters, traps, doors and stairs.");\r
1002     \r
1003                 {\r
1004                         int rad1 = DETECT_RAD_MAP;\r
1005                         int rad2 = DETECT_RAD_DEFAULT;\r
1006 \r
1007                         if (info) return info_radius(MAX(rad1, rad2));\r
1008 \r
1009                         if (cast)\r
1010                         {\r
1011                                 map_area(rad1);\r
1012                                 detect_traps(rad2, TRUE);\r
1013                                 detect_doors(rad2);\r
1014                                 detect_stairs(rad2);\r
1015                                 detect_monsters_normal(rad2);\r
1016                         }\r
1017                 }\r
1018                 break;\r
1019 \r
1020         case 11:\r
1021                 if (name) return _("ファイア・ボルト", "Fire Bolt");\r
1022                 if (desc) return _("火炎のボルトもしくはビームを放つ。", "Fires a bolt or beam of fire.");\r
1023     \r
1024                 {\r
1025                         int dice = 5 + (plev - 5) / 4;\r
1026                         int sides = 8;\r
1027 \r
1028                         if (info) return info_damage(dice, sides, 0);\r
1029 \r
1030                         if (cast)\r
1031                         {\r
1032                                 if (!get_aim_dir(&dir)) return NULL;\r
1033                                 fire_bolt_or_beam(beam_chance() - 10, GF_FIRE, dir, damroll(dice, sides));\r
1034                         }\r
1035                 }\r
1036                 break;\r
1037 \r
1038         case 12:\r
1039                 if (name) return _("太陽光線", "Ray of Sunlight");\r
1040                 if (desc) return _("光線を放つ。光りを嫌うモンスターに効果がある。", "Fires a beam of light which damages to light-sensitive monsters.");\r
1041     \r
1042                 {\r
1043                         int dice = 6;\r
1044                         int sides = 8;\r
1045 \r
1046                         if (info) return info_damage(dice, sides, 0);\r
1047 \r
1048                         if (cast)\r
1049                         {\r
1050                                 if (!get_aim_dir(&dir)) return NULL;\r
1051                                 msg_print(_("太陽光線が現れた。", "A line of sunlight appears."));\r
1052                                 lite_line(dir, damroll(6, 8));\r
1053                         }\r
1054                 }\r
1055                 break;\r
1056 \r
1057         case 13:\r
1058                 if (name) return _("足かせ", "Entangle");\r
1059                 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");\r
1060     \r
1061                 {\r
1062                         int power = plev;\r
1063 \r
1064                         if (info) return info_power(power);\r
1065 \r
1066                         if (cast)\r
1067                         {\r
1068                                 slow_monsters(plev);\r
1069                         }\r
1070                 }\r
1071                 break;\r
1072 \r
1073         case 14:\r
1074                 if (name) return _("動物召喚", "Summon Animal");\r
1075                 if (desc) return _("動物を1体召喚する。", "Summons an animal.");\r
1076     \r
1077                 {\r
1078                         if (cast)\r
1079                         {\r
1080                                 if (!(summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_ANIMAL_RANGER, (PM_ALLOW_GROUP | PM_FORCE_PET))))\r
1081                                 {\r
1082                                         msg_print(_("動物は現れなかった。", "No animals arrive."));\r
1083                                 }\r
1084                                 break;\r
1085                         }\r
1086                 }\r
1087                 break;\r
1088 \r
1089         case 15:\r
1090                 if (name) return _("薬草治療", "Herbal Healing");\r
1091                 if (desc) return _("体力を大幅に回復させ、負傷、朦朧状態、毒から全快する。", "Heals HP greatly. And heals cut, stun and poison completely.");\r
1092     \r
1093                 {\r
1094                         int heal = 500;\r
1095 \r
1096                         if (info) return info_heal(0, 0, heal);\r
1097 \r
1098                         if (cast)\r
1099                         {\r
1100                                 hp_player(heal);\r
1101                                 set_stun(0);\r
1102                                 set_cut(0);\r
1103                                 set_poisoned(0);\r
1104                         }\r
1105                 }\r
1106                 break;\r
1107 \r
1108         case 16:\r
1109                 if (name) return _("階段生成", "Stair Building");\r
1110                 if (desc) return _("自分のいる位置に階段を作る。", "Creates a stair which goes down or up.");\r
1111     \r
1112                 {\r
1113                         if (cast)\r
1114                         {\r
1115                                 stair_creation();\r
1116                         }\r
1117                 }\r
1118                 break;\r
1119 \r
1120         case 17:\r
1121                 if (name) return _("肌石化", "Stone Skin");\r
1122                 if (desc) return _("一定時間、ACを上昇させる。", "Gives bonus to AC for a while.");\r
1123     \r
1124                 {\r
1125                         int base = 20;\r
1126                         int sides = 30;\r
1127 \r
1128                         if (info) return info_duration(base, sides);\r
1129 \r
1130                         if (cast)\r
1131                         {\r
1132                                 set_shield(randint1(sides) + base, FALSE);\r
1133                         }\r
1134                 }\r
1135                 break;\r
1136 \r
1137         case 18:\r
1138                 if (name) return _("真・耐性", "Resistance True");\r
1139                 if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。", \r
1140                         "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
1141     \r
1142                 {\r
1143                         int base = 20;\r
1144 \r
1145                         if (info) return info_duration(base, base);\r
1146 \r
1147                         if (cast)\r
1148                         {\r
1149                                 set_oppose_acid(randint1(base) + base, FALSE);\r
1150                                 set_oppose_elec(randint1(base) + base, FALSE);\r
1151                                 set_oppose_fire(randint1(base) + base, FALSE);\r
1152                                 set_oppose_cold(randint1(base) + base, FALSE);\r
1153                                 set_oppose_pois(randint1(base) + base, FALSE);\r
1154                         }\r
1155                 }\r
1156                 break;\r
1157 \r
1158         case 19:\r
1159                 if (name) return _("森林創造", "Forest Creation");\r
1160                 if (desc) return _("周囲に木を作り出す。", "Creates trees in all adjacent squares.");\r
1161     \r
1162                 {\r
1163                         if (cast)\r
1164                         {\r
1165                                 tree_creation();\r
1166                         }\r
1167                 }\r
1168                 break;\r
1169 \r
1170         case 20:\r
1171                 if (name) return _("動物友和", "Animal Friendship");\r
1172                 if (desc) return _("視界内の全ての動物を魅了する。抵抗されると無効。", "Attempts to charm all animals in sight.");\r
1173     \r
1174                 {\r
1175                         int power = plev * 2;\r
1176 \r
1177                         if (info) return info_power(power);\r
1178 \r
1179                         if (cast)\r
1180                         {\r
1181                                 charm_animals(power);\r
1182                         }\r
1183                 }\r
1184                 break;\r
1185 \r
1186         case 21:\r
1187                 if (name) return _("試金石", "Stone Tell");\r
1188                 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");\r
1189     \r
1190                 {\r
1191                         if (cast)\r
1192                         {\r
1193                                 if (!identify_fully(FALSE)) return NULL;\r
1194                         }\r
1195                 }\r
1196                 break;\r
1197 \r
1198         case 22:\r
1199                 if (name) return _("石の壁", "Wall of Stone");\r
1200                 if (desc) return _("自分の周囲に花崗岩の壁を作る。", "Creates granite walls in all adjacent squares.");\r
1201     \r
1202                 {\r
1203                         if (cast)\r
1204                         {\r
1205                                 wall_stone();\r
1206                         }\r
1207                 }\r
1208                 break;\r
1209 \r
1210         case 23:\r
1211                 if (name) return _("腐食防止", "Protect from Corrosion");\r
1212                 if (desc) return _("アイテムを酸で傷つかないよう加工する。", "Makes an equipment acid-proof.");\r
1213     \r
1214                 {\r
1215                         if (cast)\r
1216                         {\r
1217                                 if (!rustproof()) return NULL;\r
1218                         }\r
1219                 }\r
1220                 break;\r
1221 \r
1222         case 24:\r
1223                 if (name) return _("地震", "Earthquake");\r
1224                 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。", \r
1225                         "Shakes dungeon structure, and results in random swapping of floors and walls.");\r
1226     \r
1227                 {\r
1228                         int rad = 10;\r
1229 \r
1230                         if (info) return info_radius(rad);\r
1231 \r
1232                         if (cast)\r
1233                         {\r
1234                                 earthquake(p_ptr->y, p_ptr->x, rad);\r
1235                         }\r
1236                 }\r
1237                 break;\r
1238 \r
1239         case 25:\r
1240                 if (name) return _("カマイタチ", "Cyclone");\r
1241                 if (desc) return _("全方向に向かって攻撃する。", "Attacks all adjacent monsters.");\r
1242     \r
1243                 {\r
1244                         if (cast)\r
1245                         {\r
1246                                 int y = 0, x = 0;\r
1247                                 cave_type       *c_ptr;\r
1248                                 monster_type    *m_ptr;\r
1249 \r
1250                                 for (dir = 0; dir < 8; dir++)\r
1251                                 {\r
1252                                         y = p_ptr->y + ddy_ddd[dir];\r
1253                                         x = p_ptr->x + ddx_ddd[dir];\r
1254                                         c_ptr = &cave[y][x];\r
1255 \r
1256                                         /* Get the monster */\r
1257                                         m_ptr = &m_list[c_ptr->m_idx];\r
1258 \r
1259                                         /* Hack -- attack monsters */\r
1260                                         if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))\r
1261                                                 py_attack(y, x, 0);\r
1262                                 }\r
1263                         }\r
1264                 }\r
1265                 break;\r
1266 \r
1267         case 26:\r
1268                 if (name) return _("ブリザード", "Blizzard");\r
1269                 if (desc) return _("巨大な冷気の球を放つ。", "Fires a huge ball of cold.");\r
1270     \r
1271                 {\r
1272                         HIT_POINT dam = 70 + plev * 3 / 2;\r
1273                         int rad = plev / 12 + 1;\r
1274 \r
1275                         if (info) return info_damage(0, 0, dam);\r
1276 \r
1277                         if (cast)\r
1278                         {\r
1279                                 if (!get_aim_dir(&dir)) return NULL;\r
1280 \r
1281                                 fire_ball(GF_COLD, dir, dam, rad);\r
1282                         }\r
1283                 }\r
1284                 break;\r
1285 \r
1286         case 27:\r
1287                 if (name) return _("稲妻嵐", "Lightning Storm");\r
1288                 if (desc) return _("巨大な電撃の球を放つ。", "Fires a huge electric ball.");\r
1289     \r
1290                 {\r
1291                         HIT_POINT dam = 90 + plev * 3 / 2;\r
1292                         int rad = plev / 12 + 1;\r
1293 \r
1294                         if (info) return info_damage(0, 0, dam);\r
1295 \r
1296                         if (cast)\r
1297                         {\r
1298                                 if (!get_aim_dir(&dir)) return NULL;\r
1299                                 fire_ball(GF_ELEC, dir, dam, rad);\r
1300                                 break;\r
1301                         }\r
1302                 }\r
1303                 break;\r
1304 \r
1305         case 28:\r
1306                 if (name) return _("渦潮", "Whirlpool");\r
1307                 if (desc) return _("巨大な水の球を放つ。", "Fires a huge ball of water.");\r
1308     \r
1309                 {\r
1310                         HIT_POINT dam = 100 + plev * 3 / 2;\r
1311                         int rad = plev / 12 + 1;\r
1312 \r
1313                         if (info) return info_damage(0, 0, dam);\r
1314 \r
1315                         if (cast)\r
1316                         {\r
1317                                 if (!get_aim_dir(&dir)) return NULL;\r
1318                                 fire_ball(GF_WATER, dir, dam, rad);\r
1319                         }\r
1320                 }\r
1321                 break;\r
1322 \r
1323         case 29:\r
1324                 if (name) return _("陽光召喚", "Call Sunlight");\r
1325                 if (desc) return _("自分を中心とした光の球を発生させる。さらに、その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。",\r
1326                         "Generates ball of light centered on you. Maps and lights whole dungeon level. Knows all objects location.");\r
1327     \r
1328                 {\r
1329                         HIT_POINT dam = 150;\r
1330                         int rad = 8;\r
1331 \r
1332                         if (info) return info_damage(0, 0, dam/2);\r
1333 \r
1334                         if (cast)\r
1335                         {\r
1336                                 fire_ball(GF_LITE, 0, dam, rad);\r
1337                                 chg_virtue(V_KNOWLEDGE, 1);\r
1338                                 chg_virtue(V_ENLIGHTEN, 1);\r
1339                                 wiz_lite(FALSE);\r
1340 \r
1341                                 if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)\r
1342                                 {\r
1343                                         msg_print(_("日光があなたの肉体を焦がした!", "The sunlight scorches your flesh!"));\r
1344                                         take_hit(DAMAGE_NOESCAPE, 50, _("日光", "sunlight"), -1);\r
1345                                 }\r
1346                         }\r
1347                 }\r
1348                 break;\r
1349 \r
1350         case 30:\r
1351                 if (name) return _("精霊の刃", "Elemental Branding");\r
1352                 if (desc) return _("武器に炎か冷気の属性をつける。", "Makes current weapon fire or frost branded.");\r
1353     \r
1354                 {\r
1355                         if (cast)\r
1356                         {\r
1357                                 brand_weapon(randint0(2));\r
1358                         }\r
1359                 }\r
1360                 break;\r
1361 \r
1362         case 31:\r
1363                 if (name) return _("自然の脅威", "Nature's Wrath");\r
1364                 if (desc) return _("近くの全てのモンスターにダメージを与え、地震を起こし、自分を中心とした分解の球を発生させる。", \r
1365                         "Damages all monsters in sight. Makes quake. Generates disintegration ball centered on you.");\r
1366     \r
1367                 {\r
1368                         int d_dam = 4 * plev;\r
1369                         int b_dam = (100 + plev) * 2;\r
1370                         int b_rad = 1 + plev / 12;\r
1371                         int q_rad = 20 + plev / 2;\r
1372 \r
1373                         if (info) return format("%s%d+%d", s_dam, d_dam, b_dam/2);\r
1374 \r
1375                         if (cast)\r
1376                         {\r
1377                                 dispel_monsters(d_dam);\r
1378                                 earthquake(p_ptr->y, p_ptr->x, q_rad);\r
1379                                 project(0, b_rad, p_ptr->y, p_ptr->x, b_dam, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM, -1);\r
1380                         }\r
1381                 }\r
1382                 break;\r
1383         }\r
1384 \r
1385         return "";\r
1386 }\r
1387 \r
1388 \r
1389 \r
1390 /*!\r
1391  * @brief 暗黒領域魔法の各処理を行う\r
1392  * @param spell 魔法ID\r
1393  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)\r
1394  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。\r
1395  */\r
1396 static cptr do_death_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
1397 {\r
1398         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
1399         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
1400         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
1401         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
1402 \r
1403         static const char s_dam[] = _("損傷:", "dam ");\r
1404         static const char s_random[] = _("ランダム", "random");\r
1405 \r
1406         int dir;\r
1407         int plev = p_ptr->lev;\r
1408 \r
1409         switch (spell)\r
1410         {\r
1411         case 0:\r
1412                 if (name) return _("無生命感知", "Detect Unlife");\r
1413                 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");\r
1414     \r
1415                 {\r
1416                         int rad = DETECT_RAD_DEFAULT;\r
1417 \r
1418                         if (info) return info_radius(rad);\r
1419 \r
1420                         if (cast)\r
1421                         {\r
1422                                 detect_monsters_nonliving(rad);\r
1423                         }\r
1424                 }\r
1425                 break;\r
1426 \r
1427         case 1:\r
1428                 if (name) return _("呪殺弾", "Malediction");\r
1429                 if (desc) return _("ごく小さな邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。", \r
1430                         "Fires a tiny ball of evil power which hurts good monsters greatly.");\r
1431     \r
1432                 {\r
1433                         int dice = 3 + (plev - 1) / 5;\r
1434                         int sides = 4;\r
1435                         int rad = 0;\r
1436 \r
1437                         if (info) return info_damage(dice, sides, 0);\r
1438 \r
1439                         if (cast)\r
1440                         {\r
1441                                 if (!get_aim_dir(&dir)) return NULL;\r
1442 \r
1443                                 /*\r
1444                                  * A radius-0 ball may (1) be aimed at\r
1445                                  * objects etc., and will affect them;\r
1446                                  * (2) may be aimed at ANY visible\r
1447                                  * monster, unlike a 'bolt' which must\r
1448                                  * travel to the monster.\r
1449                                  */\r
1450 \r
1451                                 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides), rad);\r
1452 \r
1453                                 if (one_in_(5))\r
1454                                 {\r
1455                                         /* Special effect first */\r
1456                                         int effect = randint1(1000);\r
1457 \r
1458                                         if (effect == 666)\r
1459                                                 fire_ball_hide(GF_DEATH_RAY, dir, plev * 200, 0);\r
1460                                         else if (effect < 500)\r
1461                                                 fire_ball_hide(GF_TURN_ALL, dir, plev, 0);\r
1462                                         else if (effect < 800)\r
1463                                                 fire_ball_hide(GF_OLD_CONF, dir, plev, 0);\r
1464                                         else\r
1465                                                 fire_ball_hide(GF_STUN, dir, plev, 0);\r
1466                                 }\r
1467                         }\r
1468                 }\r
1469                 break;\r
1470 \r
1471         case 2:\r
1472                 if (name) return _("邪悪感知", "Detect Evil");\r
1473                 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");\r
1474     \r
1475                 {\r
1476                         int rad = DETECT_RAD_DEFAULT;\r
1477 \r
1478                         if (info) return info_radius(rad);\r
1479 \r
1480                         if (cast)\r
1481                         {\r
1482                                 detect_monsters_evil(rad);\r
1483                         }\r
1484                 }\r
1485                 break;\r
1486 \r
1487         case 3:\r
1488                 if (name) return _("悪臭雲", "Stinking Cloud");\r
1489                 if (desc) return _("毒の球を放つ。", "Fires a ball of poison.");\r
1490     \r
1491                 {\r
1492                         HIT_POINT dam = 10 + plev / 2;\r
1493                         int rad = 2;\r
1494 \r
1495                         if (info) return info_damage(0, 0, dam);\r
1496 \r
1497                         if (cast)\r
1498                         {\r
1499                                 if (!get_aim_dir(&dir)) return NULL;\r
1500 \r
1501                                 fire_ball(GF_POIS, dir, dam, rad);\r
1502                         }\r
1503                 }\r
1504                 break;\r
1505 \r
1506         case 4:\r
1507                 if (name) return _("黒い眠り", "Black Sleep");\r
1508                 if (desc) return _("1体のモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep 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                                 sleep_monster(dir, plev);\r
1520                         }\r
1521                 }\r
1522                 break;\r
1523 \r
1524         case 5:\r
1525                 if (name) return _("耐毒", "Resist Poison");\r
1526                 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。", \r
1527                         "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");\r
1528     \r
1529                 {\r
1530                         int base = 20;\r
1531 \r
1532                         if (info) return info_duration(base, base);\r
1533 \r
1534                         if (cast)\r
1535                         {\r
1536                                 set_oppose_pois(randint1(base) + base, FALSE);\r
1537                         }\r
1538                 }\r
1539                 break;\r
1540 \r
1541         case 6:\r
1542                 if (name) return _("恐慌", "Horrify");\r
1543                 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");\r
1544     \r
1545                 {\r
1546                         int power = plev;\r
1547 \r
1548                         if (info) return info_power(power);\r
1549 \r
1550                         if (cast)\r
1551                         {\r
1552                                 if (!get_aim_dir(&dir)) return NULL;\r
1553 \r
1554                                 fear_monster(dir, power);\r
1555                                 stun_monster(dir, power);\r
1556                         }\r
1557                 }\r
1558                 break;\r
1559 \r
1560         case 7:\r
1561                 if (name) return _("アンデッド従属", "Enslave Undead");\r
1562                 if (desc) return _("アンデッド1体を魅了する。抵抗されると無効。", "Attempts to charm an undead monster.");\r
1563     \r
1564                 {\r
1565                         int power = plev;\r
1566 \r
1567                         if (info) return info_power(power);\r
1568 \r
1569                         if (cast)\r
1570                         {\r
1571                                 if (!get_aim_dir(&dir)) return NULL;\r
1572 \r
1573                                 control_one_undead(dir, power);\r
1574                         }\r
1575                 }\r
1576                 break;\r
1577 \r
1578         case 8:\r
1579                 if (name) return _("エントロピーの球", "Orb of Entropy");\r
1580                 if (desc) return _("生命のある者のHPと最大HP双方にダメージを与える効果のある球を放つ。", "Fires a ball which damages to both HP and MaxHP of living monsters.");\r
1581 \r
1582                 {\r
1583                         int dice = 3;\r
1584                         int sides = 6;\r
1585                         int rad = (plev < 30) ? 2 : 3;\r
1586                         int base;\r
1587 \r
1588                         if (p_ptr->pclass == CLASS_MAGE ||\r
1589                             p_ptr->pclass == CLASS_HIGH_MAGE ||\r
1590                             p_ptr->pclass == CLASS_SORCERER)\r
1591                                 base = plev + plev / 2;\r
1592                         else\r
1593                                 base = plev + plev / 4;\r
1594 \r
1595 \r
1596                         if (info) return info_damage(dice, sides, base);\r
1597 \r
1598                         if (cast)\r
1599                         {\r
1600                                 if (!get_aim_dir(&dir)) return NULL;\r
1601 \r
1602                                 fire_ball(GF_HYPODYNAMIA, dir, damroll(dice, sides) + base, rad);\r
1603                         }\r
1604                 }\r
1605                 break;\r
1606 \r
1607         case 9:\r
1608                 if (name) return _("地獄の矢", "Nether Bolt");\r
1609                 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");\r
1610     \r
1611                 {\r
1612                         int dice = 8 + (plev - 5) / 4;\r
1613                         int sides = 8;\r
1614 \r
1615                         if (info) return info_damage(dice, sides, 0);\r
1616 \r
1617                         if (cast)\r
1618                         {\r
1619                                 if (!get_aim_dir(&dir)) return NULL;\r
1620 \r
1621                                 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));\r
1622                         }\r
1623                 }\r
1624                 break;\r
1625 \r
1626         case 10:\r
1627                 if (name) return _("殺戮雲", "Cloud kill");\r
1628                 if (desc) return _("自分を中心とした毒の球を発生させる。", "Generate a ball of poison centered on you.");\r
1629     \r
1630                 {\r
1631                         HIT_POINT dam = (30 + plev) * 2;\r
1632                         int rad = plev / 10 + 2;\r
1633 \r
1634                         if (info) return info_damage(0, 0, dam/2);\r
1635 \r
1636                         if (cast)\r
1637                         {\r
1638                                 project(0, rad, p_ptr->y, p_ptr->x, dam, GF_POIS, PROJECT_KILL | PROJECT_ITEM, -1);\r
1639                         }\r
1640                 }\r
1641                 break;\r
1642 \r
1643         case 11:\r
1644                 if (name) return _("モンスター消滅", "Genocide One");\r
1645                 if (desc) return _("モンスター1体を消し去る。経験値やアイテムは手に入らない。抵抗されると無効。", "Attempts to vanish a monster.");\r
1646     \r
1647                 {\r
1648                         int power = plev + 50;\r
1649 \r
1650                         if (info) return info_power(power);\r
1651 \r
1652                         if (cast)\r
1653                         {\r
1654                                 if (!get_aim_dir(&dir)) return NULL;\r
1655 \r
1656                                 fire_ball_hide(GF_GENOCIDE, dir, power, 0);\r
1657                         }\r
1658                 }\r
1659                 break;\r
1660 \r
1661         case 12:\r
1662                 if (name) return _("毒の刃", "Poison Branding");\r
1663                 if (desc) return _("武器に毒の属性をつける。", "Makes current weapon poison branded.");\r
1664     \r
1665                 {\r
1666                         if (cast)\r
1667                         {\r
1668                                 brand_weapon(3);\r
1669                         }\r
1670                 }\r
1671                 break;\r
1672 \r
1673         case 13:\r
1674                 if (name) return _("吸血の矢", "Vampiric Bolt");\r
1675                 if (desc) return _("ボルトによりモンスター1体から生命力を吸いとる。吸いとった生命力によって満腹度が上がる。", \r
1676                         "Absorbs some HP from a monster and gives them to you by bolt. You will also gain nutritional sustenance from this.");\r
1677     \r
1678                 {\r
1679                         int dice = 1;\r
1680                         int sides = plev * 2;\r
1681                         int base = plev * 2;\r
1682 \r
1683                         if (info) return info_damage(dice, sides, base);\r
1684 \r
1685                         if (cast)\r
1686                         {\r
1687                                 HIT_POINT dam = base + damroll(dice, sides);\r
1688 \r
1689                                 if (!get_aim_dir(&dir)) return NULL;\r
1690 \r
1691                                 if (hypodynamic_bolt(dir, dam))\r
1692                                 {\r
1693                                         chg_virtue(V_SACRIFICE, -1);\r
1694                                         chg_virtue(V_VITALITY, -1);\r
1695 \r
1696                                         hp_player(dam);\r
1697 \r
1698                                         /*\r
1699                                          * Gain nutritional sustenance:\r
1700                                          * 150/hp drained\r
1701                                          *\r
1702                                          * A Food ration gives 5000\r
1703                                          * food points (by contrast)\r
1704                                          * Don't ever get more than\r
1705                                          * "Full" this way But if we\r
1706                                          * ARE Gorged, it won't cure\r
1707                                          * us\r
1708                                          */\r
1709                                         dam = p_ptr->food + MIN(5000, 100 * dam);\r
1710 \r
1711                                         /* Not gorged already */\r
1712                                         if (p_ptr->food < PY_FOOD_MAX)\r
1713                                                 set_food(dam >= PY_FOOD_MAX ? PY_FOOD_MAX - 1 : dam);\r
1714                                 }\r
1715                         }\r
1716                 }\r
1717                 break;\r
1718 \r
1719         case 14:\r
1720                 if (name) return _("反魂の術", "Animate dead");\r
1721                 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");\r
1722     \r
1723                 {\r
1724                         if (cast)\r
1725                         {\r
1726                                 animate_dead(0, p_ptr->y, p_ptr->x);\r
1727                         }\r
1728                 }\r
1729                 break;\r
1730 \r
1731         case 15:\r
1732                 if (name) return _("抹殺", "Genocide");\r
1733                 if (desc) return _("指定した文字のモンスターを現在の階から消し去る。抵抗されると無効。", \r
1734                         "Eliminates an entire class of monster, exhausting you.  Powerful or unique monsters may resist.");\r
1735     \r
1736                 {\r
1737                         int power = plev+50;\r
1738 \r
1739                         if (info) return info_power(power);\r
1740 \r
1741                         if (cast)\r
1742                         {\r
1743                                 symbol_genocide(power, TRUE);\r
1744                         }\r
1745                 }\r
1746                 break;\r
1747 \r
1748         case 16:\r
1749                 if (name) return _("狂戦士化", "Berserk");\r
1750                 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");\r
1751     \r
1752                 {\r
1753                         int base = 25;\r
1754 \r
1755                         if (info) return info_duration(base, base);\r
1756 \r
1757                         if (cast)\r
1758                         {\r
1759                                 set_shero(randint1(base) + base, FALSE);\r
1760                                 hp_player(30);\r
1761                                 set_afraid(0);\r
1762                         }\r
1763                 }\r
1764                 break;\r
1765 \r
1766         case 17:\r
1767                 if (name) return _("悪霊召喚", "Invoke Spirits");\r
1768                 if (desc) return _("ランダムで様々な効果が起こる。", "Causes random effects.");\r
1769     \r
1770                 {\r
1771                         if (info) return s_random;\r
1772 \r
1773                         if (cast)\r
1774                         {\r
1775                                 if (!get_aim_dir(&dir)) return NULL;\r
1776 \r
1777                                 cast_invoke_spirits(dir);\r
1778                         }\r
1779                 }\r
1780                 break;\r
1781 \r
1782         case 18:\r
1783                 if (name) return _("暗黒の矢", "Dark Bolt");\r
1784                 if (desc) return _("暗黒のボルトもしくはビームを放つ。", "Fires a bolt or beam of darkness.");\r
1785     \r
1786                 {\r
1787                         int dice = 4 + (plev - 5) / 4;\r
1788                         int sides = 8;\r
1789 \r
1790                         if (info) return info_damage(dice, sides, 0);\r
1791 \r
1792                         if (cast)\r
1793                         {\r
1794                                 if (!get_aim_dir(&dir)) return NULL;\r
1795 \r
1796                                 fire_bolt_or_beam(beam_chance(), GF_DARK, dir, damroll(dice, sides));\r
1797                         }\r
1798                 }\r
1799                 break;\r
1800 \r
1801         case 19:\r
1802                 if (name) return _("狂乱戦士", "Battle Frenzy");\r
1803                 if (desc) return _("狂戦士化し、恐怖を除去し、加速する。", \r
1804                         "Gives another bonus to hit and HP, immunity to fear for a while. Hastes you. But decreases AC.");\r
1805     \r
1806                 {\r
1807                         int b_base = 25;\r
1808                         int sp_base = plev / 2;\r
1809                         int sp_sides = 20 + plev / 2;\r
1810 \r
1811                         if (info) return info_duration(b_base, b_base);\r
1812 \r
1813                         if (cast)\r
1814                         {\r
1815                                 set_shero(randint1(25) + 25, FALSE);\r
1816                                 hp_player(30);\r
1817                                 set_afraid(0);\r
1818                                 set_fast(randint1(sp_sides) + sp_base, FALSE);\r
1819                         }\r
1820                 }\r
1821                 break;\r
1822 \r
1823         case 20:\r
1824                 if (name) return _("吸血の刃", "Vampiric Branding");\r
1825                 if (desc) return _("武器に吸血の属性をつける。", "Makes current weapon Vampiric.");\r
1826     \r
1827                 {\r
1828                         if (cast)\r
1829                         {\r
1830                                 brand_weapon(4);\r
1831                         }\r
1832                 }\r
1833                 break;\r
1834 \r
1835         case 21:\r
1836                 if (name) return _("吸血の連矢", "Vampiric Bolts");\r
1837                 if (desc) return _("3連射のボルトによりモンスター1体から生命力を吸いとる。吸いとった生命力によって体力が回復する。", \r
1838                         "Fires 3 bolts. Each of the bolts absorbs some HP from a monster and gives them to you.");\r
1839                 {\r
1840                         HIT_POINT dam = 100;\r
1841 \r
1842                         if (info) return format("%s3*%d", s_dam, dam);\r
1843 \r
1844                         if (cast)\r
1845                         {\r
1846                                 int i;\r
1847 \r
1848                                 if (!get_aim_dir(&dir)) return NULL;\r
1849 \r
1850                                 chg_virtue(V_SACRIFICE, -1);\r
1851                                 chg_virtue(V_VITALITY, -1);\r
1852 \r
1853                                 for (i = 0; i < 3; i++)\r
1854                                 {\r
1855                                         if (hypodynamic_bolt(dir, dam))\r
1856                                                 hp_player(dam);\r
1857                                 }\r
1858                         }\r
1859                 }\r
1860                 break;\r
1861 \r
1862         case 22:\r
1863                 if (name) return _("死の言魂", "Nether Wave");\r
1864                 if (desc) return _("視界内の生命のあるモンスターにダメージを与える。", "Damages all living monsters in sight.");\r
1865     \r
1866                 {\r
1867                         int sides = plev * 3;\r
1868 \r
1869                         if (info) return info_damage(1, sides, 0);\r
1870 \r
1871                         if (cast)\r
1872                         {\r
1873                                 dispel_living(randint1(sides));\r
1874                         }\r
1875                 }\r
1876                 break;\r
1877 \r
1878         case 23:\r
1879                 if (name) return _("暗黒の嵐", "Darkness Storm");\r
1880                 if (desc) return _("巨大な暗黒の球を放つ。", "Fires a huge ball of darkness.");\r
1881     \r
1882                 {\r
1883                         HIT_POINT dam = 100 + plev * 2;\r
1884                         int rad = 4;\r
1885 \r
1886                         if (info) return info_damage(0, 0, dam);\r
1887 \r
1888                         if (cast)\r
1889                         {\r
1890                                 if (!get_aim_dir(&dir)) return NULL;\r
1891 \r
1892                                 fire_ball(GF_DARK, dir, dam, rad);\r
1893                         }\r
1894                 }\r
1895                 break;\r
1896 \r
1897         case 24:\r
1898                 if (name) return _("死の光線", "Death Ray");\r
1899                 if (desc) return _("死の光線を放つ。", "Fires a beam of death.");\r
1900     \r
1901                 {\r
1902                         if (cast)\r
1903                         {\r
1904                                 if (!get_aim_dir(&dir)) return NULL;\r
1905 \r
1906                                 death_ray(dir, plev);\r
1907                         }\r
1908                 }\r
1909                 break;\r
1910 \r
1911         case 25:\r
1912                 if (name) return _("死者召喚", "Raise the Dead");\r
1913                 if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");\r
1914     \r
1915                 {\r
1916                         if (cast)\r
1917                         {\r
1918                                 int type;\r
1919                                 bool pet = one_in_(3);\r
1920                                 u32b flg = 0L;\r
1921 \r
1922                                 type = (plev > 47 ? SUMMON_HI_UNDEAD : SUMMON_UNDEAD);\r
1923 \r
1924                                 if (!pet || (pet && (plev > 24) && one_in_(3)))\r
1925                                         flg |= PM_ALLOW_GROUP;\r
1926 \r
1927                                 if (pet) flg |= PM_FORCE_PET;\r
1928                                 else flg |= (PM_ALLOW_UNIQUE | PM_NO_PET);\r
1929 \r
1930                                 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, type, flg))\r
1931                                 {\r
1932                                         msg_print(_("冷たい風があなたの周りに吹き始めた。それは腐敗臭を運んでいる...",\r
1933                                                                 "Cold winds begin to blow around you, carrying with them the stench of decay..."));\r
1934 \r
1935 \r
1936                                         if (pet)\r
1937                                         {\r
1938                                                 msg_print(_("古えの死せる者共があなたに仕えるため土から甦った!",\r
1939                                                                         "Ancient, long-dead forms arise from the ground to serve you!"));\r
1940                                         }\r
1941                                         else\r
1942                                         {\r
1943                                                 msg_print(_("死者が甦った。眠りを妨げるあなたを罰するために!",\r
1944                                                                         "'The dead arise... to punish you for disturbing them!'"));\r
1945                                         }\r
1946 \r
1947                                         chg_virtue(V_UNLIFE, 1);\r
1948                                 }\r
1949                         }\r
1950                 }\r
1951                 break;\r
1952 \r
1953         case 26:\r
1954                 if (name) return _("死者の秘伝", "Esoteria");\r
1955                 if (desc) return _("アイテムを1つ識別する。レベルが高いとアイテムの能力を完全に知ることができる。",\r
1956                         "Identifies an item. Or *identifies* an item at higher level.");\r
1957     \r
1958                 {\r
1959                         if (cast)\r
1960                         {\r
1961                                 if (randint1(50) > plev)\r
1962                                 {\r
1963                                         if (!ident_spell(FALSE)) return NULL;\r
1964                                 }\r
1965                                 else\r
1966                                 {\r
1967                                         if (!identify_fully(FALSE)) return NULL;\r
1968                                 }\r
1969                         }\r
1970                 }\r
1971                 break;\r
1972 \r
1973         case 27:\r
1974                 if (name) return _("吸血鬼変化", "Polymorph Vampire");\r
1975                 if (desc) return _("一定時間、吸血鬼に変化する。変化している間は本来の種族の能力を失い、代わりに吸血鬼としての能力を得る。", \r
1976                         "Mimic a vampire for a while. Loses abilities of original race and gets abilities as a vampire.");\r
1977     \r
1978                 {\r
1979                         int base = 10 + plev / 2;\r
1980 \r
1981                         if (info) return info_duration(base, base);\r
1982 \r
1983                         if (cast)\r
1984                         {\r
1985                                 set_mimic(base + randint1(base), MIMIC_VAMPIRE, FALSE);\r
1986                         }\r
1987                 }\r
1988                 break;\r
1989 \r
1990         case 28:\r
1991                 if (name) return _("経験値復活", "Restore Life");\r
1992                 if (desc) return _("失った経験値を回復する。", "Restore lost experience.");\r
1993     \r
1994                 {\r
1995                         if (cast)\r
1996                         {\r
1997                                 restore_level();\r
1998                         }\r
1999                 }\r
2000                 break;\r
2001 \r
2002         case 29:\r
2003                 if (name) return _("周辺抹殺", "Mass Genocide");\r
2004                 if (desc) return _("自分の周囲にいるモンスターを現在の階から消し去る。抵抗されると無効。", \r
2005                         "Eliminates all nearby monsters, exhausting you.  Powerful or unique monsters may be able to resist.");\r
2006     \r
2007                 {\r
2008                         int power = plev + 50;\r
2009 \r
2010                         if (info) return info_power(power);\r
2011 \r
2012                         if (cast)\r
2013                         {\r
2014                                 mass_genocide(power, TRUE);\r
2015                         }\r
2016                 }\r
2017                 break;\r
2018 \r
2019         case 30:\r
2020                 if (name) return _("地獄の劫火", "Hellfire");\r
2021                 if (desc) return _("邪悪な力を持つ宝珠を放つ。善良なモンスターには大きなダメージを与える。", \r
2022                         "Fires a powerful ball of evil power. Hurts good monsters greatly.");\r
2023     \r
2024                 {\r
2025                         HIT_POINT dam = 666;\r
2026                         int rad = 3;\r
2027 \r
2028                         if (info) return info_damage(0, 0, dam);\r
2029 \r
2030                         if (cast)\r
2031                         {\r
2032                                 if (!get_aim_dir(&dir)) return NULL;\r
2033 \r
2034                                 fire_ball(GF_HELL_FIRE, dir, dam, rad);\r
2035                                 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("地獄の劫火の呪文を唱えた疲労", "the strain of casting Hellfire"), -1);\r
2036                         }\r
2037                 }\r
2038                 break;\r
2039 \r
2040         case 31:\r
2041                 if (name) return _("幽体化", "Wraithform");\r
2042                 if (desc) return _("一定時間、壁を通り抜けることができ受けるダメージが軽減される幽体の状態に変身する。", \r
2043                         "Becomes wraith form which gives ability to pass walls and makes all damages half.");\r
2044     \r
2045                 {\r
2046                         int base = plev / 2;\r
2047 \r
2048                         if (info) return info_duration(base, base);\r
2049 \r
2050                         if (cast)\r
2051                         {\r
2052                                 set_wraith_form(randint1(base) + base, FALSE);\r
2053                         }\r
2054                 }\r
2055                 break;\r
2056         }\r
2057 \r
2058         return "";\r
2059 }\r
2060 \r
2061 \r
2062 /*!\r
2063  * @brief トランプ領域魔法の各処理を行う\r
2064  * @param spell 魔法ID\r
2065  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)\r
2066  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。\r
2067  */\r
2068 static cptr do_trump_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
2069 {\r
2070         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
2071         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
2072         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
2073         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
2074         bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;\r
2075         static const char s_random[] = _("ランダム", "random");\r
2076 \r
2077         int dir;\r
2078         int plev = p_ptr->lev;\r
2079 \r
2080         switch (spell)\r
2081         {\r
2082         case 0:\r
2083                 if (name) return _("ショート・テレポート", "Phase Door");\r
2084                 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");\r
2085     \r
2086                 {\r
2087                         POSITION range = 10;\r
2088 \r
2089                         if (info) return info_range(range);\r
2090 \r
2091                         if (cast)\r
2092                         {\r
2093                                 teleport_player(range, 0L);\r
2094                         }\r
2095                 }\r
2096                 break;\r
2097 \r
2098         case 1:\r
2099                 if (name) return _("蜘蛛のカード", "Trump Spiders");\r
2100                 if (desc) return _("蜘蛛を召喚する。", "Summons spiders.");\r
2101     \r
2102                 {\r
2103                         if (cast || fail)\r
2104                         {\r
2105                                 msg_print(_("あなたは蜘蛛のカードに集中する...", "You concentrate on the trump of an spider..."));\r
2106                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_SPIDER, PM_ALLOW_GROUP))\r
2107                                 {\r
2108                                         if (fail)\r
2109                                         {\r
2110                                                 msg_print(_("召喚された蜘蛛は怒っている!", "The summoned spiders get angry!"));\r
2111                                         }\r
2112                                 }\r
2113                         }\r
2114                 }\r
2115                 break;\r
2116 \r
2117         case 2:\r
2118                 if (name) return _("シャッフル", "Shuffle");\r
2119                 if (desc) return _("カードの占いをする。", "Causes random effects.");\r
2120     \r
2121                 {\r
2122                         if (info) return s_random;\r
2123 \r
2124                         if (cast)\r
2125                         {\r
2126                                 cast_shuffle();\r
2127                         }\r
2128                 }\r
2129                 break;\r
2130 \r
2131         case 3:\r
2132                 if (name) return _("フロア・リセット", "Reset Recall");\r
2133                 if (desc) return _("最深階を変更する。", "Resets the 'deepest' level for recall spell.");\r
2134     \r
2135                 {\r
2136                         if (cast)\r
2137                         {\r
2138                                 if (!reset_recall()) return NULL;\r
2139                         }\r
2140                 }\r
2141                 break;\r
2142 \r
2143         case 4:\r
2144                 if (name) return _("テレポート", "Teleport");\r
2145                 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");\r
2146     \r
2147                 {\r
2148                         POSITION range = plev * 4;\r
2149 \r
2150                         if (info) return info_range(range);\r
2151 \r
2152                         if (cast)\r
2153                         {\r
2154                                 teleport_player(range, 0L);\r
2155                         }\r
2156                 }\r
2157                 break;\r
2158 \r
2159         case 5:\r
2160                 if (name) return _("感知のカード", "Trump Spying");\r
2161                 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");\r
2162     \r
2163                 {\r
2164                         int base = 25;\r
2165                         int sides = 30;\r
2166 \r
2167                         if (info) return info_duration(base, sides);\r
2168 \r
2169                         if (cast)\r
2170                         {\r
2171                                 set_tim_esp(randint1(sides) + base, FALSE);\r
2172                         }\r
2173                 }\r
2174                 break;\r
2175 \r
2176         case 6:\r
2177                 if (name) return _("テレポート・モンスター", "Teleport Away");\r
2178                 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");\r
2179     \r
2180                 {\r
2181                         int power = plev;\r
2182 \r
2183                         if (info) return info_power(power);\r
2184 \r
2185                         if (cast)\r
2186                         {\r
2187                                 if (!get_aim_dir(&dir)) return NULL;\r
2188 \r
2189                                 fire_beam(GF_AWAY_ALL, dir, power);\r
2190                         }\r
2191                 }\r
2192                 break;\r
2193 \r
2194         case 7:\r
2195                 if (name) return _("動物のカード", "Trump Animals");\r
2196                 if (desc) return _("1体の動物を召喚する。", "Summons an animal.");\r
2197     \r
2198                 {\r
2199                         if (cast || fail)\r
2200                         {\r
2201                                 int type = (!fail ? SUMMON_ANIMAL_RANGER : SUMMON_ANIMAL);\r
2202                                 msg_print(_("あなたは動物のカードに集中する...", "You concentrate on the trump of an animal..."));\r
2203                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, type, 0L))\r
2204                                 {\r
2205                                         if (fail)\r
2206                                         {\r
2207                                                 msg_print(_("召喚された動物は怒っている!", "The summoned animal gets angry!"));\r
2208                                         }\r
2209                                 }\r
2210                         }\r
2211                 }\r
2212                 break;\r
2213 \r
2214         case 8:\r
2215                 if (name) return _("移動のカード", "Trump Reach");\r
2216                 if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");\r
2217     \r
2218                 {\r
2219                         int weight = plev * 15;\r
2220 \r
2221                         if (info) return info_weight(weight);\r
2222 \r
2223                         if (cast)\r
2224                         {\r
2225                                 if (!get_aim_dir(&dir)) return NULL;\r
2226 \r
2227                                 fetch(dir, weight, FALSE);\r
2228                         }\r
2229                 }\r
2230                 break;\r
2231 \r
2232         case 9:\r
2233                 if (name) return _("カミカゼのカード", "Trump Kamikaze");\r
2234                 if (desc) return _("複数の爆発するモンスターを召喚する。", "Summons monsters which explode by itself.");\r
2235     \r
2236                 {\r
2237                         if (cast || fail)\r
2238                         {\r
2239                                 int x, y;\r
2240                                 int type;\r
2241 \r
2242                                 if (cast)\r
2243                                 {\r
2244                                         if (!target_set(TARGET_KILL)) return NULL;\r
2245                                         x = target_col;\r
2246                                         y = target_row;\r
2247                                 }\r
2248                                 else\r
2249                                 {\r
2250                                         /* Summons near player when failed */\r
2251                                         x = p_ptr->x;\r
2252                                         y = p_ptr->y;\r
2253                                 }\r
2254 \r
2255                                 if (p_ptr->pclass == CLASS_BEASTMASTER)\r
2256                                         type = SUMMON_KAMIKAZE_LIVING;\r
2257                                 else\r
2258                                         type = SUMMON_KAMIKAZE;\r
2259 \r
2260                                 msg_print(_("あなたはカミカゼのカードに集中する...", "You concentrate on several trumps at once..."));\r
2261                                 if (trump_summoning(2 + randint0(plev / 7), !fail, y, x, 0, type, 0L))\r
2262                                 {\r
2263                                         if (fail)\r
2264                                         {\r
2265                                                 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));\r
2266                                         }\r
2267                                 }\r
2268                         }\r
2269                 }\r
2270                 break;\r
2271 \r
2272         case 10:\r
2273                 if (name) return _("幻霊召喚", "Phantasmal Servant");\r
2274                 if (desc) return _("1体の幽霊を召喚する。", "Summons a ghost.");\r
2275     \r
2276                 {\r
2277                         /* Phantasmal Servant is not summoned as enemy when failed */\r
2278                         if (cast)\r
2279                         {\r
2280                                 int summon_lev = plev * 2 / 3 + randint1(plev / 2);\r
2281 \r
2282                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, (summon_lev * 3 / 2), SUMMON_PHANTOM, 0L))\r
2283                                 {\r
2284                                         msg_print(_("御用でございますか、御主人様?", "'Your wish, master?'"));\r
2285                                 }\r
2286                         }\r
2287                 }\r
2288                 break;\r
2289 \r
2290         case 11:\r
2291                 if (name) return _("スピード・モンスター", "Haste Monster");\r
2292                 if (desc) return _("モンスター1体を加速させる。", "Hastes a monster.");\r
2293     \r
2294                 {\r
2295                         if (cast)\r
2296                         {\r
2297                                 bool result;\r
2298 \r
2299                                 /* Temporary enable target_pet option */\r
2300                                 bool old_target_pet = target_pet;\r
2301                                 target_pet = TRUE;\r
2302 \r
2303                                 result = get_aim_dir(&dir);\r
2304 \r
2305                                 /* Restore target_pet option */\r
2306                                 target_pet = old_target_pet;\r
2307 \r
2308                                 if (!result) return NULL;\r
2309 \r
2310                                 speed_monster(dir, plev);\r
2311                         }\r
2312                 }\r
2313                 break;\r
2314 \r
2315         case 12:\r
2316                 if (name) return _("テレポート・レベル", "Teleport Level");\r
2317                 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");\r
2318     \r
2319                 {\r
2320                         if (cast)\r
2321                         {\r
2322                                 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;\r
2323                                 teleport_level(0);\r
2324                         }\r
2325                 }\r
2326                 break;\r
2327 \r
2328         case 13:\r
2329                 if (name) return _("次元の扉", "Dimension Door");\r
2330                 if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleport to given location.");\r
2331     \r
2332                 {\r
2333                         POSITION range = plev / 2 + 10;\r
2334 \r
2335                         if (info) return info_range(range);\r
2336 \r
2337                         if (cast)\r
2338                         {\r
2339                                 msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));\r
2340                                 if (!dimension_door()) return NULL;\r
2341                         }\r
2342                 }\r
2343                 break;\r
2344 \r
2345         case 14:\r
2346                 if (name) return _("帰還の呪文", "Word of Recall");\r
2347                 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",\r
2348                         "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");\r
2349     \r
2350                 {\r
2351                         int base = 15;\r
2352                         int sides = 20;\r
2353 \r
2354                         if (info) return info_delay(base, sides);\r
2355 \r
2356                         if (cast)\r
2357                         {\r
2358                                 if (!word_of_recall()) return NULL;\r
2359                         }\r
2360                 }\r
2361                 break;\r
2362 \r
2363         case 15:\r
2364                 if (name) return _("怪物追放", "Banish");\r
2365                 if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");\r
2366     \r
2367                 {\r
2368                         int power = plev * 4;\r
2369 \r
2370                         if (info) return info_power(power);\r
2371 \r
2372                         if (cast)\r
2373                         {\r
2374                                 banish_monsters(power);\r
2375                         }\r
2376                 }\r
2377                 break;\r
2378 \r
2379         case 16:\r
2380                 if (name) return _("位置交換のカード", "Swap Position");\r
2381                 if (desc) return _("1体のモンスターと位置を交換する。", "Swap positions of you and a monster.");\r
2382     \r
2383                 {\r
2384                         if (cast)\r
2385                         {\r
2386                                 bool result;\r
2387 \r
2388                                 /* HACK -- No range limit */\r
2389                                 project_length = -1;\r
2390 \r
2391                                 result = get_aim_dir(&dir);\r
2392 \r
2393                                 /* Restore range to default */\r
2394                                 project_length = 0;\r
2395 \r
2396                                 if (!result) return NULL;\r
2397 \r
2398                                 teleport_swap(dir);\r
2399                         }\r
2400                 }\r
2401                 break;\r
2402 \r
2403         case 17:\r
2404                 if (name) return _("アンデッドのカード", "Trump Undead");\r
2405                 if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");\r
2406     \r
2407                 {\r
2408                         if (cast || fail)\r
2409                         {\r
2410                                 msg_print(_("あなたはアンデッドのカードに集中する...", "You concentrate on the trump of an undead creature..."));\r
2411                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_UNDEAD, 0L))\r
2412                                 {\r
2413                                         if (fail)\r
2414                                         {\r
2415                                                 msg_print(_("召喚されたアンデッドは怒っている!", "The summoned undead creature gets angry!"));\r
2416                                         }\r
2417                                 }\r
2418                         }\r
2419                 }\r
2420                 break;\r
2421 \r
2422         case 18:\r
2423                 if (name) return _("爬虫類のカード", "Trump Reptiles");\r
2424                 if (desc) return _("1体のヒドラを召喚する。", "Summons a hydra.");\r
2425     \r
2426                 {\r
2427                         if (cast || fail)\r
2428                         {\r
2429                                 msg_print(_("あなたは爬虫類のカードに集中する...", "You concentrate on the trump of a reptile..."));\r
2430                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HYDRA, 0L))\r
2431                                 {\r
2432                                         if (fail)\r
2433                                         {\r
2434                                                 msg_print(_("召喚された爬虫類は怒っている!", "The summoned reptile gets angry!"));\r
2435                                         }\r
2436                                 }\r
2437                         }\r
2438                 }\r
2439                 break;\r
2440 \r
2441         case 19:\r
2442                 if (name) return _("モンスターのカード", "Trump Monsters");\r
2443                 if (desc) return _("複数のモンスターを召喚する。", "Summons some monsters.");\r
2444     \r
2445                 {\r
2446                         if (cast || fail)\r
2447                         {\r
2448                                 int type;\r
2449                                 msg_print(_("あなたはモンスターのカードに集中する...", "You concentrate on several trumps at once..."));\r
2450                                 if (p_ptr->pclass == CLASS_BEASTMASTER)\r
2451                                         type = SUMMON_LIVING;\r
2452                                 else\r
2453                                         type = 0;\r
2454 \r
2455                                 if (trump_summoning((1 + (plev - 15)/ 10), !fail, p_ptr->y, p_ptr->x, 0, type, 0L))\r
2456                                 {\r
2457                                         if (fail)\r
2458                                         {\r
2459                                                 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));\r
2460                                         }\r
2461                                 }\r
2462 \r
2463                         }\r
2464                 }\r
2465                 break;\r
2466 \r
2467         case 20:\r
2468                 if (name) return _("ハウンドのカード", "Trump Hounds");\r
2469                 if (desc) return _("1グループのハウンドを召喚する。", "Summons a group of hounds.");\r
2470     \r
2471                 {\r
2472                         if (cast || fail)\r
2473                         {\r
2474                                 msg_print(_("あなたはハウンドのカードに集中する...", "You concentrate on the trump of a hound..."));\r
2475                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HOUND, PM_ALLOW_GROUP))\r
2476                                 {\r
2477                                         if (fail)\r
2478                                         {\r
2479                                                 msg_print(_("召喚されたハウンドは怒っている!", "The summoned hounds get angry!"));\r
2480                                         }\r
2481                                 }\r
2482                         }\r
2483                 }\r
2484                 break;\r
2485 \r
2486         case 21:\r
2487                 if (name) return _("トランプの刃", "Trump Branding");\r
2488                 if (desc) return _("武器にトランプの属性をつける。", "Makes current weapon a Trump weapon.");\r
2489     \r
2490                 {\r
2491                         if (cast)\r
2492                         {\r
2493                                 brand_weapon(5);\r
2494                         }\r
2495                 }\r
2496                 break;\r
2497 \r
2498         case 22:\r
2499                 if (name) return _("人間トランプ", "Living Trump");\r
2500                 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。", \r
2501                         "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");\r
2502     \r
2503                 {\r
2504                         if (cast)\r
2505                         {\r
2506                                 int mutation;\r
2507 \r
2508                                 if (one_in_(7))\r
2509                                         /* Teleport control */\r
2510                                         mutation = 12;\r
2511                                 else\r
2512                                         /* Random teleportation (uncontrolled) */\r
2513                                         mutation = 77;\r
2514 \r
2515                                 /* Gain the mutation */\r
2516                                 if (gain_random_mutation(mutation))\r
2517                                 {\r
2518                                         msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));\r
2519                                 }\r
2520                         }\r
2521                 }\r
2522                 break;\r
2523 \r
2524         case 23:\r
2525                 if (name) return _("サイバーデーモンのカード", "Trump Cyberdemon");\r
2526                 if (desc) return _("1体のサイバーデーモンを召喚する。", "Summons a cyber demon.");\r
2527     \r
2528                 {\r
2529                         if (cast || fail)\r
2530                         {\r
2531                                 msg_print(_("あなたはサイバーデーモンのカードに集中する...", "You concentrate on the trump of a Cyberdemon..."));\r
2532                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_CYBER, 0L))\r
2533                                 {\r
2534                                         if (fail)\r
2535                                         {\r
2536                                                 msg_print(_("召喚されたサイバーデーモンは怒っている!", "The summoned Cyberdemon gets angry!"));\r
2537                                         }\r
2538                                 }\r
2539                         }\r
2540                 }\r
2541                 break;\r
2542 \r
2543         case 24:\r
2544                 if (name) return _("予見のカード", "Trump Divination");\r
2545                 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",\r
2546                         "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");\r
2547     \r
2548                 {\r
2549                         int rad = DETECT_RAD_DEFAULT;\r
2550 \r
2551                         if (info) return info_radius(rad);\r
2552 \r
2553                         if (cast)\r
2554                         {\r
2555                                 detect_all(rad);\r
2556                         }\r
2557                 }\r
2558                 break;\r
2559 \r
2560         case 25:\r
2561                 if (name) return _("知識のカード", "Trump Lore");\r
2562                 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");\r
2563     \r
2564                 {\r
2565                         if (cast)\r
2566                         {\r
2567                                 if (!identify_fully(FALSE)) return NULL;\r
2568                         }\r
2569                 }\r
2570                 break;\r
2571 \r
2572         case 26:\r
2573                 if (name) return _("回復モンスター", "Heal Monster");\r
2574                 if (desc) return _("モンスター1体の体力を回復させる。", "Heal a monster.");\r
2575     \r
2576                 {\r
2577                         int heal = plev * 10 + 200;\r
2578 \r
2579                         if (info) return info_heal(0, 0, heal);\r
2580 \r
2581                         if (cast)\r
2582                         {\r
2583                                 bool result;\r
2584 \r
2585                                 /* Temporary enable target_pet option */\r
2586                                 bool old_target_pet = target_pet;\r
2587                                 target_pet = TRUE;\r
2588 \r
2589                                 result = get_aim_dir(&dir);\r
2590 \r
2591                                 /* Restore target_pet option */\r
2592                                 target_pet = old_target_pet;\r
2593 \r
2594                                 if (!result) return NULL;\r
2595 \r
2596                                 heal_monster(dir, heal);\r
2597                         }\r
2598                 }\r
2599                 break;\r
2600 \r
2601         case 27:\r
2602                 if (name) return _("ドラゴンのカード", "Trump Dragon");\r
2603                 if (desc) return _("1体のドラゴンを召喚する。", "Summons a dragon.");\r
2604     \r
2605                 {\r
2606                         if (cast || fail)\r
2607                         {\r
2608                                 msg_print(_("あなたはドラゴンのカードに集中する...", "You concentrate on the trump of a dragon..."));\r
2609                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_DRAGON, 0L))\r
2610                                 {\r
2611                                         if (fail)\r
2612                                         {\r
2613                                                 msg_print(_("召喚されたドラゴンは怒っている!", "The summoned dragon gets angry!"));\r
2614                                         }\r
2615                                 }\r
2616                         }\r
2617                 }\r
2618                 break;\r
2619 \r
2620         case 28:\r
2621                 if (name) return _("隕石のカード", "Trump Meteor");\r
2622                 if (desc) return _("自分の周辺に隕石を落とす。", "Makes meteor balls fall down to nearby random locations.");\r
2623     \r
2624                 {\r
2625                         HIT_POINT dam = plev * 2;\r
2626                         int rad = 2;\r
2627 \r
2628                         if (info) return info_multi_damage(dam);\r
2629 \r
2630                         if (cast)\r
2631                         {\r
2632                                 cast_meteor(dam, rad);\r
2633                         }\r
2634                 }\r
2635                 break;\r
2636 \r
2637         case 29:\r
2638                 if (name) return _("デーモンのカード", "Trump Demon");\r
2639                 if (desc) return _("1体の悪魔を召喚する。", "Summons a demon.");\r
2640     \r
2641                 {\r
2642                         if (cast || fail)\r
2643                         {\r
2644                                 msg_print(_("あなたはデーモンのカードに集中する...", "You concentrate on the trump of a demon..."));\r
2645                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_DEMON, 0L))\r
2646                                 {\r
2647                                         if (fail)\r
2648                                         {\r
2649                                                 msg_print(_("召喚されたデーモンは怒っている!", "The summoned demon gets angry!"));\r
2650                                         }\r
2651                                 }\r
2652                         }\r
2653                 }\r
2654                 break;\r
2655 \r
2656         case 30:\r
2657                 if (name) return _("地獄のカード", "Trump Greater Undead");\r
2658                 if (desc) return _("1体の上級アンデッドを召喚する。", "Summons a greater undead.");\r
2659     \r
2660                 {\r
2661                         if (cast || fail)\r
2662                         {\r
2663                                 msg_print(_("あなたは強力なアンデッドのカードに集中する...", "You concentrate on the trump of a greater undead being..."));\r
2664                                 /* May allow unique depend on level and dice roll */\r
2665                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HI_UNDEAD, PM_ALLOW_UNIQUE))\r
2666                                 {\r
2667                                         if (fail)\r
2668                                         {\r
2669                                                 msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead creature gets angry!"));\r
2670                                         }\r
2671                                 }\r
2672                         }\r
2673                 }\r
2674                 break;\r
2675 \r
2676         case 31:\r
2677                 if (name) return _("古代ドラゴンのカード", "Trump Ancient Dragon");\r
2678                 if (desc) return _("1体の古代ドラゴンを召喚する。", "Summons an ancient dragon.");\r
2679     \r
2680                 {\r
2681                         if (cast)\r
2682                         {\r
2683                                 int type;\r
2684 \r
2685                                 if (p_ptr->pclass == CLASS_BEASTMASTER)\r
2686                                         type = SUMMON_HI_DRAGON_LIVING;\r
2687                                 else\r
2688                                         type = SUMMON_HI_DRAGON;\r
2689 \r
2690                                 msg_print(_("あなたは古代ドラゴンのカードに集中する...", "You concentrate on the trump of an ancient dragon..."));\r
2691                                 /* May allow unique depend on level and dice roll */\r
2692                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, type, PM_ALLOW_UNIQUE))\r
2693                                 {\r
2694                                         if (fail)\r
2695                                         {\r
2696                                                 msg_print(_("召喚された古代ドラゴンは怒っている!", "The summoned ancient dragon gets angry!"));\r
2697                                         }\r
2698                                 }\r
2699                         }\r
2700                 }\r
2701                 break;\r
2702         }\r
2703 \r
2704         return "";\r
2705 }\r
2706 \r
2707 \r
2708 /*!\r
2709  * @brief 匠領域魔法の各処理を行う\r
2710  * @param spell 魔法ID\r
2711  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)\r
2712  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。\r
2713  */\r
2714 static cptr do_craft_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
2715 {\r
2716         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
2717         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
2718         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
2719         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
2720 \r
2721         int plev = p_ptr->lev;\r
2722 \r
2723         switch (spell)\r
2724         {\r
2725         case 0:\r
2726                 if (name) return _("赤外線視力", "Infravision");\r
2727                 if (desc) return _("一定時間、赤外線視力が増強される。", "Gives infravision for a while.");\r
2728     \r
2729                 {\r
2730                         int base = 100;\r
2731 \r
2732                         if (info) return info_duration(base, base);\r
2733 \r
2734                         if (cast)\r
2735                         {\r
2736                                 set_tim_infra(base + randint1(base), FALSE);\r
2737                         }\r
2738                 }\r
2739                 break;\r
2740 \r
2741         case 1:\r
2742                 if (name) return _("回復力強化", "Regeneration");\r
2743                 if (desc) return _("一定時間、回復力が増強される。", "Gives regeneration ability for a while.");\r
2744     \r
2745                 {\r
2746                         int base = 80;\r
2747 \r
2748                         if (info) return info_duration(base, base);\r
2749 \r
2750                         if (cast)\r
2751                         {\r
2752                                 set_tim_regen(base + randint1(base), FALSE);\r
2753                         }\r
2754                 }\r
2755                 break;\r
2756 \r
2757         case 2:\r
2758                 if (name) return _("空腹充足", "Satisfy Hunger");\r
2759                 if (desc) return _("満腹になる。", "Satisfies hunger.");\r
2760     \r
2761                 {\r
2762                         if (cast)\r
2763                         {\r
2764                                 set_food(PY_FOOD_MAX - 1);\r
2765                         }\r
2766                 }\r
2767                 break;\r
2768 \r
2769         case 3:\r
2770                 if (name) return _("耐冷気", "Resist Cold");\r
2771                 if (desc) return _("一定時間、冷気への耐性を得る。装備による耐性に累積する。", \r
2772                         "Gives resistance to cold. This resistance can be added to which from equipment for more powerful resistance.");\r
2773     \r
2774                 {\r
2775                         int base = 20;\r
2776 \r
2777                         if (info) return info_duration(base, base);\r
2778 \r
2779                         if (cast)\r
2780                         {\r
2781                                 set_oppose_cold(randint1(base) + base, FALSE);\r
2782                         }\r
2783                 }\r
2784                 break;\r
2785 \r
2786         case 4:\r
2787                 if (name) return _("耐火炎", "Resist Fire");\r
2788                 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。", \r
2789                         "Gives resistance to fire. This resistance can be added to which from equipment for more powerful resistance.");\r
2790     \r
2791                 {\r
2792                         int base = 20;\r
2793 \r
2794                         if (info) return info_duration(base, base);\r
2795 \r
2796                         if (cast)\r
2797                         {\r
2798                                 set_oppose_fire(randint1(base) + base, FALSE);\r
2799                         }\r
2800                 }\r
2801                 break;\r
2802 \r
2803         case 5:\r
2804                 if (name) return _("士気高揚", "Heroism");\r
2805                 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");\r
2806     \r
2807                 {\r
2808                         int base = 25;\r
2809 \r
2810                         if (info) return info_duration(base, base);\r
2811 \r
2812                         if (cast)\r
2813                         {\r
2814                                 set_hero(randint1(base) + base, FALSE);\r
2815                                 hp_player(10);\r
2816                                 set_afraid(0);\r
2817                         }\r
2818                 }\r
2819                 break;\r
2820 \r
2821         case 6:\r
2822                 if (name) return _("耐電撃", "Resist Lightning");\r
2823                 if (desc) return _("一定時間、電撃への耐性を得る。装備による耐性に累積する。",\r
2824                         "Gives resistance to electricity. This resistance can be added to which from equipment for more powerful resistance.");\r
2825     \r
2826                 {\r
2827                         int base = 20;\r
2828 \r
2829                         if (info) return info_duration(base, base);\r
2830 \r
2831                         if (cast)\r
2832                         {\r
2833                                 set_oppose_elec(randint1(base) + base, FALSE);\r
2834                         }\r
2835                 }\r
2836                 break;\r
2837 \r
2838         case 7:\r
2839                 if (name) return _("耐酸", "Resist Acid");\r
2840                 if (desc) return _("一定時間、酸への耐性を得る。装備による耐性に累積する。",\r
2841                         "Gives resistance to acid. This resistance can be added to which from equipment for more powerful resistance.");\r
2842     \r
2843                 {\r
2844                         int base = 20;\r
2845 \r
2846                         if (info) return info_duration(base, base);\r
2847 \r
2848                         if (cast)\r
2849                         {\r
2850                                 set_oppose_acid(randint1(base) + base, FALSE);\r
2851                         }\r
2852                 }\r
2853                 break;\r
2854 \r
2855         case 8:\r
2856                 if (name) return _("透明視認", "See Invisibility");\r
2857                 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");\r
2858     \r
2859                 {\r
2860                         int base = 24;\r
2861 \r
2862                         if (info) return info_duration(base, base);\r
2863 \r
2864                         if (cast)\r
2865                         {\r
2866                                 set_tim_invis(randint1(base) + base, FALSE);\r
2867                         }\r
2868                 }\r
2869                 break;\r
2870 \r
2871         case 9:\r
2872                 if (name) return _("解呪", "Remove Curse");\r
2873                 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");\r
2874     \r
2875                 {\r
2876                         if (cast)\r
2877                         {\r
2878                                 if (remove_curse())\r
2879                                 {\r
2880                                         msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));\r
2881                                 }\r
2882                         }\r
2883                 }\r
2884                 break;\r
2885 \r
2886         case 10:\r
2887                 if (name) return _("耐毒", "Resist Poison");\r
2888                 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",\r
2889                         "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");\r
2890     \r
2891                 {\r
2892                         int base = 20;\r
2893 \r
2894                         if (info) return info_duration(base, base);\r
2895 \r
2896                         if (cast)\r
2897                         {\r
2898                                 set_oppose_pois(randint1(base) + base, FALSE);\r
2899                         }\r
2900                 }\r
2901                 break;\r
2902 \r
2903         case 11:\r
2904                 if (name) return _("狂戦士化", "Berserk");\r
2905                 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");\r
2906     \r
2907                 {\r
2908                         int base = 25;\r
2909 \r
2910                         if (info) return info_duration(base, base);\r
2911 \r
2912                         if (cast)\r
2913                         {\r
2914                                 set_shero(randint1(base) + base, FALSE);\r
2915                                 hp_player(30);\r
2916                                 set_afraid(0);\r
2917                         }\r
2918                 }\r
2919                 break;\r
2920 \r
2921         case 12:\r
2922                 if (name) return _("自己分析", "Self Knowledge");\r
2923                 if (desc) return _("現在の自分の状態を完全に知る。",\r
2924                         "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");\r
2925     \r
2926                 {\r
2927                         if (cast)\r
2928                         {\r
2929                                 self_knowledge();\r
2930                         }\r
2931                 }\r
2932                 break;\r
2933 \r
2934         case 13:\r
2935                 if (name) return _("対邪悪結界", "Protection from Evil");\r
2936                 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");\r
2937     \r
2938                 {\r
2939                         int base = 3 * plev;\r
2940                         int sides = 25;\r
2941 \r
2942                         if (info) return info_duration(base, sides);\r
2943 \r
2944                         if (cast)\r
2945                         {\r
2946                                 set_protevil(randint1(sides) + base, FALSE);\r
2947                         }\r
2948                 }\r
2949                 break;\r
2950 \r
2951         case 14:\r
2952                 if (name) return _("癒し", "Cure");\r
2953                 if (desc) return _("毒、朦朧状態、負傷を全快させ、幻覚を直す。", "Heals poison, stun, cut and hallucination completely.");\r
2954     \r
2955                 {\r
2956                         if (cast)\r
2957                         {\r
2958                                 set_poisoned(0);\r
2959                                 set_stun(0);\r
2960                                 set_cut(0);\r
2961                                 set_image(0);\r
2962                         }\r
2963                 }\r
2964                 break;\r
2965 \r
2966         case 15:\r
2967                 if (name) return _("魔法剣", "Mana Branding");\r
2968                 if (desc) return _("一定時間、武器に冷気、炎、電撃、酸、毒のいずれかの属性をつける。武器を持たないと使えない。",\r
2969                         "Makes current weapon some elemental branded. You must wield weapons.");\r
2970     \r
2971                 {\r
2972                         int base = plev / 2;\r
2973 \r
2974                         if (info) return info_duration(base, base);\r
2975 \r
2976                         if (cast)\r
2977                         {\r
2978                                 if (!choose_ele_attack()) return NULL;\r
2979                         }\r
2980                 }\r
2981                 break;\r
2982 \r
2983         case 16:\r
2984                 if (name) return _("テレパシー", "Telepathy");\r
2985                 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");\r
2986     \r
2987                 {\r
2988                         int base = 25;\r
2989                         int sides = 30;\r
2990 \r
2991                         if (info) return info_duration(base, sides);\r
2992 \r
2993                         if (cast)\r
2994                         {\r
2995                                 set_tim_esp(randint1(sides) + base, FALSE);\r
2996                         }\r
2997                 }\r
2998                 break;\r
2999 \r
3000         case 17:\r
3001                 if (name) return _("肌石化", "Stone Skin");\r
3002                 if (desc) return _("一定時間、ACを上昇させる。", "Gives bonus to AC for a while.");\r
3003     \r
3004                 {\r
3005                         int base = 30;\r
3006                         int sides = 20;\r
3007 \r
3008                         if (info) return info_duration(base, sides);\r
3009 \r
3010                         if (cast)\r
3011                         {\r
3012                                 set_shield(randint1(sides) + base, FALSE);\r
3013                         }\r
3014                 }\r
3015                 break;\r
3016 \r
3017         case 18:\r
3018                 if (name) return _("全耐性", "Resistance");\r
3019                 if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。", \r
3020                         "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
3021     \r
3022                 {\r
3023                         int base = 20;\r
3024 \r
3025                         if (info) return info_duration(base, base);\r
3026 \r
3027                         if (cast)\r
3028                         {\r
3029                                 set_oppose_acid(randint1(base) + base, FALSE);\r
3030                                 set_oppose_elec(randint1(base) + base, FALSE);\r
3031                                 set_oppose_fire(randint1(base) + base, FALSE);\r
3032                                 set_oppose_cold(randint1(base) + base, FALSE);\r
3033                                 set_oppose_pois(randint1(base) + base, FALSE);\r
3034                         }\r
3035                 }\r
3036                 break;\r
3037 \r
3038         case 19:\r
3039                 if (name) return _("スピード", "Haste Self");\r
3040                 if (desc) return _("一定時間、加速する。", "Hastes you for a while.");\r
3041     \r
3042                 {\r
3043                         int base = plev;\r
3044                         int sides = 20 + plev;\r
3045 \r
3046                         if (info) return info_duration(base, sides);\r
3047 \r
3048                         if (cast)\r
3049                         {\r
3050                                 set_fast(randint1(sides) + base, FALSE);\r
3051                         }\r
3052                 }\r
3053                 break;\r
3054 \r
3055         case 20:\r
3056                 if (name) return _("壁抜け", "Walk through Wall");\r
3057                 if (desc) return _("一定時間、半物質化し壁を通り抜けられるようになる。", "Gives ability to pass walls for a while.");\r
3058     \r
3059                 {\r
3060                         int base = plev / 2;\r
3061 \r
3062                         if (info) return info_duration(base, base);\r
3063 \r
3064                         if (cast)\r
3065                         {\r
3066                                 set_kabenuke(randint1(base) + base, FALSE);\r
3067                         }\r
3068                 }\r
3069                 break;\r
3070 \r
3071         case 21:\r
3072                 if (name) return _("盾磨き", "Polish Shield");\r
3073                 if (desc) return _("盾に反射の属性をつける。", "Makes a shield a shield of reflection.");\r
3074     \r
3075                 {\r
3076                         if (cast)\r
3077                         {\r
3078                                 pulish_shield();\r
3079                         }\r
3080                 }\r
3081                 break;\r
3082 \r
3083         case 22:\r
3084                 if (name) return _("ゴーレム製造", "Create Golem");\r
3085                 if (desc) return _("1体のゴーレムを製造する。", "Creates a golem.");\r
3086     \r
3087                 {\r
3088                         if (cast)\r
3089                         {\r
3090                                 if (summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_GOLEM, PM_FORCE_PET))\r
3091                                 {\r
3092                                         msg_print(_("ゴーレムを作った。", "You make a golem."));\r
3093                                 }\r
3094                                 else\r
3095                                 {\r
3096                                         msg_print(_("うまくゴーレムを作れなかった。", "No Golems arrive."));\r
3097                                 }\r
3098                         }\r
3099                 }\r
3100                 break;\r
3101 \r
3102         case 23:\r
3103                 if (name) return _("魔法の鎧", "Magical armor");\r
3104                 if (desc) return _("一定時間、魔法防御力とACが上がり、混乱と盲目の耐性、反射能力、麻痺知らず、浮遊を得る。",\r
3105                         "Gives resistance to magic, bonus to AC, resistance to confusion, blindness, reflection, free action and levitation for a while.");\r
3106     \r
3107                 {\r
3108                         int base = 20;\r
3109 \r
3110                         if (info) return info_duration(base, base);\r
3111 \r
3112                         if (cast)\r
3113                         {\r
3114                                 set_magicdef(randint1(base) + base, FALSE);\r
3115                         }\r
3116                 }\r
3117                 break;\r
3118 \r
3119         case 24:\r
3120                 if (name) return _("装備無力化", "Remove Enchantment");\r
3121                 if (desc) return _("武器・防具にかけられたあらゆる魔力を完全に解除する。", "Removes all magics completely from any weapon or armor.");\r
3122     \r
3123                 {\r
3124                         if (cast)\r
3125                         {\r
3126                                 if (!mundane_spell(TRUE)) return NULL;\r
3127                         }\r
3128                 }\r
3129                 break;\r
3130 \r
3131         case 25:\r
3132                 if (name) return _("呪い粉砕", "Remove All Curse");\r
3133                 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");\r
3134     \r
3135                 {\r
3136                         if (cast)\r
3137                         {\r
3138                                 if (remove_all_curse())\r
3139                                 {\r
3140                                         msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));\r
3141                                 }\r
3142                         }\r
3143                 }\r
3144                 break;\r
3145 \r
3146         case 26:\r
3147                 if (name) return _("完全なる知識", "Knowledge True");\r
3148                 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");\r
3149     \r
3150                 {\r
3151                         if (cast)\r
3152                         {\r
3153                                 if (!identify_fully(FALSE)) return NULL;\r
3154                         }\r
3155                 }\r
3156                 break;\r
3157 \r
3158         case 27:\r
3159                 if (name) return _("武器強化", "Enchant Weapon");\r
3160                 if (desc) return _("武器の命中率修正とダメージ修正を強化する。", "Attempts to increase +to-hit, +to-dam of a weapon.");\r
3161     \r
3162                 {\r
3163                         if (cast)\r
3164                         {\r
3165                                 if (!enchant_spell(randint0(4) + 1, randint0(4) + 1, 0)) return NULL;\r
3166                         }\r
3167                 }\r
3168                 break;\r
3169 \r
3170         case 28:\r
3171                 if (name) return _("防具強化", "Enchant Armor");\r
3172                 if (desc) return _("鎧の防御修正を強化する。", "Attempts to increase +AC of an armor.");\r
3173     \r
3174                 {\r
3175                         if (cast)\r
3176                         {\r
3177                                 if (!enchant_spell(0, 0, randint0(3) + 2)) return NULL;\r
3178                         }\r
3179                 }\r
3180                 break;\r
3181 \r
3182         case 29:\r
3183                 if (name) return _("武器属性付与", "Brand Weapon");\r
3184                 if (desc) return _("武器にランダムに属性をつける。", "Makes current weapon a random ego weapon.");\r
3185     \r
3186                 {\r
3187                         if (cast)\r
3188                         {\r
3189                                 brand_weapon(randint0(18));\r
3190                         }\r
3191                 }\r
3192                 break;\r
3193 \r
3194         case 30:\r
3195                 if (name) return _("人間トランプ", "Living Trump");\r
3196                 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",\r
3197                         "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");\r
3198     \r
3199                 {\r
3200                         if (cast)\r
3201                         {\r
3202                                 int mutation;\r
3203 \r
3204                                 if (one_in_(7))\r
3205                                         /* Teleport control */\r
3206                                         mutation = 12;\r
3207                                 else\r
3208                                         /* Random teleportation (uncontrolled) */\r
3209                                         mutation = 77;\r
3210 \r
3211                                 /* Gain the mutation */\r
3212                                 if (gain_random_mutation(mutation))\r
3213                                 {\r
3214                                         msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));\r
3215                                 }\r
3216                         }\r
3217                 }\r
3218                 break;\r
3219 \r
3220         case 31:\r
3221                 if (name) return _("属性への免疫", "Immunity");\r
3222                 if (desc) return _("一定時間、冷気、炎、電撃、酸のいずれかに対する免疫を得る。",\r
3223                         "Gives an immunity to fire, cold, electricity or acid for a while.");\r
3224     \r
3225                 {\r
3226                         int base = 13;\r
3227 \r
3228                         if (info) return info_duration(base, base);\r
3229 \r
3230                         if (cast)\r
3231                         {\r
3232                                 if (!choose_ele_immune(base + randint1(base))) return NULL;\r
3233                         }\r
3234                 }\r
3235                 break;\r
3236         }\r
3237 \r
3238         return "";\r
3239 }\r
3240 \r
3241 /*!\r
3242  * @brief 悪魔領域魔法の各処理を行う\r
3243  * @param spell 魔法ID\r
3244  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)\r
3245  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。\r
3246  */\r
3247 static cptr do_daemon_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
3248 {\r
3249         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
3250         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
3251         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
3252         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
3253         static const char s_dam[] = _("損傷:", "dam ");\r
3254 \r
3255         int dir;\r
3256         int plev = p_ptr->lev;\r
3257 \r
3258         switch (spell)\r
3259         {\r
3260         case 0:\r
3261                 if (name) return _("マジック・ミサイル", "Magic Missile");\r
3262                 if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");\r
3263     \r
3264                 {\r
3265                         int dice = 3 + (plev - 1) / 5;\r
3266                         int sides = 4;\r
3267 \r
3268                         if (info) return info_damage(dice, sides, 0);\r
3269 \r
3270                         if (cast)\r
3271                         {\r
3272                                 if (!get_aim_dir(&dir)) return NULL;\r
3273 \r
3274                                 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));\r
3275                         }\r
3276                 }\r
3277                 break;\r
3278 \r
3279         case 1:\r
3280                 if (name) return _("無生命感知", "Detect Unlife");\r
3281                 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");\r
3282     \r
3283                 {\r
3284                         int rad = DETECT_RAD_DEFAULT;\r
3285 \r
3286                         if (info) return info_radius(rad);\r
3287 \r
3288                         if (cast)\r
3289                         {\r
3290                                 detect_monsters_nonliving(rad);\r
3291                         }\r
3292                 }\r
3293                 break;\r
3294 \r
3295         case 2:\r
3296                 if (name) return _("邪なる祝福", "Evil Bless");\r
3297                 if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives bonus to hit and AC for a few turns.");\r
3298     \r
3299                 {\r
3300                         int base = 12;\r
3301 \r
3302                         if (info) return info_duration(base, base);\r
3303 \r
3304                         if (cast)\r
3305                         {\r
3306                                 set_blessed(randint1(base) + base, FALSE);\r
3307                         }\r
3308                 }\r
3309                 break;\r
3310 \r
3311         case 3:\r
3312                 if (name) return _("耐火炎", "Resist Fire");\r
3313                 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。", \r
3314                         "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");\r
3315     \r
3316                 {\r
3317                         int base = 20;\r
3318 \r
3319                         if (info) return info_duration(base, base);\r
3320 \r
3321                         if (cast)\r
3322                         {\r
3323                                 set_oppose_fire(randint1(base) + base, FALSE);\r
3324                         }\r
3325                 }\r
3326                 break;\r
3327 \r
3328         case 4:\r
3329                 if (name) return _("恐慌", "Horrify");\r
3330                 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");\r
3331     \r
3332                 {\r
3333                         int power = plev;\r
3334 \r
3335                         if (info) return info_power(power);\r
3336 \r
3337                         if (cast)\r
3338                         {\r
3339                                 if (!get_aim_dir(&dir)) return NULL;\r
3340 \r
3341                                 fear_monster(dir, power);\r
3342                                 stun_monster(dir, power);\r
3343                         }\r
3344                 }\r
3345                 break;\r
3346 \r
3347         case 5:\r
3348                 if (name) return _("地獄の矢", "Nether Bolt");\r
3349                 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");\r
3350     \r
3351                 {\r
3352                         int dice = 6 + (plev - 5) / 4;\r
3353                         int sides = 8;\r
3354 \r
3355                         if (info) return info_damage(dice, sides, 0);\r
3356 \r
3357                         if (cast)\r
3358                         {\r
3359                                 if (!get_aim_dir(&dir)) return NULL;\r
3360 \r
3361                                 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));\r
3362                         }\r
3363                 }\r
3364                 break;\r
3365 \r
3366         case 6:\r
3367                 if (name) return _("古代の死霊召喚", "Summon Manes");\r
3368                 if (desc) return _("古代の死霊を召喚する。", "Summons a manes.");\r
3369     \r
3370                 {\r
3371                         if (cast)\r
3372                         {\r
3373                                 if (!summon_specific(-1, p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET)))\r
3374                                 {\r
3375                                         msg_print(_("古代の死霊は現れなかった。", "No Manes arrive."));\r
3376                                 }\r
3377                         }\r
3378                 }\r
3379                 break;\r
3380 \r
3381         case 7:\r
3382                 if (name) return _("地獄の焔", "Hellish Flame");\r
3383                 if (desc) return _("邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",\r
3384                         "Fires a ball of evil power. Hurts good monsters greatly.");\r
3385     \r
3386                 {\r
3387                         int dice = 3;\r
3388                         int sides = 6;\r
3389                         int rad = (plev < 30) ? 2 : 3;\r
3390                         int base;\r
3391 \r
3392                         if (p_ptr->pclass == CLASS_MAGE ||\r
3393                             p_ptr->pclass == CLASS_HIGH_MAGE ||\r
3394                             p_ptr->pclass == CLASS_SORCERER)\r
3395                                 base = plev + plev / 2;\r
3396                         else\r
3397                                 base = plev + plev / 4;\r
3398 \r
3399 \r
3400                         if (info) return info_damage(dice, sides, base);\r
3401 \r
3402                         if (cast)\r
3403                         {\r
3404                                 if (!get_aim_dir(&dir)) return NULL;\r
3405 \r
3406                                 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides) + base, rad);\r
3407                         }\r
3408                 }\r
3409                 break;\r
3410 \r
3411         case 8:\r
3412                 if (name) return _("デーモン支配", "Dominate Demon");\r
3413                 if (desc) return _("悪魔1体を魅了する。抵抗されると無効", "Attempts to charm a demon.");\r
3414     \r
3415                 {\r
3416                         int power = plev;\r
3417 \r
3418                         if (info) return info_power(power);\r
3419 \r
3420                         if (cast)\r
3421                         {\r
3422                                 if (!get_aim_dir(&dir)) return NULL;\r
3423 \r
3424                                 control_one_demon(dir, power);\r
3425                         }\r
3426                 }\r
3427                 break;\r
3428 \r
3429         case 9:\r
3430                 if (name) return _("ビジョン", "Vision");\r
3431                 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");\r
3432     \r
3433                 {\r
3434                         int rad = DETECT_RAD_MAP;\r
3435 \r
3436                         if (info) return info_radius(rad);\r
3437 \r
3438                         if (cast)\r
3439                         {\r
3440                                 map_area(rad);\r
3441                         }\r
3442                 }\r
3443                 break;\r
3444 \r
3445         case 10:\r
3446                 if (name) return _("耐地獄", "Resist Nether");\r
3447                 if (desc) return _("一定時間、地獄への耐性を得る。", "Gives resistance to nether for a while.");\r
3448     \r
3449                 {\r
3450                         int base = 20;\r
3451 \r
3452                         if (info) return info_duration(base, base);\r
3453 \r
3454                         if (cast)\r
3455                         {\r
3456                                 set_tim_res_nether(randint1(base) + base, FALSE);\r
3457                         }\r
3458                 }\r
3459                 break;\r
3460 \r
3461         case 11:\r
3462                 if (name) return _("プラズマ・ボルト", "Plasma bolt");\r
3463                 if (desc) return _("プラズマのボルトもしくはビームを放つ。", "Fires a bolt or beam of plasma.");\r
3464     \r
3465                 {\r
3466                         int dice = 11 + (plev - 5) / 4;\r
3467                         int sides = 8;\r
3468 \r
3469                         if (info) return info_damage(dice, sides, 0);\r
3470 \r
3471                         if (cast)\r
3472                         {\r
3473                                 if (!get_aim_dir(&dir)) return NULL;\r
3474 \r
3475                                 fire_bolt_or_beam(beam_chance(), GF_PLASMA, dir, damroll(dice, sides));\r
3476                         }\r
3477                 }\r
3478                 break;\r
3479 \r
3480         case 12:\r
3481                 if (name) return _("ファイア・ボール", "Fire Ball");\r
3482                 if (desc) return _("炎の球を放つ。", "Fires a ball of fire.");\r
3483     \r
3484                 {\r
3485                         HIT_POINT dam = plev + 55;\r
3486                         int rad = 2;\r
3487 \r
3488                         if (info) return info_damage(0, 0, dam);\r
3489 \r
3490                         if (cast)\r
3491                         {\r
3492                                 if (!get_aim_dir(&dir)) return NULL;\r
3493 \r
3494                                 fire_ball(GF_FIRE, dir, dam, rad);\r
3495                         }\r
3496                 }\r
3497                 break;\r
3498 \r
3499         case 13:\r
3500                 if (name) return _("炎の刃", "Fire Branding");\r
3501                 if (desc) return _("武器に炎の属性をつける。", "Makes current weapon fire branded.");\r
3502     \r
3503                 {\r
3504                         if (cast)\r
3505                         {\r
3506                                 brand_weapon(1);\r
3507                         }\r
3508                 }\r
3509                 break;\r
3510 \r
3511         case 14:\r
3512                 if (name) return _("地獄球", "Nether Ball");\r
3513                 if (desc) return _("大きな地獄の球を放つ。", "Fires a huge ball of nether.");\r
3514     \r
3515                 {\r
3516                         HIT_POINT dam = plev * 3 / 2 + 100;\r
3517                         int rad = plev / 20 + 2;\r
3518 \r
3519                         if (info) return info_damage(0, 0, dam);\r
3520 \r
3521                         if (cast)\r
3522                         {\r
3523                                 if (!get_aim_dir(&dir)) return NULL;\r
3524 \r
3525                                 fire_ball(GF_NETHER, dir, dam, rad);\r
3526                         }\r
3527                 }\r
3528                 break;\r
3529 \r
3530         case 15:\r
3531                 if (name) return _("デーモン召喚", "Summon Demon");\r
3532                 if (desc) return _("悪魔1体を召喚する。", "Summons a demon.");\r
3533     \r
3534                 {\r
3535                         if (cast)\r
3536                         {\r
3537                                 bool pet = !one_in_(3);\r
3538                                 u32b flg = 0L;\r
3539 \r
3540                                 if (pet) flg |= PM_FORCE_PET;\r
3541                                 else flg |= PM_NO_PET;\r
3542                                 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;\r
3543 \r
3544                                 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, plev*2/3+randint1(plev/2), SUMMON_DEMON, flg))\r
3545                                 {\r
3546                                         msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));\r
3547 \r
3548                                         if (pet)\r
3549                                         {\r
3550                                                 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));\r
3551                                         }\r
3552                                         else\r
3553                                         {\r
3554                                                 msg_print(_("「卑しき者よ、我は汝の下僕にあらず! お前の魂を頂くぞ!」",\r
3555                                                                         "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));\r
3556                                         }\r
3557                                 }\r
3558                                 else\r
3559                                 {\r
3560                                         msg_print(_("悪魔は現れなかった。", "No demons arrive."));\r
3561                                 }\r
3562                                 break;\r
3563                         }\r
3564                 }\r
3565                 break;\r
3566 \r
3567         case 16:\r
3568                 if (name) return _("悪魔の目", "Devilish Eye");\r
3569                 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");\r
3570     \r
3571                 {\r
3572                         int base = 30;\r
3573                         int sides = 25;\r
3574 \r
3575                         if (info) return info_duration(base, sides);\r
3576 \r
3577                         if (cast)\r
3578                         {\r
3579                                 set_tim_esp(randint1(sides) + base, FALSE);\r
3580                         }\r
3581                 }\r
3582                 break;\r
3583 \r
3584         case 17:\r
3585                 if (name) return _("悪魔のクローク", "Devil Cloak");\r
3586                 if (desc) return _("恐怖を取り除き、一定時間、炎と冷気の耐性、炎のオーラを得る。耐性は装備による耐性に累積する。", \r
3587                         "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
3588     \r
3589                 {\r
3590                         TIME_EFFECT base = 20;\r
3591 \r
3592                         if (info) return info_duration(base, base);\r
3593 \r
3594                         if (cast)\r
3595                         {\r
3596                                 TIME_EFFECT dur = randint1(base) + base;\r
3597                                         \r
3598                                 set_oppose_fire(dur, FALSE);\r
3599                                 set_oppose_cold(dur, FALSE);\r
3600                                 set_tim_sh_fire(dur, FALSE);\r
3601                                 set_afraid(0);\r
3602                                 break;\r
3603                         }\r
3604                 }\r
3605                 break;\r
3606 \r
3607         case 18:\r
3608                 if (name) return _("溶岩流", "The Flow of Lava");\r
3609                 if (desc) return _("自分を中心とした炎の球を作り出し、床を溶岩に変える。", \r
3610                         "Generates a ball of fire centered on you which transforms floors to magma.");\r
3611     \r
3612                 {\r
3613                         HIT_POINT dam = (55 + plev) * 2;\r
3614                         int rad = 3;\r
3615 \r
3616                         if (info) return info_damage(0, 0, dam/2);\r
3617 \r
3618                         if (cast)\r
3619                         {\r
3620                                 fire_ball(GF_FIRE, 0, dam, rad);\r
3621                                 fire_ball_hide(GF_LAVA_FLOW, 0, 2 + randint1(2), rad);\r
3622                         }\r
3623                 }\r
3624                 break;\r
3625 \r
3626         case 19:\r
3627                 if (name) return _("プラズマ球", "Plasma Ball");\r
3628                 if (desc) return _("プラズマの球を放つ。", "Fires a ball of plasma.");\r
3629     \r
3630                 {\r
3631                         HIT_POINT dam = plev * 3 / 2 + 80;\r
3632                         int rad = 2 + plev / 40;\r
3633 \r
3634                         if (info) return info_damage(0, 0, dam);\r
3635 \r
3636                         if (cast)\r
3637                         {\r
3638                                 if (!get_aim_dir(&dir)) return NULL;\r
3639 \r
3640                                 fire_ball(GF_PLASMA, dir, dam, rad);\r
3641                         }\r
3642                 }\r
3643                 break;\r
3644 \r
3645         case 20:\r
3646                 if (name) return _("悪魔変化", "Polymorph Demon");\r
3647                 if (desc) return _("一定時間、悪魔に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔としての能力を得る。", \r
3648                         "Mimic a demon for a while. Loses abilities of original race and gets abilities as a demon.");\r
3649     \r
3650                 {\r
3651                         int base = 10 + plev / 2;\r
3652 \r
3653                         if (info) return info_duration(base, base);\r
3654 \r
3655                         if (cast)\r
3656                         {\r
3657                                 set_mimic(base + randint1(base), MIMIC_DEMON, FALSE);\r
3658                         }\r
3659                 }\r
3660                 break;\r
3661 \r
3662         case 21:\r
3663                 if (name) return _("地獄の波動", "Nather Wave");\r
3664                 if (desc) return _("視界内の全てのモンスターにダメージを与える。善良なモンスターに特に大きなダメージを与える。", \r
3665                         "Damages all monsters in sight. Hurts good monsters greatly.");\r
3666     \r
3667                 {\r
3668                         int sides1 = plev * 2;\r
3669                         int sides2 = plev * 2;\r
3670 \r
3671                         if (info) return format("%sd%d+d%d", s_dam, sides1, sides2);\r
3672 \r
3673                         if (cast)\r
3674                         {\r
3675                                 dispel_monsters(randint1(sides1));\r
3676                                 dispel_good(randint1(sides2));\r
3677                         }\r
3678                 }\r
3679                 break;\r
3680 \r
3681         case 22:\r
3682                 if (name) return _("サキュバスの接吻", "Kiss of Succubus");\r
3683                 if (desc) return _("因果混乱の球を放つ。", "Fires a ball of nexus.");\r
3684     \r
3685                 {\r
3686                         HIT_POINT dam = 100 + plev * 2;\r
3687                         int rad = 4;\r
3688 \r
3689                         if (info) return info_damage(0, 0, dam);\r
3690 \r
3691                         if (cast)\r
3692                         {\r
3693                                 if (!get_aim_dir(&dir)) return NULL;\r
3694                                 fire_ball(GF_NEXUS, dir, dam, rad);\r
3695                         }\r
3696                 }\r
3697                 break;\r
3698 \r
3699         case 23:\r
3700                 if (name) return _("破滅の手", "Doom Hand");\r
3701                 if (desc) return _("破滅の手を放つ。食らったモンスターはそのときのHPの半分前後のダメージを受ける。", "Attempts to make a monster's HP almost half.");\r
3702     \r
3703                 {\r
3704                         if (cast)\r
3705                         {\r
3706                                 if (!get_aim_dir(&dir))\r
3707                                         return NULL;\r
3708                                 else \r
3709                                         msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));\r
3710                                 \r
3711                                 fire_ball_hide(GF_HAND_DOOM, dir, plev * 2, 0);\r
3712                         }\r
3713                 }\r
3714                 break;\r
3715 \r
3716         case 24:\r
3717                 if (name) return _("士気高揚", "Raise the Morale");\r
3718                 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");\r
3719     \r
3720                 {\r
3721                         int base = 25;\r
3722 \r
3723                         if (info) return info_duration(base, base);\r
3724 \r
3725                         if (cast)\r
3726                         {\r
3727                                 set_hero(randint1(base) + base, FALSE);\r
3728                                 hp_player(10);\r
3729                                 set_afraid(0);\r
3730                         }\r
3731                 }\r
3732                 break;\r
3733 \r
3734         case 25:\r
3735                 if (name) return _("不滅の肉体", "Immortal Body");\r
3736                 if (desc) return _("一定時間、時間逆転への耐性を得る。", "Gives resistance to time for a while.");\r
3737     \r
3738                 {\r
3739                         int base = 20;\r
3740 \r
3741                         if (info) return info_duration(base, base);\r
3742 \r
3743                         if (cast)\r
3744                         {\r
3745                                 set_tim_res_time(randint1(base)+base, FALSE);\r
3746                         }\r
3747                 }\r
3748                 break;\r
3749 \r
3750         case 26:\r
3751                 if (name) return _("狂気の円環", "Insanity Circle");\r
3752                 if (desc) return _("自分を中心としたカオスの球、混乱の球を発生させ、近くのモンスターを魅了する。", \r
3753                         "Generate balls of chaos, confusion and charm centered on you.");\r
3754     \r
3755                 {\r
3756                         HIT_POINT dam = 50 + plev;\r
3757                         int power = 20 + plev;\r
3758                         int rad = 3 + plev / 20;\r
3759 \r
3760                         if (info) return format("%s%d+%d", s_dam, dam/2, dam/2);\r
3761 \r
3762                         if (cast)\r
3763                         {\r
3764                                 fire_ball(GF_CHAOS, 0, dam, rad);\r
3765                                 fire_ball(GF_CONFUSION, 0, dam, rad);\r
3766                                 fire_ball(GF_CHARM, 0, power, rad);\r
3767                         }\r
3768                 }\r
3769                 break;\r
3770 \r
3771         case 27:\r
3772                 if (name) return _("ペット爆破", "Explode Pets");\r
3773                 if (desc) return _("全てのペットを強制的に爆破させる。", "Makes all pets explode.");\r
3774     \r
3775                 {\r
3776                         if (cast)\r
3777                         {\r
3778                                 discharge_minion();\r
3779                         }\r
3780                 }\r
3781                 break;\r
3782 \r
3783         case 28:\r
3784                 if (name) return _("グレーターデーモン召喚", "Summon Greater Demon");\r
3785                 if (desc) return _("上級デーモンを召喚する。召喚するには人間('p','h','t'で表されるモンスター)の死体を捧げなければならない。", \r
3786                         "Summons greater demon. It need to sacrifice a corpse of human ('p','h' or 't').");\r
3787     \r
3788                 {\r
3789                         if (cast)\r
3790                         {\r
3791                                 if (!cast_summon_greater_demon()) return NULL;\r
3792                         }\r
3793                 }\r
3794                 break;\r
3795 \r
3796         case 29:\r
3797                 if (name) return _("地獄嵐", "Nether Storm");\r
3798                 if (desc) return _("超巨大な地獄の球を放つ。", "Generate a huge ball of nether.");\r
3799     \r
3800                 {\r
3801                         HIT_POINT dam = plev * 15;\r
3802                         int rad = plev / 5;\r
3803 \r
3804                         if (info) return info_damage(0, 0, dam);\r
3805 \r
3806                         if (cast)\r
3807                         {\r
3808                                 if (!get_aim_dir(&dir)) return NULL;\r
3809 \r
3810                                 fire_ball(GF_NETHER, dir, dam, rad);\r
3811                         }\r
3812                 }\r
3813                 break;\r
3814 \r
3815         case 30:\r
3816                 if (name) return _("血の呪い", "Bloody Curse");\r
3817                 if (desc) return _("自分がダメージを受けることによって対象に呪いをかけ、ダメージを与え様々な効果を引き起こす。",\r
3818                         "Puts blood curse which damages and causes various effects on a monster. You also take damage.");\r
3819     \r
3820                 {\r
3821                         HIT_POINT dam = 600;\r
3822                         int rad = 0;\r
3823 \r
3824                         if (info) return info_damage(0, 0, dam);\r
3825 \r
3826                         if (cast)\r
3827                         {\r
3828                                 if (!get_aim_dir(&dir)) return NULL;\r
3829 \r
3830                                 fire_ball_hide(GF_BLOOD_CURSE, dir, dam, rad);\r
3831                                 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("血の呪い", "Blood curse"), -1);\r
3832                         }\r
3833                 }\r
3834                 break;\r
3835 \r
3836         case 31:\r
3837                 if (name) return _("魔王変化", "Polymorph Demonlord");\r
3838                 if (desc) return _("悪魔の王に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔の王としての能力を得、壁を破壊しながら歩く。",\r
3839                         "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
3840     \r
3841                 {\r
3842                         int base = 15;\r
3843 \r
3844                         if (info) return info_duration(base, base);\r
3845 \r
3846                         if (cast)\r
3847                         {\r
3848                                 set_mimic(base + randint1(base), MIMIC_DEMON_LORD, FALSE);\r
3849                         }\r
3850                 }\r
3851                 break;\r
3852         }\r
3853 \r
3854         return "";\r
3855 }\r
3856 \r
3857 /*!\r
3858  * @brief 破邪領域魔法の各処理を行う\r
3859  * @param spell 魔法ID\r
3860  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)\r
3861  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。\r
3862  */\r
3863 static cptr do_crusade_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
3864 {\r
3865         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
3866         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
3867         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
3868         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
3869 \r
3870         int dir;\r
3871         int plev = p_ptr->lev;\r
3872 \r
3873         switch (spell)\r
3874         {\r
3875         case 0:\r
3876                 if (name) return _("懲罰", "Punishment");\r
3877                 if (desc) return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");\r
3878     \r
3879                 {\r
3880                         int dice = 3 + (plev - 1) / 5;\r
3881                         int sides = 4;\r
3882 \r
3883                         if (info) return info_damage(dice, sides, 0);\r
3884 \r
3885                         if (cast)\r
3886                         {\r
3887                                 if (!get_aim_dir(&dir)) return NULL;\r
3888 \r
3889                                 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));\r
3890                         }\r
3891                 }\r
3892                 break;\r
3893 \r
3894         case 1:\r
3895                 if (name) return _("邪悪存在感知", "Detect Evil");\r
3896                 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");\r
3897     \r
3898                 {\r
3899                         int rad = DETECT_RAD_DEFAULT;\r
3900 \r
3901                         if (info) return info_radius(rad);\r
3902 \r
3903                         if (cast)\r
3904                         {\r
3905                                 detect_monsters_evil(rad);\r
3906                         }\r
3907                 }\r
3908                 break;\r
3909 \r
3910         case 2:\r
3911                 if (name) return _("恐怖除去", "Remove Fear");\r
3912                 if (desc) return _("恐怖を取り除く。", "Removes fear.");\r
3913     \r
3914                 {\r
3915                         if (cast)\r
3916                         {\r
3917                                 set_afraid(0);\r
3918                         }\r
3919                 }\r
3920                 break;\r
3921 \r
3922         case 3:\r
3923                 if (name) return _("威圧", "Scare Monster");\r
3924                 if (desc) return _("モンスター1体を恐怖させる。抵抗されると無効。", "Attempts to scare a monster.");\r
3925     \r
3926                 {\r
3927                         int power = plev;\r
3928 \r
3929                         if (info) return info_power(power);\r
3930 \r
3931                         if (cast)\r
3932                         {\r
3933                                 if (!get_aim_dir(&dir)) return NULL;\r
3934 \r
3935                                 fear_monster(dir, power);\r
3936                         }\r
3937                 }\r
3938                 break;\r
3939 \r
3940         case 4:\r
3941                 if (name) return _("聖域", "Sanctuary");\r
3942                 if (desc) return _("隣接した全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep monsters in the adjacent squares.");\r
3943     \r
3944                 {\r
3945                         int power = plev;\r
3946 \r
3947                         if (info) return info_power(power);\r
3948 \r
3949                         if (cast)\r
3950                         {\r
3951                                 sleep_monsters_touch();\r
3952                         }\r
3953                 }\r
3954                 break;\r
3955 \r
3956         case 5:\r
3957                 if (name) return _("入口", "Portal");\r
3958                 if (desc) return _("中距離のテレポートをする。", "Teleport medium distance.");\r
3959     \r
3960                 {\r
3961                         POSITION range = 25 + plev / 2;\r
3962 \r
3963                         if (info) return info_range(range);\r
3964 \r
3965                         if (cast)\r
3966                         {\r
3967                                 teleport_player(range, 0L);\r
3968                         }\r
3969                 }\r
3970                 break;\r
3971 \r
3972         case 6:\r
3973                 if (name) return _("スターダスト", "Star Dust");\r
3974                 if (desc) return _("ターゲット付近に閃光のボルトを連射する。", "Fires many bolts of light near the target.");\r
3975     \r
3976                 {\r
3977                         int dice = 3 + (plev - 1) / 9;\r
3978                         int sides = 2;\r
3979 \r
3980                         if (info) return info_multi_damage_dice(dice, sides);\r
3981 \r
3982                         if (cast)\r
3983                         {\r
3984                                 if (!get_aim_dir(&dir)) return NULL;\r
3985                                 fire_blast(GF_LITE, dir, dice, sides, 10, 3);\r
3986                         }\r
3987                 }\r
3988                 break;\r
3989 \r
3990         case 7:\r
3991                 if (name) return _("身体浄化", "Purify");\r
3992                 if (desc) return _("傷、毒、朦朧から全快する。", "Heals all cut, stun and poison status.");\r
3993     \r
3994                 {\r
3995                         if (cast)\r
3996                         {\r
3997                                 set_cut(0);\r
3998                                 set_poisoned(0);\r
3999                                 set_stun(0);\r
4000                         }\r
4001                 }\r
4002                 break;\r
4003 \r
4004         case 8:\r
4005                 if (name) return _("邪悪飛ばし", "Scatter Evil");\r
4006                 if (desc) return _("邪悪なモンスター1体をテレポートさせる。抵抗されると無効。", "Attempts to teleport an evil monster away.");\r
4007     \r
4008                 {\r
4009                         int power = MAX_SIGHT * 5;\r
4010 \r
4011                         if (info) return info_power(power);\r
4012 \r
4013                         if (cast)\r
4014                         {\r
4015                                 if (!get_aim_dir(&dir)) return NULL;\r
4016                                 fire_ball(GF_AWAY_EVIL, dir, power, 0);\r
4017                         }\r
4018                 }\r
4019                 break;\r
4020 \r
4021         case 9:\r
4022                 if (name) return _("聖なる光球", "Holy Orb");\r
4023                 if (desc) return _("聖なる力をもつ宝珠を放つ。邪悪なモンスターに対して大きなダメージを与えるが、善良なモンスターには効果がない。", \r
4024                         "Fires a ball with holy power. Hurts evil monsters greatly, but don't effect good monsters.");\r
4025     \r
4026                 {\r
4027                         int dice = 3;\r
4028                         int sides = 6;\r
4029                         int rad = (plev < 30) ? 2 : 3;\r
4030                         int base;\r
4031 \r
4032                         if (p_ptr->pclass == CLASS_PRIEST ||\r
4033                             p_ptr->pclass == CLASS_HIGH_MAGE ||\r
4034                             p_ptr->pclass == CLASS_SORCERER)\r
4035                                 base = plev + plev / 2;\r
4036                         else\r
4037                                 base = plev + plev / 4;\r
4038 \r
4039 \r
4040                         if (info) return info_damage(dice, sides, base);\r
4041 \r
4042                         if (cast)\r
4043                         {\r
4044                                 if (!get_aim_dir(&dir)) return NULL;\r
4045 \r
4046                                 fire_ball(GF_HOLY_FIRE, dir, damroll(dice, sides) + base, rad);\r
4047                         }\r
4048                 }\r
4049                 break;\r
4050 \r
4051         case 10:\r
4052                 if (name) return _("悪魔払い", "Exorcism");\r
4053                 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与え、邪悪なモンスターを恐怖させる。", \r
4054                         "Damages all undead and demons in sight, and scares all evil monsters in sight.");\r
4055     \r
4056                 {\r
4057                         int sides = plev;\r
4058                         int power = plev;\r
4059 \r
4060                         if (info) return info_damage(1, sides, 0);\r
4061 \r
4062                         if (cast)\r
4063                         {\r
4064                                 dispel_undead(randint1(sides));\r
4065                                 dispel_demons(randint1(sides));\r
4066                                 turn_evil(power);\r
4067                         }\r
4068                 }\r
4069                 break;\r
4070 \r
4071         case 11:\r
4072                 if (name) return _("解呪", "Remove Curse");\r
4073                 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");\r
4074     \r
4075                 {\r
4076                         if (cast)\r
4077                         {\r
4078                                 if (remove_curse())\r
4079                                 {\r
4080                                         msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));\r
4081                                 }\r
4082                         }\r
4083                 }\r
4084                 break;\r
4085 \r
4086         case 12:\r
4087                 if (name) return _("透明視認", "Sense Unseen");\r
4088                 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");\r
4089     \r
4090                 {\r
4091                         int base = 24;\r
4092 \r
4093                         if (info) return info_duration(base, base);\r
4094 \r
4095                         if (cast)\r
4096                         {\r
4097                                 set_tim_invis(randint1(base) + base, FALSE);\r
4098                         }\r
4099                 }\r
4100                 break;\r
4101 \r
4102         case 13:\r
4103                 if (name) return _("対邪悪結界", "Protection from Evil");\r
4104                 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");\r
4105     \r
4106                 {\r
4107                         int base = 25;\r
4108                         int sides = 3 * plev;\r
4109 \r
4110                         if (info) return info_duration(base, sides);\r
4111 \r
4112                         if (cast)\r
4113                         {\r
4114                                 set_protevil(randint1(sides) + base, FALSE);\r
4115                         }\r
4116                 }\r
4117                 break;\r
4118 \r
4119         case 14:\r
4120                 if (name) return _("裁きの雷", "Judgment Thunder");\r
4121                 if (desc) return _("強力な電撃のボルトを放つ。", "Fires a powerful bolt of lightning.");\r
4122     \r
4123                 {\r
4124                         HIT_POINT dam = plev * 5;\r
4125 \r
4126                         if (info) return info_damage(0, 0, dam);\r
4127 \r
4128                         if (cast)\r
4129                         {\r
4130                                 if (!get_aim_dir(&dir)) return NULL;\r
4131                                 fire_bolt(GF_ELEC, dir, dam);\r
4132                         }\r
4133                 }\r
4134                 break;\r
4135 \r
4136         case 15:\r
4137                 if (name) return _("聖なる御言葉", "Holy Word");\r
4138                 if (desc) return _("視界内の邪悪な存在に大きなダメージを与え、体力を回復し、毒、恐怖、朦朧状態、負傷から全快する。",\r
4139                         "Damages all evil monsters in sight, heals HP somewhat, and completely heals poison, fear, stun and cut status.");\r
4140     \r
4141                 {\r
4142                         int dam_sides = plev * 6;\r
4143                         int heal = 100;\r
4144 \r
4145                         if (info) return format(_("損:1d%d/回%d", "dam:d%d/h%d"), dam_sides, heal);\r
4146                         if (cast)\r
4147                         {\r
4148                                 dispel_evil(randint1(dam_sides));\r
4149                                 hp_player(heal);\r
4150                                 set_afraid(0);\r
4151                                 set_poisoned(0);\r
4152                                 set_stun(0);\r
4153                                 set_cut(0);\r
4154                         }\r
4155                 }\r
4156                 break;\r
4157 \r
4158         case 16:\r
4159                 if (name) return _("開かれた道", "Unbarring Ways");\r
4160                 if (desc) return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");\r
4161     \r
4162                 {\r
4163                         if (cast)\r
4164                         {\r
4165                                 if (!get_aim_dir(&dir)) return NULL;\r
4166 \r
4167                                 destroy_door(dir);\r
4168                         }\r
4169                 }\r
4170                 break;\r
4171 \r
4172         case 17:\r
4173                 if (name) return _("封魔", "Arrest");\r
4174                 if (desc) return _("邪悪なモンスターの動きを止める。", "Attempts to paralyze an evil monster.");\r
4175     \r
4176                 {\r
4177                         int power = plev * 2;\r
4178 \r
4179                         if (info) return info_power(power);\r
4180 \r
4181                         if (cast)\r
4182                         {\r
4183                                 if (!get_aim_dir(&dir)) return NULL;\r
4184                                 stasis_evil(dir);\r
4185                         }\r
4186                 }\r
4187                 break;\r
4188 \r
4189         case 18:\r
4190                 if (name) return _("聖なるオーラ", "Holy Aura");\r
4191                 if (desc) return _("一定時間、邪悪なモンスターを傷つける聖なるオーラを得る。",\r
4192                         "Gives aura of holy power which injures evil monsters which attacked you for a while.");\r
4193     \r
4194                 {\r
4195                         int base = 20;\r
4196 \r
4197                         if (info) return info_duration(base, base);\r
4198 \r
4199                         if (cast)\r
4200                         {\r
4201                                 set_tim_sh_holy(randint1(base) + base, FALSE);\r
4202                         }\r
4203                 }\r
4204                 break;\r
4205 \r
4206         case 19:\r
4207                 if (name) return _("アンデッド&悪魔退散", "Dispel Undead & Demons");\r
4208                 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与える。", "Damages all undead and demons in sight.");\r
4209     \r
4210                 {\r
4211                         int sides = plev * 4;\r
4212 \r
4213                         if (info) return info_damage(1, sides, 0);\r
4214 \r
4215                         if (cast)\r
4216                         {\r
4217                                 dispel_undead(randint1(sides));\r
4218                                 dispel_demons(randint1(sides));\r
4219                         }\r
4220                 }\r
4221                 break;\r
4222 \r
4223         case 20:\r
4224                 if (name) return _("邪悪退散", "Dispel Evil");\r
4225                 if (desc) return _("視界内の全ての邪悪なモンスターにダメージを与える。", "Damages all evil monsters in sight.");\r
4226     \r
4227                 {\r
4228                         int sides = plev * 4;\r
4229 \r
4230                         if (info) return info_damage(1, sides, 0);\r
4231 \r
4232                         if (cast)\r
4233                         {\r
4234                                 dispel_evil(randint1(sides));\r
4235                         }\r
4236                 }\r
4237                 break;\r
4238 \r
4239         case 21:\r
4240                 if (name) return _("聖なる刃", "Holy Blade");\r
4241                 if (desc) return _("通常の武器に滅邪の属性をつける。", "Makes current weapon especially deadly against evil monsters.");\r
4242     \r
4243                 {\r
4244                         if (cast)\r
4245                         {\r
4246                                 brand_weapon(13);\r
4247                         }\r
4248                 }\r
4249                 break;\r
4250 \r
4251         case 22:\r
4252                 if (name) return _("スターバースト", "Star Burst");\r
4253                 if (desc) return _("巨大な閃光の球を放つ。", "Fires a huge ball of powerful light.");\r
4254     \r
4255                 {\r
4256                         HIT_POINT dam = 100 + plev * 2;\r
4257                         int rad = 4;\r
4258 \r
4259                         if (info) return info_damage(0, 0, dam);\r
4260 \r
4261                         if (cast)\r
4262                         {\r
4263                                 if (!get_aim_dir(&dir)) return NULL;\r
4264 \r
4265                                 fire_ball(GF_LITE, dir, dam, rad);\r
4266                         }\r
4267                 }\r
4268                 break;\r
4269 \r
4270         case 23:\r
4271                 if (name) return _("天使召喚", "Summon Angel");\r
4272                 if (desc) return _("天使を1体召喚する。", "Summons an angel.");\r
4273     \r
4274                 {\r
4275                         if (cast)\r
4276                         {\r
4277                                 bool pet = !one_in_(3);\r
4278                                 u32b flg = 0L;\r
4279 \r
4280                                 if (pet) flg |= PM_FORCE_PET;\r
4281                                 else flg |= PM_NO_PET;\r
4282                                 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;\r
4283 \r
4284                                 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_ANGEL, flg))\r
4285                                 {\r
4286                                         if (pet)\r
4287                                         {\r
4288                                                 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));\r
4289                                         }\r
4290                                         else\r
4291                                         {\r
4292                                                 msg_print(_("「我は汝の下僕にあらず! 悪行者よ、悔い改めよ!」", "Mortal! Repent of thy impiousness."));\r
4293                                         }\r
4294                                 }\r
4295                         }\r
4296                 }\r
4297                 break;\r
4298 \r
4299         case 24:\r
4300                 if (name) return _("士気高揚", "Heroism");\r
4301                 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");\r
4302     \r
4303                 {\r
4304                         int base = 25;\r
4305 \r
4306                         if (info) return info_duration(base, base);\r
4307 \r
4308                         if (cast)\r
4309                         {\r
4310                                 set_hero(randint1(base) + base, FALSE);\r
4311                                 hp_player(10);\r
4312                                 set_afraid(0);\r
4313                         }\r
4314                 }\r
4315                 break;\r
4316 \r
4317         case 25:\r
4318                 if (name) return _("呪い退散", "Dispel Curse");\r
4319                 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");\r
4320     \r
4321                 {\r
4322                         if (cast)\r
4323                         {\r
4324                                 if (remove_all_curse())\r
4325                                 {\r
4326                                         msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));\r
4327                                 }\r
4328                         }\r
4329                 }\r
4330                 break;\r
4331 \r
4332         case 26:\r
4333                 if (name) return _("邪悪追放", "Banish Evil");\r
4334                 if (desc) return _("視界内の全ての邪悪なモンスターをテレポートさせる。抵抗されると無効。", \r
4335                         "Teleports all evil monsters in sight away unless resisted.");\r
4336     \r
4337                 {\r
4338                         int power = 100;\r
4339 \r
4340                         if (info) return info_power(power);\r
4341 \r
4342                         if (cast)\r
4343                         {\r
4344                                 if (banish_evil(power))\r
4345                                 {\r
4346                                         msg_print(_("神聖な力が邪悪を打ち払った!", "The holy power banishes evil!"));\r
4347                                 }\r
4348                         }\r
4349                 }\r
4350                 break;\r
4351 \r
4352         case 27:\r
4353                 if (name) return _("ハルマゲドン", "Armageddon");\r
4354                 if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroy everything in nearby area.");\r
4355     \r
4356                 {\r
4357                         int base = 12;\r
4358                         int sides = 4;\r
4359 \r
4360                         if (cast)\r
4361                         {\r
4362                                 destroy_area(p_ptr->y, p_ptr->x, base + randint1(sides), FALSE);\r
4363                         }\r
4364                 }\r
4365                 break;\r
4366 \r
4367         case 28:\r
4368                 if (name) return _("目には目を", "An Eye for an Eye");\r
4369                 if (desc) return _("一定時間、自分がダメージを受けたときに攻撃を行ったモンスターに対して同等のダメージを与える。", \r
4370                         "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
4371     \r
4372                 {\r
4373                         int base = 10;\r
4374 \r
4375                         if (info) return info_duration(base, base);\r
4376 \r
4377                         if (cast)\r
4378                         {\r
4379                                 set_tim_eyeeye(randint1(base) + base, FALSE);\r
4380                         }\r
4381                 }\r
4382                 break;\r
4383 \r
4384         case 29:\r
4385                 if (name) return _("神の怒り", "Wrath of the God");\r
4386                 if (desc) return _("ターゲットの周囲に分解の球を多数落とす。", "Drops many balls of disintegration near the target.");\r
4387     \r
4388                 {\r
4389                         HIT_POINT dam = plev * 3 + 25;\r
4390                         int rad = 2;\r
4391 \r
4392                         if (info) return info_multi_damage(dam);\r
4393 \r
4394                         if (cast)\r
4395                         {\r
4396                                 if (!cast_wrath_of_the_god(dam, rad)) return NULL;\r
4397                         }\r
4398                 }\r
4399                 break;\r
4400 \r
4401         case 30:\r
4402                 if (name) return _("神威", "Divine Intervention");\r
4403                 if (desc) return _("隣接するモンスターに聖なるダメージを与え、視界内のモンスターにダメージ、減速、朦朧、混乱、恐怖、眠りを与える。さらに体力を回復する。", \r
4404                         "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
4405     \r
4406                 {\r
4407                         int b_dam = plev * 11;\r
4408                         int d_dam = plev * 4;\r
4409                         int heal = 100;\r
4410                         int power = plev * 4;\r
4411 \r
4412                         if (info) return format(_("回%d/損%d+%d", "h%d/dm%d+%d"), heal, d_dam, b_dam/2);\r
4413                         if (cast)\r
4414                         {\r
4415                                 project(0, 1, p_ptr->y, p_ptr->x, b_dam, GF_HOLY_FIRE, PROJECT_KILL, -1);\r
4416                                 dispel_monsters(d_dam);\r
4417                                 slow_monsters(plev);\r
4418                                 stun_monsters(power);\r
4419                                 confuse_monsters(power);\r
4420                                 turn_monsters(power);\r
4421                                 stasis_monsters(power);\r
4422                                 hp_player(heal);\r
4423                         }\r
4424                 }\r
4425                 break;\r
4426 \r
4427         case 31:\r
4428                 if (name) return _("聖戦", "Crusade");\r
4429                 if (desc) return _("視界内の善良なモンスターをペットにしようとし、ならなかった場合及び善良でないモンスターを恐怖させる。さらに多数の加速された騎士を召喚し、ヒーロー、祝福、加速、対邪悪結界を得る。", \r
4430                         "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
4431     \r
4432                 {\r
4433                         if (cast)\r
4434                         {\r
4435                                 int base = 25;\r
4436                                 int sp_sides = 20 + plev;\r
4437                                 int sp_base = plev;\r
4438 \r
4439                                 int i;\r
4440                                 crusade();\r
4441                                 for (i = 0; i < 12; i++)\r
4442                                 {\r
4443                                         int attempt = 10;\r
4444                                         POSITION my = 0, mx = 0;\r
4445 \r
4446                                         while (attempt--)\r
4447                                         {\r
4448                                                 scatter(&my, &mx, p_ptr->y, p_ptr->x, 4, 0);\r
4449 \r
4450                                                 /* Require empty grids */\r
4451                                                 if (cave_empty_bold2(my, mx)) break;\r
4452                                         }\r
4453                                         if (attempt < 0) continue;\r
4454                                         summon_specific(-1, my, mx, plev, SUMMON_KNIGHTS, (PM_ALLOW_GROUP | PM_FORCE_PET | PM_HASTE));\r
4455                                 }\r
4456                                 set_hero(randint1(base) + base, FALSE);\r
4457                                 set_blessed(randint1(base) + base, FALSE);\r
4458                                 set_fast(randint1(sp_sides) + sp_base, FALSE);\r
4459                                 set_protevil(randint1(base) + base, FALSE);\r
4460                                 set_afraid(0);\r
4461                         }\r
4462                 }\r
4463                 break;\r
4464         }\r
4465 \r
4466         return "";\r
4467 }\r
4468 \r
4469 \r
4470 /*!\r
4471  * @brief 歌の各処理を行う\r
4472  * @param spell 歌ID\r
4473  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP)\r
4474  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。\r
4475  */\r
4476 static cptr do_music_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
4477 {\r
4478         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
4479         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
4480         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
4481         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
4482         bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;\r
4483         bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;\r
4484         bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;\r
4485         static const char s_dam[] = _("損傷:", "dam ");\r
4486 \r
4487         int dir;\r
4488         int plev = p_ptr->lev;\r
4489 \r
4490         switch (spell)\r
4491         {\r
4492         case 0:\r
4493                 if (name) return _("遅鈍の歌", "Song of Holding");\r
4494                 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");\r
4495     \r
4496                 /* Stop singing before start another */\r
4497                 if (cast || fail) stop_singing();\r
4498 \r
4499                 if (cast)\r
4500                 {\r
4501                         msg_print(_("ゆっくりとしたメロディを口ずさみ始めた...", "You start humming a slow, steady melody..."));\r
4502                         start_singing(spell, MUSIC_SLOW);\r
4503                 }\r
4504 \r
4505                 {\r
4506                         int power = plev;\r
4507 \r
4508                         if (info) return info_power(power);\r
4509 \r
4510                         if (cont)\r
4511                         {\r
4512                                 slow_monsters(plev);\r
4513                         }\r
4514                 }\r
4515                 break;\r
4516 \r
4517         case 1:\r
4518                 if (name) return _("祝福の歌", "Song of Blessing");\r
4519                 if (desc) return _("命中率とACのボーナスを得る。", "Gives bonus to hit and AC for a few turns.");\r
4520     \r
4521                 /* Stop singing before start another */\r
4522                 if (cast || fail) stop_singing();\r
4523 \r
4524                 if (cast)\r
4525                 {\r
4526                         msg_print(_("厳かなメロディを奏で始めた...", "The holy power of the Music of the Ainur enters you..."));\r
4527                         start_singing(spell, MUSIC_BLESS);\r
4528                 }\r
4529 \r
4530                 if (stop)\r
4531                 {\r
4532                         if (!p_ptr->blessed)\r
4533                         {\r
4534                                 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));\r
4535                         }\r
4536                 }\r
4537 \r
4538                 break;\r
4539 \r
4540         case 2:\r
4541                 if (name) return _("崩壊の音色", "Wrecking Note");\r
4542                 if (desc) return _("轟音のボルトを放つ。", "Fires a bolt of sound.");\r
4543     \r
4544                 /* Stop singing before start another */\r
4545                 if (cast || fail) stop_singing();\r
4546 \r
4547                 {\r
4548                         int dice = 4 + (plev - 1) / 5;\r
4549                         int sides = 4;\r
4550 \r
4551                         if (info) return info_damage(dice, sides, 0);\r
4552 \r
4553                         if (cast)\r
4554                         {\r
4555                                 if (!get_aim_dir(&dir)) return NULL;\r
4556 \r
4557                                 fire_bolt(GF_SOUND, dir, damroll(dice, sides));\r
4558                         }\r
4559                 }\r
4560                 break;\r
4561 \r
4562         case 3:\r
4563                 if (name) return _("朦朧の旋律", "Stun Pattern");\r
4564                 if (desc) return _("視界内の全てのモンスターを朦朧させる。抵抗されると無効。", "Attempts to stun all monsters in sight.");\r
4565     \r
4566                 /* Stop singing before start another */\r
4567                 if (cast || fail) stop_singing();\r
4568 \r
4569                 if (cast)\r
4570                 {\r
4571                         msg_print(_("眩惑させるメロディを奏で始めた...", "You weave a pattern of sounds to bewilder and daze..."));\r
4572                         start_singing(spell, MUSIC_STUN);\r
4573                 }\r
4574 \r
4575                 {\r
4576                         int dice = plev / 10;\r
4577                         int sides = 2;\r
4578 \r
4579                         if (info) return info_power_dice(dice, sides);\r
4580 \r
4581                         if (cont)\r
4582                         {\r
4583                                 stun_monsters(damroll(dice, sides));\r
4584                         }\r
4585                 }\r
4586 \r
4587                 break;\r
4588 \r
4589         case 4:\r
4590                 if (name) return _("生命の流れ", "Flow of Life");\r
4591                 if (desc) return _("体力を少し回復させる。", "Heals HP a little.");\r
4592     \r
4593                 /* Stop singing before start another */\r
4594                 if (cast || fail) stop_singing();\r
4595 \r
4596                 if (cast)\r
4597                 {\r
4598                         msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing a song of healing..."));\r
4599                         start_singing(spell, MUSIC_L_LIFE);\r
4600                 }\r
4601 \r
4602                 {\r
4603                         int dice = 2;\r
4604                         int sides = 6;\r
4605 \r
4606                         if (info) return info_heal(dice, sides, 0);\r
4607 \r
4608                         if (cont)\r
4609                         {\r
4610                                 hp_player(damroll(dice, sides));\r
4611                         }\r
4612                 }\r
4613 \r
4614                 break;\r
4615 \r
4616         case 5:\r
4617                 if (name) return _("太陽の歌", "Song of the Sun");\r
4618                 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");\r
4619     \r
4620                 /* Stop singing before start another */\r
4621                 if (cast || fail) stop_singing();\r
4622 \r
4623                 {\r
4624                         int dice = 2;\r
4625                         int sides = plev / 2;\r
4626                         int rad = plev / 10 + 1;\r
4627 \r
4628                         if (info) return info_damage(dice, sides, 0);\r
4629 \r
4630                         if (cast)\r
4631                         {\r
4632                                 msg_print(_("光り輝く歌が辺りを照らした。", "Your uplifting song brings brightness to dark places..."));\r
4633                                 lite_area(damroll(dice, sides), rad);\r
4634                         }\r
4635                 }\r
4636                 break;\r
4637 \r
4638         case 6:\r
4639                 if (name) return _("恐怖の歌", "Song of Fear");\r
4640                 if (desc) return _("視界内の全てのモンスターを恐怖させる。抵抗されると無効。", "Attempts to scare all monsters in sight.");\r
4641     \r
4642                 /* Stop singing before start another */\r
4643                 if (cast || fail) stop_singing();\r
4644 \r
4645                 if (cast)\r
4646                 {\r
4647                         msg_print(_("おどろおどろしいメロディを奏で始めた...", "You start weaving a fearful pattern..."));\r
4648                         start_singing(spell, MUSIC_FEAR);                       \r
4649                 }\r
4650 \r
4651                 {\r
4652                         int power = plev;\r
4653 \r
4654                         if (info) return info_power(power);\r
4655 \r
4656                         if (cont)\r
4657                         {\r
4658                                 project_hack(GF_TURN_ALL, power);\r
4659                         }\r
4660                 }\r
4661 \r
4662                 break;\r
4663 \r
4664         case 7:\r
4665                 if (name) return _("戦いの歌", "Heroic Ballad");\r
4666                 if (desc) return _("ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");\r
4667 \r
4668                 /* Stop singing before start another */\r
4669                 if (cast || fail) stop_singing();\r
4670 \r
4671                 if (cast)\r
4672                 {\r
4673                         msg_print(_("激しい戦いの歌を歌った...", "You start singing a song of intense fighting..."));\r
4674 \r
4675                         (void)hp_player(10);\r
4676                         (void)set_afraid(0);\r
4677 \r
4678                         /* Recalculate hitpoints */\r
4679                         p_ptr->update |= (PU_HP);\r
4680 \r
4681                         start_singing(spell, MUSIC_HERO);\r
4682                 }\r
4683 \r
4684                 if (stop)\r
4685                 {\r
4686                         if (!p_ptr->hero)\r
4687                         {\r
4688                                 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));\r
4689                                 /* Recalculate hitpoints */\r
4690                                 p_ptr->update |= (PU_HP);\r
4691                         }\r
4692                 }\r
4693 \r
4694                 break;\r
4695 \r
4696         case 8:\r
4697                 if (name) return _("霊的知覚", "Clairaudience");\r
4698                 if (desc) return _("近くの罠/扉/階段を感知する。レベル15で全てのモンスター、20で財宝とアイテムを感知できるようになる。レベル25で周辺の地形を感知し、40でその階全体を永久に照らし、ダンジョン内のすべてのアイテムを感知する。この効果は歌い続けることで順に起こる。", \r
4699                         "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
4700     \r
4701                 /* Stop singing before start another */\r
4702                 if (cast || fail) stop_singing();\r
4703 \r
4704                 if (cast)\r
4705                 {\r
4706                         msg_print(_("静かな音楽が感覚を研ぎ澄まさせた...", "Your quiet music sharpens your sense of hearing..."));\r
4707                         /* Hack -- Initialize the turn count */\r
4708                         SINGING_COUNT(p_ptr) = 0;\r
4709                         start_singing(spell, MUSIC_DETECT);\r
4710                 }\r
4711 \r
4712                 {\r
4713                         int rad = DETECT_RAD_DEFAULT;\r
4714 \r
4715                         if (info) return info_radius(rad);\r
4716 \r
4717                         if (cont)\r
4718                         {\r
4719                                 int count = SINGING_COUNT(p_ptr);\r
4720 \r
4721                                 if (count >= 19) wiz_lite(FALSE);\r
4722                                 if (count >= 11)\r
4723                                 {\r
4724                                         map_area(rad);\r
4725                                         if (plev > 39 && count < 19)\r
4726                                                 SINGING_COUNT(p_ptr) = count + 1;\r
4727                                 }\r
4728                                 if (count >= 6)\r
4729                                 {\r
4730                                         /* There are too many hidden treasure.  So... */\r
4731                                         /* detect_treasure(rad); */\r
4732                                         detect_objects_gold(rad);\r
4733                                         detect_objects_normal(rad);\r
4734 \r
4735                                         if (plev > 24 && count < 11)\r
4736                                                 SINGING_COUNT(p_ptr) = count + 1;\r
4737                                 }\r
4738                                 if (count >= 3)\r
4739                                 {\r
4740                                         detect_monsters_invis(rad);\r
4741                                         detect_monsters_normal(rad);\r
4742 \r
4743                                         if (plev > 19 && count < 6)\r
4744                                                 SINGING_COUNT(p_ptr) = count + 1;\r
4745                                 }\r
4746                                 detect_traps(rad, TRUE);\r
4747                                 detect_doors(rad);\r
4748                                 detect_stairs(rad);\r
4749 \r
4750                                 if (plev > 14 && count < 3)\r
4751                                         SINGING_COUNT(p_ptr) = count + 1;\r
4752                         }\r
4753                 }\r
4754 \r
4755                 break;\r
4756 \r
4757         case 9:\r
4758                 if (name) return _("魂の歌", "Soul Shriek");\r
4759                 if (desc) return _("視界内の全てのモンスターに対して精神攻撃を行う。", "Damages all monsters in sight with PSI damages.");\r
4760 \r
4761                 /* Stop singing before start another */\r
4762                 if (cast || fail) stop_singing();\r
4763 \r
4764                 if (cast)\r
4765                 {\r
4766                         msg_print(_("精神を捻じ曲げる歌を歌った...", "You start singing a song of soul in pain..."));\r
4767                         start_singing(spell, MUSIC_PSI);\r
4768                 }\r
4769 \r
4770                 {\r
4771                         int dice = 1;\r
4772                         int sides = plev * 3 / 2;\r
4773 \r
4774                         if (info) return info_damage(dice, sides, 0);\r
4775 \r
4776                         if (cont)\r
4777                         {\r
4778                                 project_hack(GF_PSI, damroll(dice, sides));\r
4779                         }\r
4780                 }\r
4781 \r
4782                 break;\r
4783 \r
4784         case 10:\r
4785                 if (name) return _("知識の歌", "Song of Lore");\r
4786                 if (desc) return _("自分のいるマスと隣りのマスに落ちているアイテムを鑑定する。", "Identifies all items which are in the adjacent squares.");\r
4787     \r
4788                 /* Stop singing before start another */\r
4789                 if (cast || fail) stop_singing();\r
4790 \r
4791                 if (cast)\r
4792                 {\r
4793                         msg_print(_("この世界の知識が流れ込んできた...", "You recall the rich lore of the world..."));\r
4794                         start_singing(spell, MUSIC_ID);\r
4795                 }\r
4796 \r
4797                 {\r
4798                         int rad = 1;\r
4799 \r
4800                         if (info) return info_radius(rad);\r
4801 \r
4802                         /*\r
4803                          * 歌の開始時にも効果発動:\r
4804                          * MP不足で鑑定が発動される前に歌が中断してしまうのを防止。\r
4805                          */\r
4806                         if (cont || cast)\r
4807                         {\r
4808                                 project(0, rad, p_ptr->y, p_ptr->x, 0, GF_IDENTIFY, PROJECT_ITEM, -1);\r
4809                         }\r
4810                 }\r
4811 \r
4812                 break;\r
4813 \r
4814         case 11:\r
4815                 if (name) return _("隠遁の歌", "Hiding Tune");\r
4816                 if (desc) return _("隠密行動能力を上昇させる。", "Gives improved stealth.");\r
4817 \r
4818                 /* Stop singing before start another */\r
4819                 if (cast || fail) stop_singing();\r
4820 \r
4821                 if (cast)\r
4822                 {\r
4823                         msg_print(_("あなたの姿が景色にとけこんでいった...", "Your song carries you beyond the sight of mortal eyes..."));\r
4824                         start_singing(spell, MUSIC_STEALTH);\r
4825                 }\r
4826 \r
4827                 if (stop)\r
4828                 {\r
4829                         if (!p_ptr->tim_stealth)\r
4830                         {\r
4831                                 msg_print(_("姿がはっきりと見えるようになった。", "You are no longer hided."));\r
4832                         }\r
4833                 }\r
4834 \r
4835                 break;\r
4836 \r
4837         case 12:\r
4838                 if (name) return _("幻影の旋律", "Illusion Pattern");\r
4839                 if (desc) return _("視界内の全てのモンスターを混乱させる。抵抗されると無効。", "Attempts to confuse all monsters in sight.");\r
4840     \r
4841                 /* Stop singing before start another */\r
4842                 if (cast || fail) stop_singing();\r
4843 \r
4844                 if (cast)\r
4845                 {\r
4846                         msg_print(_("辺り一面に幻影が現れた...", "You weave a pattern of sounds to beguile and confuse..."));\r
4847                         start_singing(spell, MUSIC_CONF);\r
4848                 }\r
4849 \r
4850                 {\r
4851                         int power = plev * 2;\r
4852 \r
4853                         if (info) return info_power(power);\r
4854 \r
4855                         if (cont)\r
4856                         {\r
4857                                 confuse_monsters(power);\r
4858                         }\r
4859                 }\r
4860 \r
4861                 break;\r
4862 \r
4863         case 13:\r
4864                 if (name) return _("破滅の叫び", "Doomcall");\r
4865                 if (desc) return _("視界内の全てのモンスターに対して轟音攻撃を行う。", "Damages all monsters in sight with booming sound.");\r
4866     \r
4867                 /* Stop singing before start another */\r
4868                 if (cast || fail) stop_singing();\r
4869 \r
4870                 if (cast)\r
4871                 {\r
4872                         msg_print(_("轟音が響いた...", "The fury of the Downfall of Numenor lashes out..."));\r
4873                         start_singing(spell, MUSIC_SOUND);\r
4874                 }\r
4875 \r
4876                 {\r
4877                         int dice = 10 + plev / 5;\r
4878                         int sides = 7;\r
4879 \r
4880                         if (info) return info_damage(dice, sides, 0);\r
4881 \r
4882                         if (cont)\r
4883                         {\r
4884                                 project_hack(GF_SOUND, damroll(dice, sides));\r
4885                         }\r
4886                 }\r
4887 \r
4888                 break;\r
4889 \r
4890         case 14:\r
4891                 if (name) return _("フィリエルの歌", "Firiel's Song");\r
4892                 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");\r
4893     \r
4894                 {\r
4895                         /* Stop singing before start another */\r
4896                         if (cast || fail) stop_singing();\r
4897 \r
4898                         if (cast)\r
4899                         {\r
4900                                 msg_print(_("生命と復活のテーマを奏で始めた...", "The themes of life and revival are woven into your song..."));\r
4901                                 animate_dead(0, p_ptr->y, p_ptr->x);\r
4902                         }\r
4903                 }\r
4904                 break;\r
4905 \r
4906         case 15:\r
4907                 if (name) return _("旅の仲間", "Fellowship Chant");\r
4908                 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");\r
4909 \r
4910                 /* Stop singing before start another */\r
4911                 if (cast || fail) stop_singing();\r
4912 \r
4913                 if (cast)\r
4914                 {\r
4915                         msg_print(_("安らかなメロディを奏で始めた...", "You weave a slow, soothing melody of imploration..."));\r
4916                         start_singing(spell, MUSIC_CHARM);\r
4917                 }\r
4918 \r
4919                 {\r
4920                         int dice = 10 + plev / 15;\r
4921                         int sides = 6;\r
4922 \r
4923                         if (info) return info_power_dice(dice, sides);\r
4924 \r
4925                         if (cont)\r
4926                         {\r
4927                                 charm_monsters(damroll(dice, sides));\r
4928                         }\r
4929                 }\r
4930 \r
4931                 break;\r
4932 \r
4933         case 16:\r
4934                 if (name) return _("分解音波", "Sound of disintegration");\r
4935                 if (desc) return _("壁を掘り進む。自分の足元のアイテムは蒸発する。", "Makes you be able to burrow into walls. Objects under your feet evaporate.");\r
4936 \r
4937                 /* Stop singing before start another */\r
4938                 if (cast || fail) stop_singing();\r
4939 \r
4940                 if (cast)\r
4941                 {\r
4942                         msg_print(_("粉砕するメロディを奏で始めた...", "You weave a violent pattern of sounds to break wall."));\r
4943                         start_singing(spell, MUSIC_WALL);\r
4944                 }\r
4945 \r
4946                 {\r
4947                         /*\r
4948                          * 歌の開始時にも効果発動:\r
4949                          * MP不足で効果が発動される前に歌が中断してしまうのを防止。\r
4950                          */\r
4951                         if (cont || cast)\r
4952                         {\r
4953                                 project(0, 0, p_ptr->y, p_ptr->x,\r
4954                                         0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1);\r
4955                         }\r
4956                 }\r
4957                 break;\r
4958 \r
4959         case 17:\r
4960                 if (name) return _("元素耐性", "Finrod's Resistance");\r
4961                 if (desc) return _("酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。", \r
4962                         "Gives resistance to fire, cold, electricity, acid and poison. These resistances can be added to which from equipment for more powerful resistances.");\r
4963     \r
4964                 /* Stop singing before start another */\r
4965                 if (cast || fail) stop_singing();\r
4966 \r
4967                 if (cast)\r
4968                 {\r
4969                         msg_print(_("元素の力に対する忍耐の歌を歌った。", "You sing a song of perseverance against powers..."));\r
4970                         start_singing(spell, MUSIC_RESIST);\r
4971                 }\r
4972 \r
4973                 if (stop)\r
4974                 {\r
4975                         if (!p_ptr->oppose_acid)\r
4976                         {\r
4977                                 msg_print(_("酸への耐性が薄れた気がする。", "You feel less resistant to acid."));\r
4978                         }\r
4979 \r
4980                         if (!p_ptr->oppose_elec)\r
4981                         {\r
4982                                 msg_print(_("電撃への耐性が薄れた気がする。", "You feel less resistant to elec."));\r
4983                         }\r
4984 \r
4985                         if (!p_ptr->oppose_fire)\r
4986                         {\r
4987                                 msg_print(_("火への耐性が薄れた気がする。", "You feel less resistant to fire."));\r
4988                         }\r
4989 \r
4990                         if (!p_ptr->oppose_cold)\r
4991                         {\r
4992                                 msg_print(_("冷気への耐性が薄れた気がする。", "You feel less resistant to cold."));\r
4993                         }\r
4994 \r
4995                         if (!p_ptr->oppose_pois)\r
4996                         {\r
4997                                 msg_print(_("毒への耐性が薄れた気がする。", "You feel less resistant to pois."));\r
4998                         }\r
4999                 }\r
5000 \r
5001                 break;\r
5002 \r
5003         case 18:\r
5004                 if (name) return _("ホビットのメロディ", "Hobbit Melodies");\r
5005                 if (desc) return _("加速する。", "Hastes you.");\r
5006 \r
5007                 /* Stop singing before start another */\r
5008                 if (cast || fail) stop_singing();\r
5009 \r
5010                 if (cast)\r
5011                 {\r
5012                         msg_print(_("軽快な歌を口ずさみ始めた...", "You start singing joyful pop song..."));\r
5013                         start_singing(spell, MUSIC_SPEED);\r
5014                 }\r
5015 \r
5016                 if (stop)\r
5017                 {\r
5018                         if (!p_ptr->fast)\r
5019                         {\r
5020                                 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));\r
5021                         }\r
5022                 }\r
5023 \r
5024                 break;\r
5025 \r
5026         case 19:\r
5027                 if (name) return _("歪んだ世界", "World Contortion");\r
5028                 if (desc) return _("近くのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all nearby monsters away unless resisted.");\r
5029     \r
5030                 {\r
5031                         int rad = plev / 15 + 1;\r
5032                         int power = plev * 3 + 1;\r
5033 \r
5034                         if (info) return info_radius(rad);\r
5035 \r
5036                         /* Stop singing before start another */\r
5037                         if (cast || fail) stop_singing();\r
5038 \r
5039                         if (cast)\r
5040                         {\r
5041                                 msg_print(_("歌が空間を歪めた...", "Reality whirls wildly as you sing a dizzying melody..."));\r
5042                                 project(0, rad, p_ptr->y, p_ptr->x, power, GF_AWAY_ALL, PROJECT_KILL, -1);\r
5043                         }\r
5044                 }\r
5045                 break;\r
5046 \r
5047         case 20:\r
5048                 if (name) return _("退散の歌", "Dispelling chant");\r
5049                 if (desc) return _("視界内の全てのモンスターにダメージを与える。邪悪なモンスターに特に大きなダメージを与える。", \r
5050                         "Damages all monsters in sight. Hurts evil monsters greatly.");\r
5051     \r
5052                 /* Stop singing before start another */\r
5053                 if (cast || fail) stop_singing();\r
5054 \r
5055                 if (cast)\r
5056                 {\r
5057                         msg_print(_("耐えられない不協和音が敵を責め立てた...", "You cry out in an ear-wracking voice..."));\r
5058                         start_singing(spell, MUSIC_DISPEL);\r
5059                 }\r
5060 \r
5061                 {\r
5062                         int m_sides = plev * 3;\r
5063                         int e_sides = plev * 3;\r
5064 \r
5065                         if (info) return format("%s1d%d+1d%d", s_dam, m_sides, e_sides);\r
5066 \r
5067                         if (cont)\r
5068                         {\r
5069                                 dispel_monsters(randint1(m_sides));\r
5070                                 dispel_evil(randint1(e_sides));\r
5071                         }\r
5072                 }\r
5073                 break;\r
5074 \r
5075         case 21:\r
5076                 if (name) return _("サルマンの甘言", "The Voice of Saruman");\r
5077                 if (desc) return _("視界内の全てのモンスターを減速させ、眠らせようとする。抵抗されると無効。", "Attempts to slow and sleep all monsters in sight.");\r
5078     \r
5079                 /* Stop singing before start another */\r
5080                 if (cast || fail) stop_singing();\r
5081 \r
5082                 if (cast)\r
5083                 {\r
5084                         msg_print(_("優しく、魅力的な歌を口ずさみ始めた...", "You start humming a gentle and attractive song..."));\r
5085                         start_singing(spell, MUSIC_SARUMAN);\r
5086                 }\r
5087 \r
5088                 {\r
5089                         int power = plev;\r
5090 \r
5091                         if (info) return info_power(power);\r
5092 \r
5093                         if (cont)\r
5094                         {\r
5095                                 slow_monsters(plev);\r
5096                                 sleep_monsters(plev);\r
5097                         }\r
5098                 }\r
5099 \r
5100                 break;\r
5101 \r
5102         case 22:\r
5103                 if (name) return _("嵐の音色", "Song of the Tempest");\r
5104                 if (desc) return _("轟音のビームを放つ。", "Fires a beam of sound.");\r
5105     \r
5106                 {\r
5107                         int dice = 15 + (plev - 1) / 2;\r
5108                         int sides = 10;\r
5109 \r
5110                         if (info) return info_damage(dice, sides, 0);\r
5111 \r
5112                         /* Stop singing before start another */\r
5113                         if (cast || fail) stop_singing();\r
5114 \r
5115                         if (cast)\r
5116                         {\r
5117                                 if (!get_aim_dir(&dir)) return NULL;\r
5118 \r
5119                                 fire_beam(GF_SOUND, dir, damroll(dice, sides));\r
5120                         }\r
5121                 }\r
5122                 break;\r
5123 \r
5124         case 23:\r
5125                 if (name) return _("もう一つの世界", "Ambarkanta");\r
5126                 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");\r
5127     \r
5128                 {\r
5129                         int base = 15;\r
5130                         int sides = 20;\r
5131 \r
5132                         if (info) return info_delay(base, sides);\r
5133 \r
5134                         /* Stop singing before start another */\r
5135                         if (cast || fail) stop_singing();\r
5136 \r
5137                         if (cast)\r
5138                         {\r
5139                                 msg_print(_("周囲が変化し始めた...", "You sing of the primeval shaping of Middle-earth..."));\r
5140                                 alter_reality();\r
5141                         }\r
5142                 }\r
5143                 break;\r
5144 \r
5145         case 24:\r
5146                 if (name) return _("破壊の旋律", "Wrecking Pattern");\r
5147                 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。", \r
5148                         "Shakes dungeon structure, and results in random swapping of floors and walls.");\r
5149 \r
5150                 /* Stop singing before start another */\r
5151                 if (cast || fail) stop_singing();\r
5152 \r
5153                 if (cast)\r
5154                 {\r
5155                         msg_print(_("破壊的な歌が響きわたった...", "You weave a pattern of sounds to contort and shatter..."));\r
5156                         start_singing(spell, MUSIC_QUAKE);\r
5157                 }\r
5158 \r
5159                 {\r
5160                         int rad = 10;\r
5161 \r
5162                         if (info) return info_radius(rad);\r
5163 \r
5164                         if (cont)\r
5165                         {\r
5166                                 earthquake(p_ptr->y, p_ptr->x, 10);\r
5167                         }\r
5168                 }\r
5169 \r
5170                 break;\r
5171 \r
5172 \r
5173         case 25:\r
5174                 if (name) return _("停滞の歌", "Stationary Shriek");\r
5175                 if (desc) return _("視界内の全てのモンスターを麻痺させようとする。抵抗されると無効。", "Attempts to freeze all monsters in sight.");\r
5176     \r
5177                 /* Stop singing before start another */\r
5178                 if (cast || fail) stop_singing();\r
5179 \r
5180                 if (cast)\r
5181                 {\r
5182                         msg_print(_("ゆっくりとしたメロディを奏で始めた...", "You weave a very slow pattern which is almost likely to stop..."));\r
5183                         start_singing(spell, MUSIC_STASIS);\r
5184                 }\r
5185 \r
5186                 {\r
5187                         int power = plev * 4;\r
5188 \r
5189                         if (info) return info_power(power);\r
5190 \r
5191                         if (cont)\r
5192                         {\r
5193                                 stasis_monsters(power);\r
5194                         }\r
5195                 }\r
5196 \r
5197                 break;\r
5198 \r
5199         case 26:\r
5200                 if (name) return _("守りの歌", "Endurance");\r
5201                 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。", \r
5202                         "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
5203     \r
5204                 {\r
5205                         /* Stop singing before start another */\r
5206                         if (cast || fail) stop_singing();\r
5207 \r
5208                         if (cast)\r
5209                         {\r
5210                                 msg_print(_("歌が神聖な場を作り出した...", "The holy power of the Music is creating sacred field..."));\r
5211                                 warding_glyph();\r
5212                         }\r
5213                 }\r
5214                 break;\r
5215 \r
5216         case 27:\r
5217                 if (name) return _("英雄の詩", "The Hero's Poem");\r
5218                 if (desc) return _("加速し、ヒーロー気分になり、視界内の全てのモンスターにダメージを与える。", \r
5219                         "Hastes you. Gives heroism. Damages all monsters in sight.");\r
5220     \r
5221                 /* Stop singing before start another */\r
5222                 if (cast || fail) stop_singing();\r
5223 \r
5224                 if (cast)\r
5225                 {\r
5226                         msg_print(_("英雄の歌を口ずさんだ...", "You chant a powerful, heroic call to arms..."));\r
5227                         (void)hp_player(10);\r
5228                         (void)set_afraid(0);\r
5229 \r
5230                         /* Recalculate hitpoints */\r
5231                         p_ptr->update |= (PU_HP);\r
5232 \r
5233                         start_singing(spell, MUSIC_SHERO);\r
5234                 }\r
5235 \r
5236                 if (stop)\r
5237                 {\r
5238                         if (!p_ptr->hero)\r
5239                         {\r
5240                                 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));\r
5241                                 /* Recalculate hitpoints */\r
5242                                 p_ptr->update |= (PU_HP);\r
5243                         }\r
5244 \r
5245                         if (!p_ptr->fast)\r
5246                         {\r
5247                                 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));\r
5248                         }\r
5249                 }\r
5250 \r
5251                 {\r
5252                         int dice = 1;\r
5253                         int sides = plev * 3;\r
5254 \r
5255                         if (info) return info_damage(dice, sides, 0);\r
5256 \r
5257                         if (cont)\r
5258                         {\r
5259                                 dispel_monsters(damroll(dice, sides));\r
5260                         }\r
5261                 }\r
5262                 break;\r
5263 \r
5264         case 28:\r
5265                 if (name) return _("ヤヴァンナの助け", "Relief of Yavanna");\r
5266                 if (desc) return _("強力な回復の歌で、負傷と朦朧状態も全快する。", "Powerful healing song. Also heals cut and stun completely.");\r
5267     \r
5268                 /* Stop singing before start another */\r
5269                 if (cast || fail) stop_singing();\r
5270 \r
5271                 if (cast)\r
5272                 {\r
5273                         msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing the song..."));\r
5274                         start_singing(spell, MUSIC_H_LIFE);\r
5275                 }\r
5276 \r
5277                 {\r
5278                         int dice = 15;\r
5279                         int sides = 10;\r
5280 \r
5281                         if (info) return info_heal(dice, sides, 0);\r
5282 \r
5283                         if (cont)\r
5284                         {\r
5285                                 hp_player(damroll(dice, sides));\r
5286                                 set_stun(0);\r
5287                                 set_cut(0);\r
5288                         }\r
5289                 }\r
5290 \r
5291                 break;\r
5292 \r
5293         case 29:\r
5294                 if (name) return _("再生の歌", "Goddess' rebirth");\r
5295                 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");\r
5296     \r
5297                 {\r
5298                         /* Stop singing before start another */\r
5299                         if (cast || fail) stop_singing();\r
5300 \r
5301                         if (cast)\r
5302                         {\r
5303                                 msg_print(_("暗黒の中に光と美をふりまいた。体が元の活力を取り戻した。",\r
5304                                                         "You strewed light and beauty in the dark as you sing. You feel refreshed."));\r
5305                                 (void)do_res_stat(A_STR);\r
5306                                 (void)do_res_stat(A_INT);\r
5307                                 (void)do_res_stat(A_WIS);\r
5308                                 (void)do_res_stat(A_DEX);\r
5309                                 (void)do_res_stat(A_CON);\r
5310                                 (void)do_res_stat(A_CHR);\r
5311                                 (void)restore_level();\r
5312                         }\r
5313                 }\r
5314                 break;\r
5315 \r
5316         case 30:\r
5317                 if (name) return _("サウロンの魔術", "Wizardry of Sauron");\r
5318                 if (desc) return _("非常に強力でごく小さい轟音の球を放つ。", "Fires an extremely powerful tiny ball of sound.");\r
5319     \r
5320                 {\r
5321                         int dice = 50 + plev;\r
5322                         int sides = 10;\r
5323                         int rad = 0;\r
5324 \r
5325                         if (info) return info_damage(dice, sides, 0);\r
5326 \r
5327                         /* Stop singing before start another */\r
5328                         if (cast || fail) stop_singing();\r
5329 \r
5330                         if (cast)\r
5331                         {\r
5332                                 if (!get_aim_dir(&dir)) return NULL;\r
5333 \r
5334                                 fire_ball(GF_SOUND, dir, damroll(dice, sides), rad);\r
5335                         }\r
5336                 }\r
5337                 break;\r
5338 \r
5339         case 31:\r
5340                 if (name) return _("フィンゴルフィンの挑戦", "Fingolfin's Challenge");\r
5341                 if (desc) return _("ダメージを受けなくなるバリアを張る。", \r
5342                         "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks.");\r
5343     \r
5344                 /* Stop singing before start another */\r
5345                 if (cast || fail) stop_singing();\r
5346 \r
5347                 if (cast)\r
5348                 {\r
5349                         msg_print(_("フィンゴルフィンの冥王への挑戦を歌った...",\r
5350                                                 "You recall the valor of Fingolfin's challenge to the Dark Lord..."));\r
5351 \r
5352                         /* Redraw map */\r
5353                         p_ptr->redraw |= (PR_MAP);\r
5354                 \r
5355                         /* Update monsters */\r
5356                         p_ptr->update |= (PU_MONSTERS);\r
5357                 \r
5358                         /* Window stuff */\r
5359                         p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);\r
5360 \r
5361                         start_singing(spell, MUSIC_INVULN);\r
5362                 }\r
5363 \r
5364                 if (stop)\r
5365                 {\r
5366                         if (!p_ptr->invuln)\r
5367                         {\r
5368                                 msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));\r
5369                                 /* Redraw map */\r
5370                                 p_ptr->redraw |= (PR_MAP);\r
5371 \r
5372                                 /* Update monsters */\r
5373                                 p_ptr->update |= (PU_MONSTERS);\r
5374 \r
5375                                 /* Window stuff */\r
5376                                 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);\r
5377                         }\r
5378                 }\r
5379 \r
5380                 break;\r
5381         }\r
5382 \r
5383         return "";\r
5384 }\r
5385 \r
5386 /*!\r
5387  * @brief 剣術の各処理を行う\r
5388  * @param spell 剣術ID\r
5389  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_CAST)\r
5390  * @return SPELL_NAME / SPELL_DESC 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。\r
5391  */\r
5392 static cptr do_hissatsu_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
5393 {\r
5394         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
5395         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
5396         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
5397 \r
5398         int dir;\r
5399         int plev = p_ptr->lev;\r
5400 \r
5401         switch (spell)\r
5402         {\r
5403         case 0:\r
5404                 if (name) return _("飛飯綱", "Tobi-Izuna");\r
5405                 if (desc) return _("2マス離れたところにいるモンスターを攻撃する。", "Attacks a two squares distant monster.");\r
5406     \r
5407                 if (cast)\r
5408                 {\r
5409                         project_length = 2;\r
5410                         if (!get_aim_dir(&dir)) return NULL;\r
5411 \r
5412                         project_hook(GF_ATTACK, dir, HISSATSU_2, PROJECT_STOP | PROJECT_KILL);\r
5413                 }\r
5414                 break;\r
5415 \r
5416         case 1:\r
5417                 if (name) return _("五月雨斬り", "3-Way Attack");\r
5418                 if (desc) return _("3方向に対して攻撃する。", "Attacks in 3 directions in one time.");\r
5419     \r
5420                 if (cast)\r
5421                 {\r
5422                         int cdir;\r
5423                         int y, x;\r
5424 \r
5425                         if (!get_rep_dir2(&dir)) return NULL;\r
5426                         if (dir == 5) return NULL;\r
5427 \r
5428                         for (cdir = 0;cdir < 8; cdir++)\r
5429                         {\r
5430                                 if (cdd[cdir] == dir) break;\r
5431                         }\r
5432 \r
5433                         if (cdir == 8) return NULL;\r
5434 \r
5435                         y = p_ptr->y + ddy_cdd[cdir];\r
5436                         x = p_ptr->x + ddx_cdd[cdir];\r
5437                         if (cave[y][x].m_idx)\r
5438                                 py_attack(y, x, 0);\r
5439                         else\r
5440                                 msg_print(_("攻撃は空を切った。", "You attack the empty air."));\r
5441                         \r
5442                         y = p_ptr->y + ddy_cdd[(cdir + 7) % 8];\r
5443                         x = p_ptr->x + ddx_cdd[(cdir + 7) % 8];\r
5444                         if (cave[y][x].m_idx)\r
5445                                 py_attack(y, x, 0);\r
5446                         else\r
5447                                 msg_print(_("攻撃は空を切った。", "You attack the empty air."));\r
5448                         \r
5449                         y = p_ptr->y + ddy_cdd[(cdir + 1) % 8];\r
5450                         x = p_ptr->x + ddx_cdd[(cdir + 1) % 8];\r
5451                         if (cave[y][x].m_idx)\r
5452                                 py_attack(y, x, 0);\r
5453                         else\r
5454                                 msg_print(_("攻撃は空を切った。", "You attack the empty air."));\r
5455                 }\r
5456                 break;\r
5457 \r
5458         case 2:\r
5459                 if (name) return _("ブーメラン", "Boomerang");\r
5460                 if (desc) return _("武器を手元に戻ってくるように投げる。戻ってこないこともある。", \r
5461                         "Throws current weapon. And it'll return to your hand unless failed.");\r
5462     \r
5463                 if (cast)\r
5464                 {\r
5465                         if (!do_cmd_throw(1, TRUE, -1)) return NULL;\r
5466                 }\r
5467                 break;\r
5468 \r
5469         case 3:\r
5470                 if (name) return _("焔霊", "Burning Strike");\r
5471                 if (desc) return _("火炎耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to fire.");\r
5472     \r
5473                 if (cast)\r
5474                 {\r
5475                         int y, x;\r
5476 \r
5477                         if (!get_rep_dir2(&dir)) return NULL;\r
5478                         if (dir == 5) return NULL;\r
5479 \r
5480                         y = p_ptr->y + ddy[dir];\r
5481                         x = p_ptr->x + ddx[dir];\r
5482 \r
5483                         if (cave[y][x].m_idx)\r
5484                                 py_attack(y, x, HISSATSU_FIRE);\r
5485                         else\r
5486                         {\r
5487                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
5488                                 return NULL;\r
5489                         }\r
5490                 }\r
5491                 break;\r
5492 \r
5493         case 4:\r
5494                 if (name) return _("殺気感知", "Detect Ferocity");\r
5495                 if (desc) return _("近くの思考することができるモンスターを感知する。", "Detects all monsters except mindless in your vicinity.");\r
5496     \r
5497                 if (cast)\r
5498                 {\r
5499                         detect_monsters_mind(DETECT_RAD_DEFAULT);\r
5500                 }\r
5501                 break;\r
5502 \r
5503         case 5:\r
5504                 if (name) return _("みね打ち", "Strike to Stun");\r
5505                 if (desc) return _("相手にダメージを与えないが、朦朧とさせる。", "Attempts to stun a monster in the adjacent.");\r
5506     \r
5507                 if (cast)\r
5508                 {\r
5509                         int y, x;\r
5510 \r
5511                         if (!get_rep_dir2(&dir)) return NULL;\r
5512                         if (dir == 5) return NULL;\r
5513 \r
5514                         y = p_ptr->y + ddy[dir];\r
5515                         x = p_ptr->x + ddx[dir];\r
5516 \r
5517                         if (cave[y][x].m_idx)\r
5518                                 py_attack(y, x, HISSATSU_MINEUCHI);\r
5519                         else\r
5520                         {\r
5521                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
5522                                 return NULL;\r
5523                         }\r
5524                 }\r
5525                 break;\r
5526 \r
5527         case 6:\r
5528                 if (name) return _("カウンター", "Counter");\r
5529                 if (desc) return _("相手に攻撃されたときに反撃する。反撃するたびにMPを消費。", \r
5530                         "Prepares to counterattack. When attack by a monster, strikes back using SP each time.");\r
5531     \r
5532                 if (cast)\r
5533                 {\r
5534                         if (p_ptr->riding)\r
5535                         {\r
5536                                 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));\r
5537                                 return NULL;\r
5538                         }\r
5539                         msg_print(_("相手の攻撃に対して身構えた。", "You prepare to counter blow."));\r
5540                         p_ptr->counter = TRUE;\r
5541                 }\r
5542                 break;\r
5543 \r
5544         case 7:\r
5545                 if (name) return _("払い抜け", "Harainuke");\r
5546                 if (desc) return _("攻撃した後、反対側に抜ける。", \r
5547                         "Attacks monster with your weapons normally, then move through counter side of the monster.");\r
5548     \r
5549                 if (cast)\r
5550                 {\r
5551                         POSITION y, x;\r
5552 \r
5553                         if (p_ptr->riding)\r
5554                         {\r
5555                                 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));\r
5556                                 return NULL;\r
5557                         }\r
5558         \r
5559                         if (!get_rep_dir2(&dir)) return NULL;\r
5560         \r
5561                         if (dir == 5) return NULL;\r
5562                         y = p_ptr->y + ddy[dir];\r
5563                         x = p_ptr->x + ddx[dir];\r
5564         \r
5565                         if (!cave[y][x].m_idx)\r
5566                         {\r
5567                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
5568                                 return NULL;\r
5569                         }\r
5570         \r
5571                         py_attack(y, x, 0);\r
5572         \r
5573                         if (!player_can_enter(cave[y][x].feat, 0) || is_trap(cave[y][x].feat))\r
5574                                 break;\r
5575         \r
5576                         y += ddy[dir];\r
5577                         x += ddx[dir];\r
5578         \r
5579                         if (player_can_enter(cave[y][x].feat, 0) && !is_trap(cave[y][x].feat) && !cave[y][x].m_idx)\r
5580                         {\r
5581                                 msg_print(NULL);\r
5582         \r
5583                                 /* Move the player */\r
5584                                 (void)move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);\r
5585                         }\r
5586                 }\r
5587                 break;\r
5588 \r
5589         case 8:\r
5590                 if (name) return _("サーペンツタン", "Serpent's Tongue");\r
5591                 if (desc) return _("毒耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to poison.");\r
5592     \r
5593                 if (cast)\r
5594                 {\r
5595                         int y, x;\r
5596 \r
5597                         if (!get_rep_dir2(&dir)) return NULL;\r
5598                         if (dir == 5) return NULL;\r
5599 \r
5600                         y = p_ptr->y + ddy[dir];\r
5601                         x = p_ptr->x + ddx[dir];\r
5602 \r
5603                         if (cave[y][x].m_idx)\r
5604                                 py_attack(y, x, HISSATSU_POISON);\r
5605                         else\r
5606                         {\r
5607                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
5608                                 return NULL;\r
5609                         }\r
5610                 }\r
5611                 break;\r
5612 \r
5613         case 9:\r
5614                 if (name) return _("斬魔剣弐の太刀", "Zammaken");\r
5615                 if (desc) return _("生命のない邪悪なモンスターに大ダメージを与えるが、他のモンスターには全く効果がない。", \r
5616                         "Attacks an evil unliving monster with great damage. No effect to other  monsters.");\r
5617     \r
5618                 if (cast)\r
5619                 {\r
5620                         int y, x;\r
5621 \r
5622                         if (!get_rep_dir2(&dir)) return NULL;\r
5623                         if (dir == 5) return NULL;\r
5624 \r
5625                         y = p_ptr->y + ddy[dir];\r
5626                         x = p_ptr->x + ddx[dir];\r
5627 \r
5628                         if (cave[y][x].m_idx)\r
5629                                 py_attack(y, x, HISSATSU_ZANMA);\r
5630                         else\r
5631                         {\r
5632                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
5633                                 return NULL;\r
5634                         }\r
5635                 }\r
5636                 break;\r
5637 \r
5638         case 10:\r
5639                 if (name) return _("裂風剣", "Wind Blast");\r
5640                 if (desc) return _("攻撃した相手を後方へ吹き飛ばす。", "Attacks an adjacent monster, and blow it away.");\r
5641     \r
5642                 if (cast)\r
5643                 {\r
5644                         int y, x;\r
5645 \r
5646                         if (!get_rep_dir2(&dir)) return NULL;\r
5647                         if (dir == 5) return NULL;\r
5648 \r
5649                         y = p_ptr->y + ddy[dir];\r
5650                         x = p_ptr->x + ddx[dir];\r
5651 \r
5652                         if (cave[y][x].m_idx)\r
5653                                 py_attack(y, x, 0);\r
5654                         else\r
5655                         {\r
5656                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
5657                                 return NULL;\r
5658                         }\r
5659                         if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)\r
5660                         {\r
5661                                 return "";\r
5662                         }\r
5663                         if (cave[y][x].m_idx)\r
5664                         {\r
5665                                 int i;\r
5666                                 POSITION ty = y, tx = x;\r
5667                                 POSITION oy = y, ox = x;\r
5668                                 MONSTER_IDX m_idx = cave[y][x].m_idx;\r
5669                                 monster_type *m_ptr = &m_list[m_idx];\r
5670                                 char m_name[80];\r
5671         \r
5672                                 monster_desc(m_name, m_ptr, 0);\r
5673         \r
5674                                 for (i = 0; i < 5; i++)\r
5675                                 {\r
5676                                         y += ddy[dir];\r
5677                                         x += ddx[dir];\r
5678                                         if (cave_empty_bold(y, x))\r
5679                                         {\r
5680                                                 ty = y;\r
5681                                                 tx = x;\r
5682                                         }\r
5683                                         else break;\r
5684                                 }\r
5685                                 if ((ty != oy) || (tx != ox))\r
5686                                 {\r
5687                                         msg_format(_("%sを吹き飛ばした!", "You blow %s away!"), m_name);\r
5688                                         cave[oy][ox].m_idx = 0;\r
5689                                         cave[ty][tx].m_idx = m_idx;\r
5690                                         m_ptr->fy = ty;\r
5691                                         m_ptr->fx = tx;\r
5692         \r
5693                                         update_mon(m_idx, TRUE);\r
5694                                         lite_spot(oy, ox);\r
5695                                         lite_spot(ty, tx);\r
5696         \r
5697                                         if (r_info[m_ptr->r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))\r
5698                                                 p_ptr->update |= (PU_MON_LITE);\r
5699                                 }\r
5700                         }\r
5701                 }\r
5702                 break;\r
5703 \r
5704         case 11:\r
5705                 if (name) return _("刀匠の目利き", "Judge");\r
5706                 if (desc) return _("武器・防具を1つ識別する。レベル45以上で武器・防具の能力を完全に知ることができる。", \r
5707                         "Identifies a weapon or armor. Or *identifies* these at level 45.");\r
5708     \r
5709                 if (cast)\r
5710                 {\r
5711                         if (plev > 44)\r
5712                         {\r
5713                                 if (!identify_fully(TRUE)) return NULL;\r
5714                         }\r
5715                         else\r
5716                         {\r
5717                                 if (!ident_spell(TRUE)) return NULL;\r
5718                         }\r
5719                 }\r
5720                 break;\r
5721 \r
5722         case 12:\r
5723                 if (name) return _("破岩斬", "Rock Smash");\r
5724                 if (desc) return _("岩を壊し、岩石系のモンスターに大ダメージを与える。", "Breaks rock. Or greatly damage a monster made by rocks.");\r
5725     \r
5726                 if (cast)\r
5727                 {\r
5728                         int y, x;\r
5729 \r
5730                         if (!get_rep_dir2(&dir)) return NULL;\r
5731                         if (dir == 5) return NULL;\r
5732 \r
5733                         y = p_ptr->y + ddy[dir];\r
5734                         x = p_ptr->x + ddx[dir];\r
5735 \r
5736                         if (cave[y][x].m_idx)\r
5737                                 py_attack(y, x, HISSATSU_HAGAN);\r
5738         \r
5739                         if (!cave_have_flag_bold(y, x, FF_HURT_ROCK)) break;\r
5740         \r
5741                         /* Destroy the feature */\r
5742                         cave_alter_feat(y, x, FF_HURT_ROCK);\r
5743         \r
5744                         /* Update some things */\r
5745                         p_ptr->update |= (PU_FLOW);\r
5746                 }\r
5747                 break;\r
5748 \r
5749         case 13:\r
5750                 if (name) return _("乱れ雪月花", "Midare-Setsugekka");\r
5751                 if (desc) return _("攻撃回数が増え、冷気耐性のないモンスターに大ダメージを与える。", \r
5752                         "Attacks a monster with increased number of attacks and more damage unless it has resistance to cold.");\r
5753     \r
5754                 if (cast)\r
5755                 {\r
5756                         int y, x;\r
5757 \r
5758                         if (!get_rep_dir2(&dir)) return NULL;\r
5759                         if (dir == 5) return NULL;\r
5760 \r
5761                         y = p_ptr->y + ddy[dir];\r
5762                         x = p_ptr->x + ddx[dir];\r
5763 \r
5764                         if (cave[y][x].m_idx)\r
5765                                 py_attack(y, x, HISSATSU_COLD);\r
5766                         else\r
5767                         {\r
5768                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
5769                                 return NULL;\r
5770                         }\r
5771                 }\r
5772                 break;\r
5773 \r
5774         case 14:\r
5775                 if (name) return _("急所突き", "Spot Aiming");\r
5776                 if (desc) return _("モンスターを一撃で倒す攻撃を繰り出す。失敗すると1点しかダメージを与えられない。", \r
5777                         "Attempts to kill a monster instantly. If failed cause only 1HP of damage.");\r
5778     \r
5779                 if (cast)\r
5780                 {\r
5781                         int y, x;\r
5782 \r
5783                         if (!get_rep_dir2(&dir)) return NULL;\r
5784                         if (dir == 5) return NULL;\r
5785 \r
5786                         y = p_ptr->y + ddy[dir];\r
5787                         x = p_ptr->x + ddx[dir];\r
5788 \r
5789                         if (cave[y][x].m_idx)\r
5790                                 py_attack(y, x, HISSATSU_KYUSHO);\r
5791                         else\r
5792                         {\r
5793                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
5794                                 return NULL;\r
5795                         }\r
5796                 }\r
5797                 break;\r
5798 \r
5799         case 15:\r
5800                 if (name) return _("魔神斬り", "Majingiri");\r
5801                 if (desc) return _("会心の一撃で攻撃する。攻撃がかわされやすい。", \r
5802                         "Attempts to attack with critical hit. But this attack is easy to evade for a monster.");\r
5803     \r
5804                 if (cast)\r
5805                 {\r
5806                         int y, x;\r
5807 \r
5808                         if (!get_rep_dir2(&dir)) return NULL;\r
5809                         if (dir == 5) return NULL;\r
5810 \r
5811                         y = p_ptr->y + ddy[dir];\r
5812                         x = p_ptr->x + ddx[dir];\r
5813 \r
5814                         if (cave[y][x].m_idx)\r
5815                                 py_attack(y, x, HISSATSU_MAJIN);\r
5816                         else\r
5817                         {\r
5818                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
5819                                 return NULL;\r
5820                         }\r
5821                 }\r
5822                 break;\r
5823 \r
5824         case 16:\r
5825                 if (name) return _("捨て身", "Desperate Attack");\r
5826                 if (desc) return _("強力な攻撃を繰り出す。次のターンまでの間、食らうダメージが増える。", \r
5827                         "Attacks with all of your power. But all damages you take will be doubled for one turn.");\r
5828     \r
5829                 if (cast)\r
5830                 {\r
5831                         int y, x;\r
5832 \r
5833                         if (!get_rep_dir2(&dir)) return NULL;\r
5834                         if (dir == 5) return NULL;\r
5835 \r
5836                         y = p_ptr->y + ddy[dir];\r
5837                         x = p_ptr->x + ddx[dir];\r
5838 \r
5839                         if (cave[y][x].m_idx)\r
5840                                 py_attack(y, x, HISSATSU_SUTEMI);\r
5841                         else\r
5842                         {\r
5843                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
5844                                 return NULL;\r
5845                         }\r
5846                         p_ptr->sutemi = TRUE;\r
5847                 }\r
5848                 break;\r
5849 \r
5850         case 17:\r
5851                 if (name) return _("雷撃鷲爪斬", "Lightning Eagle");\r
5852                 if (desc) return _("電撃耐性のないモンスターに非常に大きいダメージを与える。", \r
5853                         "Attacks a monster with more damage unless it has resistance to electricity.");\r
5854     \r
5855                 if (cast)\r
5856                 {\r
5857                         int y, x;\r
5858 \r
5859                         if (!get_rep_dir2(&dir)) return NULL;\r
5860                         if (dir == 5) return NULL;\r
5861 \r
5862                         y = p_ptr->y + ddy[dir];\r
5863                         x = p_ptr->x + ddx[dir];\r
5864 \r
5865                         if (cave[y][x].m_idx)\r
5866                                 py_attack(y, x, HISSATSU_ELEC);\r
5867                         else\r
5868                         {\r
5869                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
5870                                 return NULL;\r
5871                         }\r
5872                 }\r
5873                 break;\r
5874 \r
5875         case 18:\r
5876                 if (name) return _("入身", "Rush Attack");\r
5877                 if (desc) return _("素早く相手に近寄り攻撃する。", "Steps close to a monster and attacks at a time.");\r
5878     \r
5879                 if (cast)\r
5880                 {\r
5881                         if (!rush_attack(NULL)) return NULL;\r
5882                 }\r
5883                 break;\r
5884 \r
5885         case 19:\r
5886                 if (name) return _("赤流渦", "Bloody Maelstrom");\r
5887                 if (desc) return _("自分自身も傷を作りつつ、その傷が深いほど大きい威力で全方向の敵を攻撃できる。生きていないモンスターには効果がない。", \r
5888                         "Attacks all adjacent monsters with power corresponding to your cut status. Then increases your cut status. No effect to unliving monsters.");\r
5889     \r
5890                 if (cast)\r
5891                 {\r
5892                         int y = 0, x = 0;\r
5893 \r
5894                         cave_type       *c_ptr;\r
5895                         monster_type    *m_ptr;\r
5896         \r
5897                         if (p_ptr->cut < 300)\r
5898                                 set_cut(p_ptr->cut + 300);\r
5899                         else\r
5900                                 set_cut(p_ptr->cut * 2);\r
5901         \r
5902                         for (dir = 0; dir < 8; dir++)\r
5903                         {\r
5904                                 y = p_ptr->y + ddy_ddd[dir];\r
5905                                 x = p_ptr->x + ddx_ddd[dir];\r
5906                                 c_ptr = &cave[y][x];\r
5907         \r
5908                                 /* Get the monster */\r
5909                                 m_ptr = &m_list[c_ptr->m_idx];\r
5910         \r
5911                                 /* Hack -- attack monsters */\r
5912                                 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))\r
5913                                 {\r
5914                                         if (!monster_living(&r_info[m_ptr->r_idx]))\r
5915                                         {\r
5916                                                 char m_name[80];\r
5917         \r
5918                                                 monster_desc(m_name, m_ptr, 0);\r
5919                                                 msg_format(_("%sには効果がない!", "%s is unharmed!"), m_name);\r
5920                                         }\r
5921                                         else py_attack(y, x, HISSATSU_SEKIRYUKA);\r
5922                                 }\r
5923                         }\r
5924                 }\r
5925                 break;\r
5926 \r
5927         case 20:\r
5928                 if (name) return _("激震撃", "Earthquake Blow");\r
5929                 if (desc) return _("地震を起こす。", "Shakes dungeon structure, and results in random swapping of floors and walls.");\r
5930     \r
5931                 if (cast)\r
5932                 {\r
5933                         int y,x;\r
5934 \r
5935                         if (!get_rep_dir2(&dir)) return NULL;\r
5936                         if (dir == 5) return NULL;\r
5937 \r
5938                         y = p_ptr->y + ddy[dir];\r
5939                         x = p_ptr->x + ddx[dir];\r
5940 \r
5941                         if (cave[y][x].m_idx)\r
5942                                 py_attack(y, x, HISSATSU_QUAKE);\r
5943                         else\r
5944                                 earthquake(p_ptr->y, p_ptr->x, 10);\r
5945                 }\r
5946                 break;\r
5947 \r
5948         case 21:\r
5949                 if (name) return _("地走り", "Crack");\r
5950                 if (desc) return _("衝撃波のビームを放つ。", "Fires a beam of shock wave.");\r
5951     \r
5952                 if (cast)\r
5953                 {\r
5954                         int total_damage = 0, basedam, i;\r
5955                         u32b flgs[TR_FLAG_SIZE];\r
5956                         object_type *o_ptr;\r
5957                         if (!get_aim_dir(&dir)) return NULL;\r
5958                         msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));\r
5959                         for (i = 0; i < 2; i++)\r
5960                         {\r
5961                                 int damage;\r
5962         \r
5963                                 if (!buki_motteruka(INVEN_RARM+i)) break;\r
5964                                 o_ptr = &inventory[INVEN_RARM+i];\r
5965                                 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;\r
5966                                 damage = o_ptr->to_d * 100;\r
5967                                 object_flags(o_ptr, flgs);\r
5968                                 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))\r
5969                                 {\r
5970                                         /* vorpal blade */\r
5971                                         basedam *= 5;\r
5972                                         basedam /= 3;\r
5973                                 }\r
5974                                 else if (have_flag(flgs, TR_VORPAL))\r
5975                                 {\r
5976                                         /* vorpal flag only */\r
5977                                         basedam *= 11;\r
5978                                         basedam /= 9;\r
5979                                 }\r
5980                                 damage += basedam;\r
5981                                 damage *= p_ptr->num_blow[i];\r
5982                                 total_damage += damage / 200;\r
5983                                 if (i) total_damage = total_damage*7/10;\r
5984                         }\r
5985                         fire_beam(GF_FORCE, dir, total_damage);\r
5986                 }\r
5987                 break;\r
5988 \r
5989         case 22:\r
5990                 if (name) return _("気迫の雄叫び", "War Cry");\r
5991                 if (desc) return _("視界内の全モンスターに対して轟音の攻撃を行う。さらに、近くにいるモンスターを怒らせる。", \r
5992                         "Damages all monsters in sight with sound. Aggravate nearby monsters.");\r
5993     \r
5994                 if (cast)\r
5995                 {\r
5996                         msg_print(_("雄叫びをあげた!", "You roar out!"));\r
5997                         project_hack(GF_SOUND, randint1(plev * 3));\r
5998                         aggravate_monsters(0);\r
5999                 }\r
6000                 break;\r
6001 \r
6002         case 23:\r
6003                 if (name) return _("無双三段", "Musou-Sandan");\r
6004                 if (desc) return _("強力な3段攻撃を繰り出す。", "Attacks with powerful 3 strikes.");\r
6005     \r
6006                 if (cast)\r
6007                 {\r
6008                         int i;\r
6009 \r
6010                         if (!get_rep_dir2(&dir)) return NULL;\r
6011                         if (dir == 5) return NULL;\r
6012 \r
6013                         for (i = 0; i < 3; i++)\r
6014                         {\r
6015                                 POSITION y, x;\r
6016                                 POSITION ny, nx;\r
6017                                 MONSTER_IDX m_idx;\r
6018                                 cave_type *c_ptr;\r
6019                                 monster_type *m_ptr;\r
6020         \r
6021                                 y = p_ptr->y + ddy[dir];\r
6022                                 x = p_ptr->x + ddx[dir];\r
6023                                 c_ptr = &cave[y][x];\r
6024         \r
6025                                 if (c_ptr->m_idx)\r
6026                                         py_attack(y, x, HISSATSU_3DAN);\r
6027                                 else\r
6028                                 {\r
6029                                         msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
6030                                         return NULL;\r
6031                                 }\r
6032         \r
6033                                 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)\r
6034                                 {\r
6035                                         return "";\r
6036                                 }\r
6037         \r
6038                                 /* Monster is dead? */\r
6039                                 if (!c_ptr->m_idx) break;\r
6040         \r
6041                                 ny = y + ddy[dir];\r
6042                                 nx = x + ddx[dir];\r
6043                                 m_idx = c_ptr->m_idx;\r
6044                                 m_ptr = &m_list[m_idx];\r
6045         \r
6046                                 /* Monster cannot move back? */\r
6047                                 if (!monster_can_enter(ny, nx, &r_info[m_ptr->r_idx], 0))\r
6048                                 {\r
6049                                         /* -more- */\r
6050                                         if (i < 2) msg_print(NULL);\r
6051                                         continue;\r
6052                                 }\r
6053         \r
6054                                 c_ptr->m_idx = 0;\r
6055                                 cave[ny][nx].m_idx = m_idx;\r
6056                                 m_ptr->fy = ny;\r
6057                                 m_ptr->fx = nx;\r
6058         \r
6059                                 update_mon(m_idx, TRUE);\r
6060         \r
6061                                 /* Redraw the old spot */\r
6062                                 lite_spot(y, x);\r
6063         \r
6064                                 /* Redraw the new spot */\r
6065                                 lite_spot(ny, nx);\r
6066         \r
6067                                 /* Player can move forward? */\r
6068                                 if (player_can_enter(c_ptr->feat, 0))\r
6069                                 {\r
6070                                         /* Move the player */\r
6071                                         if (!move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP)) break;\r
6072                                 }\r
6073                                 else\r
6074                                 {\r
6075                                         break;\r
6076                                 }\r
6077 \r
6078                                 /* -more- */\r
6079                                 if (i < 2) msg_print(NULL);\r
6080                         }\r
6081                 }\r
6082                 break;\r
6083 \r
6084         case 24:\r
6085                 if (name) return _("吸血鬼の牙", "Vampire's Fang");\r
6086                 if (desc) return _("攻撃した相手の体力を吸いとり、自分の体力を回復させる。生命を持たないモンスターには通じない。", \r
6087                         "Attacks with vampiric strikes which absorbs HP from a monster and gives them to you. No effect to unliving monsters.");\r
6088     \r
6089                 if (cast)\r
6090                 {\r
6091                         int y, x;\r
6092 \r
6093                         if (!get_rep_dir2(&dir)) return NULL;\r
6094                         if (dir == 5) return NULL;\r
6095 \r
6096                         y = p_ptr->y + ddy[dir];\r
6097                         x = p_ptr->x + ddx[dir];\r
6098 \r
6099                         if (cave[y][x].m_idx)\r
6100                                 py_attack(y, x, HISSATSU_DRAIN);\r
6101                         else\r
6102                         {\r
6103                                         msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
6104                                 return NULL;\r
6105                         }\r
6106                 }\r
6107                 break;\r
6108 \r
6109         case 25:\r
6110                 if (name) return _("幻惑", "Moon Dazzling");\r
6111                 if (desc) return _("視界内の起きている全モンスターに朦朧、混乱、眠りを与えようとする。", "Attempts to stun, confuse and sleep all waking monsters.");\r
6112     \r
6113                 if (cast)\r
6114                 {\r
6115                         msg_print(_("武器を不規則に揺らした...", "You irregularly wave your weapon..."));\r
6116                         project_hack(GF_ENGETSU, plev * 4);\r
6117                         project_hack(GF_ENGETSU, plev * 4);\r
6118                         project_hack(GF_ENGETSU, plev * 4);\r
6119                 }\r
6120                 break;\r
6121 \r
6122         case 26:\r
6123                 if (name) return _("百人斬り", "Hundred Slaughter");\r
6124                 if (desc) return _("連続して入身でモンスターを攻撃する。攻撃するたびにMPを消費。MPがなくなるか、モンスターを倒せなかったら百人斬りは終了する。", \r
6125                         "Performs a series of rush attacks. The series continues while killing each monster in a time and SP remains.");\r
6126     \r
6127                 if (cast)\r
6128                 {\r
6129                         const int mana_cost_per_monster = 8;\r
6130                         bool is_new = TRUE;\r
6131                         bool mdeath;\r
6132 \r
6133                         do\r
6134                         {\r
6135                                 if (!rush_attack(&mdeath)) break;\r
6136                                 if (is_new)\r
6137                                 {\r
6138                                         /* Reserve needed mana point */\r
6139                                         p_ptr->csp -= technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;\r
6140                                         is_new = FALSE;\r
6141                                 }\r
6142                                 else\r
6143                                         p_ptr->csp -= mana_cost_per_monster;\r
6144 \r
6145                                 if (!mdeath) break;\r
6146                                 command_dir = 0;\r
6147 \r
6148                                 p_ptr->redraw |= PR_MANA;\r
6149                                 handle_stuff();\r
6150                         }\r
6151                         while (p_ptr->csp > mana_cost_per_monster);\r
6152 \r
6153                         if (is_new) return NULL;\r
6154         \r
6155                         /* Restore reserved mana */\r
6156                         p_ptr->csp += technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;\r
6157                 }\r
6158                 break;\r
6159 \r
6160         case 27:\r
6161                 if (name) return _("天翔龍閃", "Dragonic Flash");\r
6162                 if (desc) return _("視界内の場所を指定して、その場所と自分の間にいる全モンスターを攻撃し、その場所に移動する。", \r
6163                         "Runs toward given location while attacking all monsters on the path.");\r
6164     \r
6165                 if (cast)\r
6166                 {\r
6167                         POSITION y, x;\r
6168 \r
6169                         if (!tgt_pt(&x, &y)) return NULL;\r
6170 \r
6171                         if (!cave_player_teleportable_bold(y, x, 0L) ||\r
6172                             (distance(y, x, p_ptr->y, p_ptr->x) > MAX_SIGHT / 2) ||\r
6173                             !projectable(p_ptr->y, p_ptr->x, y, x))\r
6174                         {\r
6175                                 msg_print(_("失敗!", "You cannot move to that place!"));\r
6176                                 break;\r
6177                         }\r
6178                         if (p_ptr->anti_tele)\r
6179                         {\r
6180                                 msg_print(_("不思議な力がテレポートを防いだ!", "A mysterious force prevents you from teleporting!"));\r
6181                                 break;\r
6182                         }\r
6183                         project(0, 0, y, x, HISSATSU_ISSEN, GF_ATTACK, PROJECT_BEAM | PROJECT_KILL, -1);\r
6184                         teleport_player_to(y, x, 0L);\r
6185                 }\r
6186                 break;\r
6187 \r
6188         case 28:\r
6189                 if (name) return _("二重の剣撃", "Twin Slash");\r
6190                 if (desc) return _("1ターンで2度攻撃を行う。", "double attacks at a time.");\r
6191     \r
6192                 if (cast)\r
6193                 {\r
6194                         int x, y;\r
6195         \r
6196                         if (!get_rep_dir(&dir, FALSE)) return NULL;\r
6197 \r
6198                         y = p_ptr->y + ddy[dir];\r
6199                         x = p_ptr->x + ddx[dir];\r
6200 \r
6201                         if (cave[y][x].m_idx)\r
6202                         {\r
6203                                 py_attack(y, x, 0);\r
6204                                 if (cave[y][x].m_idx)\r
6205                                 {\r
6206                                         handle_stuff();\r
6207                                         py_attack(y, x, 0);\r
6208                                 }\r
6209                         }\r
6210                         else\r
6211                         {\r
6212                                 msg_print(_("その方向にはモンスターはいません。", "You don't see any monster in this direction"));\r
6213                                 return NULL;\r
6214                         }\r
6215                 }\r
6216                 break;\r
6217 \r
6218         case 29:\r
6219                 if (name) return _("虎伏絶刀勢", "Kofuku-Zettousei");\r
6220                 if (desc) return _("強力な攻撃を行い、近くの場所にも効果が及ぶ。", "Performs a powerful attack which even effect nearby monsters.");\r
6221     \r
6222                 if (cast)\r
6223                 {\r
6224                         int total_damage = 0, basedam, i;\r
6225                         int y, x;\r
6226                         u32b flgs[TR_FLAG_SIZE];\r
6227                         object_type *o_ptr;\r
6228         \r
6229                         if (!get_rep_dir2(&dir)) return NULL;\r
6230                         if (dir == 5) return NULL;\r
6231 \r
6232                         y = p_ptr->y + ddy[dir];\r
6233                         x = p_ptr->x + ddx[dir];\r
6234 \r
6235                         if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)\r
6236                         {\r
6237                                 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));\r
6238                                 return "";\r
6239                         }\r
6240                         msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));\r
6241                         for (i = 0; i < 2; i++)\r
6242                         {\r
6243                                 int damage;\r
6244                                 if (!buki_motteruka(INVEN_RARM+i)) break;\r
6245                                 o_ptr = &inventory[INVEN_RARM+i];\r
6246                                 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;\r
6247                                 damage = o_ptr->to_d * 100;\r
6248                                 object_flags(o_ptr, flgs);\r
6249                                 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))\r
6250                                 {\r
6251                                         /* vorpal blade */\r
6252                                         basedam *= 5;\r
6253                                         basedam /= 3;\r
6254                                 }\r
6255                                 else if (have_flag(flgs, TR_VORPAL))\r
6256                                 {\r
6257                                         /* vorpal flag only */\r
6258                                         basedam *= 11;\r
6259                                         basedam /= 9;\r
6260                                 }\r
6261                                 damage += basedam;\r
6262                                 damage += p_ptr->to_d[i] * 100;\r
6263                                 damage *= p_ptr->num_blow[i];\r
6264                                 total_damage += (damage / 100);\r
6265                         }\r
6266                         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
6267                 }\r
6268                 break;\r
6269 \r
6270         case 30:\r
6271                 if (name) return _("慶雲鬼忍剣", "Keiun-Kininken");\r
6272                 if (desc) return _("自分もダメージをくらうが、相手に非常に大きなダメージを与える。アンデッドには特に効果がある。", \r
6273                         "Attacks a monster with extremely powerful damage. But you also takes some damages. Hurts a undead monster greatly.");\r
6274     \r
6275                 if (cast)\r
6276                 {\r
6277                         int y, x;\r
6278 \r
6279                         if (!get_rep_dir2(&dir)) return NULL;\r
6280                         if (dir == 5) return NULL;\r
6281 \r
6282                         y = p_ptr->y + ddy[dir];\r
6283                         x = p_ptr->x + ddx[dir];\r
6284 \r
6285                         if (cave[y][x].m_idx)\r
6286                                 py_attack(y, x, HISSATSU_UNDEAD);\r
6287                         else\r
6288                         {\r
6289                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
6290                                 return NULL;\r
6291                         }\r
6292                         take_hit(DAMAGE_NOESCAPE, 100 + randint1(100), _("慶雲鬼忍剣を使った衝撃", "exhaustion on using Keiun-Kininken"), -1);\r
6293                 }\r
6294                 break;\r
6295 \r
6296         case 31:\r
6297                 if (name) return _("切腹", "Harakiri");\r
6298                 if (desc) return _("「武士道とは、死ぬことと見つけたり。」", "'Busido is found in death'");\r
6299 \r
6300                 if (cast)\r
6301                 {\r
6302                         int i;\r
6303                         if (!get_check(_("本当に自殺しますか?", "Do you really want to commit suicide? "))) return NULL;\r
6304                                 /* Special Verification for suicide */\r
6305                         prt(_("確認のため '@' を押して下さい。", "Please verify SUICIDE by typing the '@' sign: "), 0, 0);\r
6306         \r
6307                         flush();\r
6308                         i = inkey();\r
6309                         prt("", 0, 0);\r
6310                         if (i != '@') return NULL;\r
6311                         if (p_ptr->total_winner)\r
6312                         {\r
6313                                 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);\r
6314                                 p_ptr->total_winner = TRUE;\r
6315                         }\r
6316                         else\r
6317                         {\r
6318                                 msg_print(_("武士道とは、死ぬことと見つけたり。", "Meaning of Bushi-do is found in the death."));\r
6319                                 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);\r
6320                         }\r
6321                 }\r
6322                 break;\r
6323         }\r
6324 \r
6325         return "";\r
6326 }\r
6327 \r
6328 /*!\r
6329  * @brief 呪術領域の武器呪縛の対象にできる武器かどうかを返す。 / An "item_tester_hook" for offer\r
6330  * @param o_ptr オブジェクト構造体の参照ポインタ\r
6331  * @return 呪縛可能な武器ならばTRUEを返す\r
6332  */\r
6333 static bool item_tester_hook_weapon_except_bow(object_type *o_ptr)\r
6334 {\r
6335         switch (o_ptr->tval)\r
6336         {\r
6337                 case TV_SWORD:\r
6338                 case TV_HAFTED:\r
6339                 case TV_POLEARM:\r
6340                 case TV_DIGGING:\r
6341                 {\r
6342                         return (TRUE);\r
6343                 }\r
6344         }\r
6345 \r
6346         return (FALSE);\r
6347 }\r
6348 \r
6349 /*!\r
6350  * @brief 呪術領域の各処理に使える呪われた装備かどうかを返す。 / An "item_tester_hook" for offer\r
6351  * @param o_ptr オブジェクト構造体の参照ポインタ\r
6352  * @return 使える装備ならばTRUEを返す\r
6353  */\r
6354 static bool item_tester_hook_cursed(object_type *o_ptr)\r
6355 {\r
6356         return (bool)(object_is_cursed(o_ptr));\r
6357 }\r
6358 \r
6359 /*!\r
6360  * @brief 呪術領域魔法の各処理を行う\r
6361  * @param spell 魔法ID\r
6362  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_CONT / SPELL_STOP)\r
6363  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。\r
6364  */\r
6365 static cptr do_hex_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
6366 {\r
6367         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
6368         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
6369         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
6370         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
6371         bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;\r
6372         bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;\r
6373 \r
6374         bool add = TRUE;\r
6375 \r
6376         PLAYER_LEVEL plev = p_ptr->lev;\r
6377         HIT_POINT power;\r
6378 \r
6379         switch (spell)\r
6380         {\r
6381         /*** 1st book (0-7) ***/\r
6382         case 0:\r
6383                 if (name) return _("邪なる祝福", "Evily blessing");\r
6384                 if (desc) return _("祝福により攻撃精度と防御力が上がる。", "Attempts to increase +to_hit of a weapon and AC");\r
6385                 if (cast)\r
6386                 {\r
6387                         if (!p_ptr->blessed)\r
6388                         {\r
6389                                 msg_print(_("高潔な気分になった!", "You feel righteous!"));\r
6390                         }\r
6391                 }\r
6392                 if (stop)\r
6393                 {\r
6394                         if (!p_ptr->blessed)\r
6395                         {\r
6396                                 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));\r
6397                         }\r
6398                 }\r
6399                 break;\r
6400 \r
6401         case 1:\r
6402                 if (name) return _("軽傷の治癒", "Cure light wounds");\r
6403                 if (desc) return _("HPや傷を少し回復させる。", "Heals cut and HP a little.");\r
6404                 if (info) return info_heal(1, 10, 0);\r
6405                 if (cast)\r
6406                 {\r
6407                         msg_print(_("気分が良くなってくる。", "You feel better and better."));\r
6408                 }\r
6409                 if (cast || cont)\r
6410                 {\r
6411                         hp_player(damroll(1, 10));\r
6412                         set_cut(p_ptr->cut - 10);\r
6413                 }\r
6414                 break;\r
6415 \r
6416         case 2:\r
6417                 if (name) return _("悪魔のオーラ", "Demonic aura");\r
6418                 if (desc) return _("炎のオーラを身にまとい、回復速度が速くなる。", "Gives fire aura and regeneration.");\r
6419                 if (cast)\r
6420                 {\r
6421                         msg_print(_("体が炎のオーラで覆われた。", "You have enveloped by fiery aura!"));\r
6422                 }\r
6423                 if (stop)\r
6424                 {\r
6425                         msg_print(_("炎のオーラが消え去った。", "Fiery aura disappeared."));\r
6426                 }\r
6427                 break;\r
6428 \r
6429         case 3:\r
6430                 if (name) return _("悪臭霧", "Stinking mist");\r
6431                 if (desc) return _("視界内のモンスターに微弱量の毒のダメージを与える。", "Deals few damages of poison to all monsters in your sight.");\r
6432                 power = plev / 2 + 5;\r
6433                 if (info) return info_damage(1, power, 0);\r
6434                 if (cast || cont)\r
6435                 {\r
6436                         project_hack(GF_POIS, randint1(power));\r
6437                 }\r
6438                 break;\r
6439 \r
6440         case 4:\r
6441                 if (name) return _("腕力強化", "Extra might");\r
6442                 if (desc) return _("術者の腕力を上昇させる。", "Attempts to increase your strength.");\r
6443                 if (cast)\r
6444                 {\r
6445                         msg_print(_("何だか力が湧いて来る。", "You feel you get stronger."));\r
6446                 }\r
6447                 break;\r
6448 \r
6449         case 5:\r
6450                 if (name) return _("武器呪縛", "Curse weapon");\r
6451                 if (desc) return _("装備している武器を呪う。", "Curses your weapon.");\r
6452                 if (cast)\r
6453                 {\r
6454                         OBJECT_IDX item;\r
6455                         cptr q, s;\r
6456                         char o_name[MAX_NLEN];\r
6457                         object_type *o_ptr;\r
6458                         u32b f[TR_FLAG_SIZE];\r
6459 \r
6460                         item_tester_hook = item_tester_hook_weapon_except_bow;\r
6461                         q = _("どれを呪いますか?", "Which weapon do you curse?");\r
6462                         s = _("武器を装備していない。", "You wield no weapons.");\r
6463 \r
6464                         if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;\r
6465 \r
6466                         o_ptr = &inventory[item];\r
6467                         object_desc(o_name, o_ptr, OD_NAME_ONLY);\r
6468                         object_flags(o_ptr, f);\r
6469 \r
6470                         if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;\r
6471 \r
6472                         if (!one_in_(3) &&\r
6473                                 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))\r
6474                         {\r
6475                                 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);\r
6476                                 if (one_in_(3))\r
6477                                 {\r
6478                                         if (o_ptr->to_d > 0)\r
6479                                         {\r
6480                                                 o_ptr->to_d -= randint1(3) % 2;\r
6481                                                 if (o_ptr->to_d < 0) o_ptr->to_d = 0;\r
6482                                         }\r
6483                                         if (o_ptr->to_h > 0)\r
6484                                         {\r
6485                                                 o_ptr->to_h -= randint1(3) % 2;\r
6486                                                 if (o_ptr->to_h < 0) o_ptr->to_h = 0;\r
6487                                         }\r
6488                                         if (o_ptr->to_a > 0)\r
6489                                         {\r
6490                                                 o_ptr->to_a -= randint1(3) % 2;\r
6491                                                 if (o_ptr->to_a < 0) o_ptr->to_a = 0;\r
6492                                         }\r
6493                                         msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);\r
6494                                 }\r
6495                         }\r
6496                         else\r
6497                         {\r
6498                                 int curse_rank = 0;\r
6499                                 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);\r
6500                                 o_ptr->curse_flags |= (TRC_CURSED);\r
6501 \r
6502                                 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))\r
6503                                 {\r
6504 \r
6505                                         if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);\r
6506                                         if (one_in_(666))\r
6507                                         {\r
6508                                                 o_ptr->curse_flags |= (TRC_TY_CURSE);\r
6509                                                 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);\r
6510 \r
6511                                                 add_flag(o_ptr->art_flags, TR_AGGRAVATE);\r
6512                                                 add_flag(o_ptr->art_flags, TR_VORPAL);\r
6513                                                 add_flag(o_ptr->art_flags, TR_VAMPIRIC);\r
6514                                                 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));\r
6515                                                 curse_rank = 2;\r
6516                                         }\r
6517                                 }\r
6518 \r
6519                                 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);\r
6520                         }\r
6521 \r
6522                         p_ptr->update |= (PU_BONUS);\r
6523                         add = FALSE;\r
6524                 }\r
6525                 break;\r
6526 \r
6527         case 6:\r
6528                 if (name) return _("邪悪感知", "Evil detection");\r
6529                 if (desc) return _("周囲の邪悪なモンスターを感知する。", "Detects evil monsters.");\r
6530                 if (info) return info_range(MAX_SIGHT);\r
6531                 if (cast)\r
6532                 {\r
6533                         msg_print(_("邪悪な生物の存在を感じ取ろうとした。", "You attend to the presence of evil creatures."));\r
6534                 }\r
6535                 break;\r
6536 \r
6537         case 7:\r
6538                 if (name) return _("我慢", "Patience");\r
6539                 if (desc) return _("数ターン攻撃を耐えた後、受けたダメージを地獄の業火として周囲に放出する。", \r
6540                         "Bursts hell fire strongly after patients any damage while few turns.");\r
6541                 power = MIN(200, (HEX_REVENGE_POWER(p_ptr) * 2));\r
6542                 if (info) return info_damage(0, 0, power);\r
6543                 if (cast)\r
6544                 {\r
6545                         int a = 3 - (p_ptr->pspeed - 100) / 10;\r
6546                         MAGIC_NUM2 r = 3 + randint1(3) + MAX(0, MIN(3, a));\r
6547 \r
6548                         if (HEX_REVENGE_TURN(p_ptr) > 0)\r
6549                         {\r
6550                                 msg_print(_("すでに我慢をしている。", "You are already patienting."));\r
6551                                 return NULL;\r
6552                         }\r
6553 \r
6554                         HEX_REVENGE_TYPE(p_ptr) = 1;\r
6555                         HEX_REVENGE_TURN(p_ptr) = r;\r
6556                         HEX_REVENGE_POWER(p_ptr) = 0;\r
6557                         msg_print(_("じっと耐えることにした。", "You decide to patient all damages."));\r
6558                         add = FALSE;\r
6559                 }\r
6560                 if (cont)\r
6561                 {\r
6562                         int rad = 2 + (power / 50);\r
6563 \r
6564                         HEX_REVENGE_TURN(p_ptr)--;\r
6565 \r
6566                         if ((HEX_REVENGE_TURN(p_ptr) <= 0) || (power >= 200))\r
6567                         {\r
6568                                 msg_print(_("我慢が解かれた!", "Time for end of patioence!"));\r
6569                                 if (power)\r
6570                                 {\r
6571                                         project(0, rad, p_ptr->y, p_ptr->x, power, GF_HELL_FIRE,\r
6572                                                 (PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);\r
6573                                 }\r
6574                                 if (p_ptr->wizard)\r
6575                                 {\r
6576                                         msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);\r
6577                                 }\r
6578 \r
6579                                 /* Reset */\r
6580                                 HEX_REVENGE_TYPE(p_ptr) = 0;\r
6581                                 HEX_REVENGE_TURN(p_ptr) = 0;\r
6582                                 HEX_REVENGE_POWER(p_ptr) = 0;\r
6583                         }\r
6584                 }\r
6585                 break;\r
6586 \r
6587         /*** 2nd book (8-15) ***/\r
6588         case 8:\r
6589                 if (name) return _("氷の鎧", "Ice armor");\r
6590                 if (desc) return _("氷のオーラを身にまとい、防御力が上昇する。", "Gives fire aura and bonus to AC.");\r
6591                 if (cast)\r
6592                 {\r
6593                         msg_print(_("体が氷の鎧で覆われた。", "You have enveloped by ice armor!"));\r
6594                 }\r
6595                 if (stop)\r
6596                 {\r
6597                         msg_print(_("氷の鎧が消え去った。", "Ice armor disappeared."));\r
6598                 }\r
6599                 break;\r
6600 \r
6601         case 9:\r
6602                 if (name) return _("重傷の治癒", "Cure serious wounds");\r
6603                 if (desc) return _("体力や傷を多少回復させる。", "Heals cut and HP more.");\r
6604                 if (info) return info_heal(2, 10, 0);\r
6605                 if (cast)\r
6606                 {\r
6607                         msg_print(_("気分が良くなってくる。", "You feel better and better."));\r
6608                 }\r
6609                 if (cast || cont)\r
6610                 {\r
6611                         hp_player(damroll(2, 10));\r
6612                         set_cut((p_ptr->cut / 2) - 10);\r
6613                 }\r
6614                 break;\r
6615 \r
6616         case 10:\r
6617                 if (name) return _("薬品吸入", "Inhail potion");\r
6618                 if (desc) return _("呪文詠唱を中止することなく、薬の効果を得ることができる。", "Quaffs a potion without canceling of casting a spell.");\r
6619                 if (cast)\r
6620                 {\r
6621                         CASTING_HEX_FLAGS(p_ptr) |= (1L << HEX_INHAIL);\r
6622                         do_cmd_quaff_potion();\r
6623                         CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_INHAIL);\r
6624                         add = FALSE;\r
6625                 }\r
6626                 break;\r
6627 \r
6628         case 11:\r
6629                 if (name) return _("衰弱の霧", "Hypodynamic mist");\r
6630                 if (desc) return _("視界内のモンスターに微弱量の衰弱属性のダメージを与える。", \r
6631                         "Deals few damages of hypodynamia to all monsters in your sight.");\r
6632                 power = (plev / 2) + 5;\r
6633                 if (info) return info_damage(1, power, 0);\r
6634                 if (cast || cont)\r
6635                 {\r
6636                         project_hack(GF_HYPODYNAMIA, randint1(power));\r
6637                 }\r
6638                 break;\r
6639 \r
6640         case 12:\r
6641                 if (name) return _("魔剣化", "Swords to runeswords");\r
6642                 if (desc) return _("武器の攻撃力を上げる。切れ味を得、呪いに応じて与えるダメージが上昇し、善良なモンスターに対するダメージが2倍になる。", \r
6643                         "Gives vorpal ability to your weapon. Increases damages by your weapon acccording to curse of your weapon.");\r
6644                 if (cast)\r
6645                 {\r
6646 #ifdef JP\r
6647                         msg_print("あなたの武器が黒く輝いた。");\r
6648 #else\r
6649                         if (!empty_hands(FALSE))\r
6650                                 msg_print("Your weapons glow bright black.");\r
6651                         else\r
6652                                 msg_print("Your weapon glows bright black.");\r
6653 #endif\r
6654                 }\r
6655                 if (stop)\r
6656                 {\r
6657 #ifdef JP\r
6658                         msg_print("武器の輝きが消え去った。");\r
6659 #else\r
6660                         msg_format("Brightness of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");\r
6661 #endif\r
6662                 }\r
6663                 break;\r
6664 \r
6665         case 13:\r
6666                 if (name) return _("混乱の手", "Touch of confusion");\r
6667                 if (desc) return _("攻撃した際モンスターを混乱させる。", "Confuses a monster when you attack.");\r
6668                 if (cast)\r
6669                 {\r
6670                         msg_print(_("あなたの手が赤く輝き始めた。", "Your hands glow bright red."));\r
6671                 }\r
6672                 if (stop)\r
6673                 {\r
6674                         msg_print(_("手の輝きがなくなった。", "Brightness on your hands disappeard."));\r
6675                 }\r
6676                 break;\r
6677 \r
6678         case 14:\r
6679                 if (name) return _("肉体強化", "Building up");\r
6680                 if (desc) return _("術者の腕力、器用さ、耐久力を上昇させる。攻撃回数の上限を 1 増加させる。", \r
6681                         "Attempts to increases your strength, dexterity and constitusion.");\r
6682                 if (cast)\r
6683                 {\r
6684                         msg_print(_("身体が強くなった気がした。", "You feel your body is developed more now."));\r
6685                 }\r
6686                 break;\r
6687 \r
6688         case 15:\r
6689                 if (name) return _("反テレポート結界", "Anti teleport barrier");\r
6690                 if (desc) return _("視界内のモンスターのテレポートを阻害するバリアを張る。", "Obstructs all teleportations by monsters in your sight.");\r
6691                 power = plev * 3 / 2;\r
6692                 if (info) return info_power(power);\r
6693                 if (cast)\r
6694                 {\r
6695                         msg_print(_("テレポートを防ぐ呪いをかけた。", "You feel anyone can not teleport except you."));\r
6696                 }\r
6697                 break;\r
6698 \r
6699         /*** 3rd book (16-23) ***/\r
6700         case 16:\r
6701                 if (name) return _("衝撃のクローク", "Cloak of shock");\r
6702                 if (desc) return _("電気のオーラを身にまとい、動きが速くなる。", "Gives lightning aura and a bonus to speed.");\r
6703                 if (cast)\r
6704                 {\r
6705                         msg_print(_("体が稲妻のオーラで覆われた。", "You have enveloped by electrical aura!"));\r
6706                 }\r
6707                 if (stop)\r
6708                 {\r
6709                         msg_print(_("稲妻のオーラが消え去った。", "Electrical aura disappeared."));\r
6710                 }\r
6711                 break;\r
6712 \r
6713         case 17:\r
6714                 if (name) return _("致命傷の治癒", "Cure critical wounds");\r
6715                 if (desc) return _("体力や傷を回復させる。", "Heals cut and HP greatry.");\r
6716                 if (info) return info_heal(4, 10, 0);\r
6717                 if (cast)\r
6718                 {\r
6719                         msg_print(_("気分が良くなってくる。", "You feel better and better."));\r
6720                 }\r
6721                 if (cast || cont)\r
6722                 {\r
6723                         hp_player(damroll(4, 10));\r
6724                         set_stun(0);\r
6725                         set_cut(0);\r
6726                         set_poisoned(0);\r
6727                 }\r
6728                 break;\r
6729 \r
6730         case 18:\r
6731                 if (name) return _("呪力封入", "Recharging");\r
6732                 if (desc) return _("魔法の道具に魔力を再充填する。", "Recharges a magic device.");\r
6733                 power = plev * 2;\r
6734                 if (info) return info_power(power);\r
6735                 if (cast)\r
6736                 {\r
6737                         if (!recharge(power)) return NULL;\r
6738                         add = FALSE;\r
6739                 }\r
6740                 break;\r
6741 \r
6742         case 19:\r
6743                 if (name) return _("死者復活", "Animate Dead");\r
6744                 if (desc) return _("死体を蘇らせてペットにする。", "Raises corpses and skeletons from dead.");\r
6745                 if (cast)\r
6746                 {\r
6747                         msg_print(_("死者への呼びかけを始めた。", "You start to call deads.!"));\r
6748                 }\r
6749                 if (cast || cont)\r
6750                 {\r
6751                         animate_dead(0, p_ptr->y, p_ptr->x);\r
6752                 }\r
6753                 break;\r
6754 \r
6755         case 20:\r
6756                 if (name) return _("防具呪縛", "Curse armor");\r
6757                 if (desc) return _("装備している防具に呪いをかける。", "Curse a piece of armour that you wielding.");\r
6758                 if (cast)\r
6759                 {\r
6760                         OBJECT_IDX item;\r
6761                         cptr q, s;\r
6762                         char o_name[MAX_NLEN];\r
6763                         object_type *o_ptr;\r
6764                         u32b f[TR_FLAG_SIZE];\r
6765 \r
6766                         item_tester_hook = object_is_armour;\r
6767                         q = _("どれを呪いますか?", "Which piece of armour do you curse?");\r
6768                         s = _("防具を装備していない。", "You wield no piece of armours.");\r
6769 \r
6770                         if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;\r
6771 \r
6772                         o_ptr = &inventory[item];\r
6773                         object_desc(o_name, o_ptr, OD_NAME_ONLY);\r
6774                         object_flags(o_ptr, f);\r
6775 \r
6776                         if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;\r
6777 \r
6778                         if (!one_in_(3) &&\r
6779                                 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))\r
6780                         {\r
6781                                 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);\r
6782                                 if (one_in_(3))\r
6783                                 {\r
6784                                         if (o_ptr->to_d > 0)\r
6785                                         {\r
6786                                                 o_ptr->to_d -= randint1(3) % 2;\r
6787                                                 if (o_ptr->to_d < 0) o_ptr->to_d = 0;\r
6788                                         }\r
6789                                         if (o_ptr->to_h > 0)\r
6790                                         {\r
6791                                                 o_ptr->to_h -= randint1(3) % 2;\r
6792                                                 if (o_ptr->to_h < 0) o_ptr->to_h = 0;\r
6793                                         }\r
6794                                         if (o_ptr->to_a > 0)\r
6795                                         {\r
6796                                                 o_ptr->to_a -= randint1(3) % 2;\r
6797                                                 if (o_ptr->to_a < 0) o_ptr->to_a = 0;\r
6798                                         }\r
6799                                         msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);\r
6800                                 }\r
6801                         }\r
6802                         else\r
6803                         {\r
6804                                 int curse_rank = 0;\r
6805                                 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);\r
6806                                 o_ptr->curse_flags |= (TRC_CURSED);\r
6807 \r
6808                                 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))\r
6809                                 {\r
6810 \r
6811                                         if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);\r
6812                                         if (one_in_(666))\r
6813                                         {\r
6814                                                 o_ptr->curse_flags |= (TRC_TY_CURSE);\r
6815                                                 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);\r
6816 \r
6817                                                 add_flag(o_ptr->art_flags, TR_AGGRAVATE);\r
6818                                                 add_flag(o_ptr->art_flags, TR_RES_POIS);\r
6819                                                 add_flag(o_ptr->art_flags, TR_RES_DARK);\r
6820                                                 add_flag(o_ptr->art_flags, TR_RES_NETHER);\r
6821                                                 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));\r
6822                                                 curse_rank = 2;\r
6823                                         }\r
6824                                 }\r
6825 \r
6826                                 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);\r
6827                         }\r
6828 \r
6829                         p_ptr->update |= (PU_BONUS);\r
6830                         add = FALSE;\r
6831                 }\r
6832                 break;\r
6833 \r
6834         case 21:\r
6835                 if (name) return _("影のクローク", "Cloak of shadow");\r
6836                 if (desc) return _("影のオーラを身にまとい、敵に影のダメージを与える。", "Gives aura of shadow.");\r
6837                 if (cast)\r
6838                 {\r
6839                         object_type *o_ptr = &inventory[INVEN_OUTER];\r
6840 \r
6841                         if (!o_ptr->k_idx)\r
6842                         {\r
6843                                 msg_print(_("クロークを身につけていない!", "You don't ware any cloak."));\r
6844                                 return NULL;\r
6845                         }\r
6846                         else if (!object_is_cursed(o_ptr))\r
6847                         {\r
6848                                 msg_print(_("クロークは呪われていない!", "Your cloak is not cursed."));\r
6849                                 return NULL;\r
6850                         }\r
6851                         else\r
6852                         {\r
6853                                 msg_print(_("影のオーラを身にまとった。", "You have enveloped by shadow aura!"));\r
6854                         }\r
6855                 }\r
6856                 if (cont)\r
6857                 {\r
6858                         object_type *o_ptr = &inventory[INVEN_OUTER];\r
6859 \r
6860                         if ((!o_ptr->k_idx) || (!object_is_cursed(o_ptr)))\r
6861                         {\r
6862                                 do_spell(REALM_HEX, spell, SPELL_STOP);\r
6863                                 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << spell);\r
6864                                 CASTING_HEX_NUM(p_ptr)--;\r
6865                                 if (!SINGING_SONG_ID(p_ptr)) set_action(ACTION_NONE);\r
6866                         }\r
6867                 }\r
6868                 if (stop)\r
6869                 {\r
6870                         msg_print(_("影のオーラが消え去った。", "Shadow aura disappeared."));\r
6871                 }\r
6872                 break;\r
6873 \r
6874         case 22:\r
6875                 if (name) return _("苦痛を魔力に", "Pains to mana");\r
6876                 if (desc) return _("視界内のモンスターに精神ダメージ与え、魔力を吸い取る。", "Deals psychic damages to all monsters in sight, and drains some mana.");\r
6877                 power = plev * 3 / 2;\r
6878                 if (info) return info_damage(1, power, 0);\r
6879                 if (cast || cont)\r
6880                 {\r
6881                         project_hack(GF_PSI_DRAIN, randint1(power));\r
6882                 }\r
6883                 break;\r
6884 \r
6885         case 23:\r
6886                 if (name) return _("目には目を", "Eye for an eye");\r
6887                 if (desc) return _("打撃や魔法で受けたダメージを、攻撃元のモンスターにも与える。", "Returns same damage which you got to the monster which damaged you.");\r
6888                 if (cast)\r
6889                 {\r
6890                         msg_print(_("復讐したい欲望にかられた。", "You wish strongly you want to revenge anything."));\r
6891                 }\r
6892                 break;\r
6893 \r
6894         /*** 4th book (24-31) ***/\r
6895         case 24:\r
6896                 if (name) return _("反増殖結界", "Anti multiply barrier");\r
6897                 if (desc) return _("その階の増殖するモンスターの増殖を阻止する。", "Obstructs all multiplying by monsters in entire floor.");\r
6898                 if (cast)\r
6899                 {\r
6900                         msg_print(_("増殖を阻止する呪いをかけた。", "You feel anyone can not already multiply."));\r
6901                 }\r
6902                 break;\r
6903 \r
6904         case 25:\r
6905                 if (name) return _("全復活", "Restoration");\r
6906                 if (desc) return _("経験値を徐々に復活し、減少した能力値を回復させる。", "Restores experience and status.");\r
6907                 if (cast)\r
6908                 {\r
6909                         msg_print(_("体が元の活力を取り戻し始めた。", "You feel your lost status starting to return."));\r
6910                 }\r
6911                 if (cast || cont)\r
6912                 {\r
6913                         bool flag = FALSE;\r
6914                         int d = (p_ptr->max_exp - p_ptr->exp);\r
6915                         int r = (p_ptr->exp / 20);\r
6916                         int i;\r
6917 \r
6918                         if (d > 0)\r
6919                         {\r
6920                                 if (d < r)\r
6921                                         p_ptr->exp = p_ptr->max_exp;\r
6922                                 else\r
6923                                         p_ptr->exp += r;\r
6924 \r
6925                                 /* Check the experience */\r
6926                                 check_experience();\r
6927 \r
6928                                 flag = TRUE;\r
6929                         }\r
6930                         for (i = A_STR; i < 6; i ++)\r
6931                         {\r
6932                                 if (p_ptr->stat_cur[i] < p_ptr->stat_max[i])\r
6933                                 {\r
6934                                         if (p_ptr->stat_cur[i] < 18)\r
6935                                                 p_ptr->stat_cur[i]++;\r
6936                                         else\r
6937                                                 p_ptr->stat_cur[i] += 10;\r
6938 \r
6939                                         if (p_ptr->stat_cur[i] > p_ptr->stat_max[i])\r
6940                                                 p_ptr->stat_cur[i] = p_ptr->stat_max[i];\r
6941 \r
6942                                         /* Recalculate bonuses */\r
6943                                         p_ptr->update |= (PU_BONUS);\r
6944 \r
6945                                         flag = TRUE;\r
6946                                 }\r
6947                         }\r
6948 \r
6949                         if (!flag)\r
6950                         {\r
6951                                 msg_format(_("%sの呪文の詠唱をやめた。", "Finish casting '%^s'."), do_spell(REALM_HEX, HEX_RESTORE, SPELL_NAME));\r
6952                                 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_RESTORE);\r
6953                                 if (cont) CASTING_HEX_NUM(p_ptr)--;\r
6954                                 if (CASTING_HEX_NUM(p_ptr)) p_ptr->action = ACTION_NONE;\r
6955 \r
6956                                 /* Redraw status */\r
6957                                 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);\r
6958                                 p_ptr->redraw |= (PR_EXTRA);\r
6959 \r
6960                                 return "";\r
6961                         }\r
6962                 }\r
6963                 break;\r
6964 \r
6965         case 26:\r
6966                 if (name) return _("呪力吸収", "Drain curse power");\r
6967                 if (desc) return _("呪われた武器の呪いを吸収して魔力を回復する。", "Drains curse on your weapon and heals SP a little.");\r
6968                 if (cast)\r
6969                 {\r
6970                         OBJECT_IDX item;\r
6971                         cptr s, q;\r
6972                         u32b f[TR_FLAG_SIZE];\r
6973                         object_type *o_ptr;\r
6974 \r
6975                         item_tester_hook = item_tester_hook_cursed;\r
6976                         q = _("どの装備品から吸収しますか?", "Which cursed equipment do you drain mana from?");\r
6977                         s = _("呪われたアイテムを装備していない。", "You have no cursed equipment.");\r
6978 \r
6979                         if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;\r
6980 \r
6981                         o_ptr = &inventory[item];\r
6982                         object_flags(o_ptr, f);\r
6983 \r
6984                         p_ptr->csp += (p_ptr->lev / 5) + randint1(p_ptr->lev / 5);\r
6985                         if (have_flag(f, TR_TY_CURSE) || (o_ptr->curse_flags & TRC_TY_CURSE)) p_ptr->csp += randint1(5);\r
6986                         if (p_ptr->csp > p_ptr->msp) p_ptr->csp = p_ptr->msp;\r
6987 \r
6988                         if (o_ptr->curse_flags & TRC_PERMA_CURSE)\r
6989                         {\r
6990                                 /* Nothing */\r
6991                         }\r
6992                         else if (o_ptr->curse_flags & TRC_HEAVY_CURSE)\r
6993                         {\r
6994                                 if (one_in_(7))\r
6995                                 {\r
6996                                         msg_print(_("呪いを全て吸い取った。", "Heavy curse vanished away."));\r
6997                                         o_ptr->curse_flags = 0L;\r
6998                                 }\r
6999                         }\r
7000                         else if ((o_ptr->curse_flags & (TRC_CURSED)) && one_in_(3))\r
7001                         {\r
7002                                 msg_print(_("呪いを全て吸い取った。", "Curse vanished away."));\r
7003                                 o_ptr->curse_flags = 0L;\r
7004                         }\r
7005 \r
7006                         add = FALSE;\r
7007                 }\r
7008                 break;\r
7009 \r
7010         case 27:\r
7011                 if (name) return _("吸血の刃", "Swords to vampires");\r
7012                 if (desc) return _("吸血属性で攻撃する。", "Gives vampiric ability to your weapon.");\r
7013                 if (cast)\r
7014                 {\r
7015 #ifdef JP\r
7016                         msg_print("あなたの武器が血を欲している。");\r
7017 #else\r
7018                         if (!empty_hands(FALSE))\r
7019                                 msg_print("Your weapons want more blood now.");\r
7020                         else\r
7021                                 msg_print("Your weapon wants more blood now.");\r
7022 #endif\r
7023                 }\r
7024                 if (stop)\r
7025                 {\r
7026 #ifdef JP\r
7027                         msg_print("武器の渇望が消え去った。");\r
7028 #else\r
7029                         msg_format("Thirsty of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");\r
7030 #endif\r
7031                 }\r
7032                 break;\r
7033 \r
7034         case 28:\r
7035                 if (name) return _("朦朧の言葉", "Word of stun");\r
7036                 if (desc) return _("視界内のモンスターを朦朧とさせる。", "Stuns all monsters in your sight.");\r
7037                 power = plev * 4;\r
7038                 if (info) return info_power(power);\r
7039                 if (cast || cont)\r
7040                 {\r
7041                         stun_monsters(power);\r
7042                 }\r
7043                 break;\r
7044 \r
7045         case 29:\r
7046                 if (name) return _("影移動", "Moving into shadow");\r
7047                 if (desc) return _("モンスターの隣のマスに瞬間移動する。", "Teleports you close to a monster.");\r
7048                 if (cast)\r
7049                 {\r
7050                         int i, dir;\r
7051                         POSITION y, x;\r
7052                         bool flag;\r
7053 \r
7054                         for (i = 0; i < 3; i++)\r
7055                         {\r
7056                                 if (!tgt_pt(&x, &y)) return FALSE;\r
7057 \r
7058                                 flag = FALSE;\r
7059 \r
7060                                 for (dir = 0; dir < 8; dir++)\r
7061                                 {\r
7062                                         int dy = y + ddy_ddd[dir];\r
7063                                         int dx = x + ddx_ddd[dir];\r
7064                                         if (dir == 5) continue;\r
7065                                         if(cave[dy][dx].m_idx) flag = TRUE;\r
7066                                 }\r
7067 \r
7068                                 if (!cave_empty_bold(y, x) || (cave[y][x].info & CAVE_ICKY) ||\r
7069                                         (distance(y, x, p_ptr->y, p_ptr->x) > plev + 2))\r
7070                                 {\r
7071                                         msg_print(_("そこには移動できない。", "Can not teleport to there."));\r
7072                                         continue;\r
7073                                 }\r
7074                                 break;\r
7075                         }\r
7076 \r
7077                         if (flag && randint0(plev * plev / 2))\r
7078                         {\r
7079                                 teleport_player_to(y, x, 0L);\r
7080                         }\r
7081                         else\r
7082                         {\r
7083                                 msg_print(_("おっと!", "Oops!"));\r
7084                                 teleport_player(30, 0L);\r
7085                         }\r
7086 \r
7087                         add = FALSE;\r
7088                 }\r
7089                 break;\r
7090 \r
7091         case 30:\r
7092                 if (name) return _("反魔法結界", "Anti magic barrier");\r
7093                 if (desc) return _("視界内のモンスターの魔法を阻害するバリアを張る。", "Obstructs all magic spell of monsters in your sight.");\r
7094                 power = plev * 3 / 2;\r
7095                 if (info) return info_power(power);\r
7096                 if (cast)\r
7097                 {\r
7098                         msg_print(_("魔法を防ぐ呪いをかけた。", "You feel anyone can not cast spells except you."));\r
7099                 }\r
7100                 break;\r
7101 \r
7102         case 31:\r
7103                 if (name) return _("復讐の宣告", "Revenge sentence");\r
7104                 if (desc) return _("数ターン後にそれまで受けたダメージに応じた威力の地獄の劫火の弾を放つ。", \r
7105                         "Fires  a ball of hell fire to try revenging after few turns.");\r
7106                 power = HEX_REVENGE_POWER(p_ptr);\r
7107                 if (info) return info_damage(0, 0, power);\r
7108                 if (cast)\r
7109                 {\r
7110                         MAGIC_NUM2 r;\r
7111                         int a = 3 - (p_ptr->pspeed - 100) / 10;\r
7112                         r = 1 + randint1(2) + MAX(0, MIN(3, a));\r
7113 \r
7114                         if (HEX_REVENGE_TURN(p_ptr) > 0)\r
7115                         {\r
7116                                 msg_print(_("すでに復讐は宣告済みだ。", "You already pronounced your revenge."));\r
7117                                 return NULL;\r
7118                         }\r
7119 \r
7120                         HEX_REVENGE_TYPE(p_ptr) = 2;\r
7121                         HEX_REVENGE_TURN(p_ptr) = r;\r
7122                         msg_format(_("あなたは復讐を宣告した。あと %d ターン。", "You pronounce your revenge. %d turns left."), r);\r
7123                         add = FALSE;\r
7124                 }\r
7125                 if (cont)\r
7126                 {\r
7127                         HEX_REVENGE_TURN(p_ptr)--;\r
7128 \r
7129                         if (HEX_REVENGE_TURN(p_ptr) <= 0)\r
7130                         {\r
7131                                 int dir;\r
7132 \r
7133                                 if (power)\r
7134                                 {\r
7135                                         command_dir = 0;\r
7136 \r
7137                                         do\r
7138                                         {\r
7139                                                 msg_print(_("復讐の時だ!", "Time to revenge!"));\r
7140                                         }\r
7141                                         while (!get_aim_dir(&dir));\r
7142 \r
7143                                         fire_ball(GF_HELL_FIRE, dir, power, 1);\r
7144 \r
7145                                         if (p_ptr->wizard)\r
7146                                         {\r
7147                                                 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);\r
7148                                         }\r
7149                                 }\r
7150                                 else\r
7151                                 {\r
7152                                         msg_print(_("復讐する気が失せた。", "You are not a mood to revenge."));\r
7153                                 }\r
7154                                 HEX_REVENGE_POWER(p_ptr) = 0;\r
7155                         }\r
7156                 }\r
7157                 break;\r
7158         }\r
7159 \r
7160         /* start casting */\r
7161         if ((cast) && (add))\r
7162         {\r
7163                 /* add spell */\r
7164                 CASTING_HEX_FLAGS(p_ptr) |= 1L << (spell);\r
7165                 CASTING_HEX_NUM(p_ptr)++;\r
7166 \r
7167                 if (p_ptr->action != ACTION_SPELL) set_action(ACTION_SPELL);\r
7168         }\r
7169 \r
7170         /* Redraw status */\r
7171         if (!info)\r
7172         {\r
7173                 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);\r
7174                 p_ptr->redraw |= (PR_EXTRA | PR_HP | PR_MANA);\r
7175         }\r
7176 \r
7177         return "";\r
7178 }\r
7179 \r
7180 \r
7181 /*!\r
7182  * @brief 魔法処理のメインルーチン\r
7183  * @param realm 魔法領域のID\r
7184  * @param spell 各領域の魔法ID\r
7185  * @param mode 求める処理\r
7186  * @return 各領域魔法に各種テキストを求めた場合は文字列参照ポインタ、そうでない場合はNULLポインタを返す。\r
7187  */\r
7188 cptr do_spell(REALM_IDX realm, SPELL_IDX spell, BIT_FLAGS mode)\r
7189 {\r
7190         switch (realm)\r
7191         {\r
7192         case REALM_LIFE:     return do_life_spell(spell, mode);\r
7193         case REALM_SORCERY:  return do_sorcery_spell(spell, mode);\r
7194         case REALM_NATURE:   return do_nature_spell(spell, mode);\r
7195         case REALM_CHAOS:    return do_chaos_spell(spell, mode);\r
7196         case REALM_DEATH:    return do_death_spell(spell, mode);\r
7197         case REALM_TRUMP:    return do_trump_spell(spell, mode);\r
7198         case REALM_ARCANE:   return do_arcane_spell(spell, mode);\r
7199         case REALM_CRAFT:    return do_craft_spell(spell, mode);\r
7200         case REALM_DAEMON:   return do_daemon_spell(spell, mode);\r
7201         case REALM_CRUSADE:  return do_crusade_spell(spell, mode);\r
7202         case REALM_MUSIC:    return do_music_spell(spell, mode);\r
7203         case REALM_HISSATSU: return do_hissatsu_spell(spell, mode);\r
7204         case REALM_HEX:      return do_hex_spell(spell, mode);\r
7205         }\r
7206 \r
7207         return NULL;\r
7208 }\r