OSDN Git Service

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