OSDN Git Service

3191b894d3cc69b5386455c0ee041d815f663c81
[hengband/hengband.git] / src / cmd-spell.c
1 /*!\r
2     @file cmd-spell.c\r
3     @brief 魔法のインターフェイスと発動 / Purpose: Do everything for each spell\r
4     @date 2013/12/31\r
5     @author\r
6     2013 Deskull rearranged comment for Doxygen.\r
7  */\r
8 \r
9 #include "angband.h"\r
10 #include "selfinfo.h"\r
11 #include "cmd-quaff.h"\r
12 #include "spells-summon.h"\r
13 #include "realm-arcane.h"\r
14 \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 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 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 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 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 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 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 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 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 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 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 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 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_craft_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 plev = p_ptr->lev;\r
3857 \r
3858         switch (spell)\r
3859         {\r
3860         case 0:\r
3861                 if (name) return _("赤外線視力", "Infravision");\r
3862                 if (desc) return _("一定時間、赤外線視力が増強される。", "Gives infravision for a while.");\r
3863     \r
3864                 {\r
3865                         int base = 100;\r
3866 \r
3867                         if (info) return info_duration(base, base);\r
3868 \r
3869                         if (cast)\r
3870                         {\r
3871                                 set_tim_infra(base + randint1(base), FALSE);\r
3872                         }\r
3873                 }\r
3874                 break;\r
3875 \r
3876         case 1:\r
3877                 if (name) return _("回復力強化", "Regeneration");\r
3878                 if (desc) return _("一定時間、回復力が増強される。", "Gives regeneration ability for a while.");\r
3879     \r
3880                 {\r
3881                         int base = 80;\r
3882 \r
3883                         if (info) return info_duration(base, base);\r
3884 \r
3885                         if (cast)\r
3886                         {\r
3887                                 set_tim_regen(base + randint1(base), FALSE);\r
3888                         }\r
3889                 }\r
3890                 break;\r
3891 \r
3892         case 2:\r
3893                 if (name) return _("空腹充足", "Satisfy Hunger");\r
3894                 if (desc) return _("満腹になる。", "Satisfies hunger.");\r
3895     \r
3896                 {\r
3897                         if (cast)\r
3898                         {\r
3899                                 set_food(PY_FOOD_MAX - 1);\r
3900                         }\r
3901                 }\r
3902                 break;\r
3903 \r
3904         case 3:\r
3905                 if (name) return _("耐冷気", "Resist Cold");\r
3906                 if (desc) return _("一定時間、冷気への耐性を得る。装備による耐性に累積する。", \r
3907                         "Gives resistance to cold. This resistance can be added to which from equipment for more powerful resistance.");\r
3908     \r
3909                 {\r
3910                         int base = 20;\r
3911 \r
3912                         if (info) return info_duration(base, base);\r
3913 \r
3914                         if (cast)\r
3915                         {\r
3916                                 set_oppose_cold(randint1(base) + base, FALSE);\r
3917                         }\r
3918                 }\r
3919                 break;\r
3920 \r
3921         case 4:\r
3922                 if (name) return _("耐火炎", "Resist Fire");\r
3923                 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。", \r
3924                         "Gives resistance to fire. This resistance can be added to which from equipment for more powerful resistance.");\r
3925     \r
3926                 {\r
3927                         int base = 20;\r
3928 \r
3929                         if (info) return info_duration(base, base);\r
3930 \r
3931                         if (cast)\r
3932                         {\r
3933                                 set_oppose_fire(randint1(base) + base, FALSE);\r
3934                         }\r
3935                 }\r
3936                 break;\r
3937 \r
3938         case 5:\r
3939                 if (name) return _("士気高揚", "Heroism");\r
3940                 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");\r
3941     \r
3942                 {\r
3943                         int base = 25;\r
3944 \r
3945                         if (info) return info_duration(base, base);\r
3946 \r
3947                         if (cast)\r
3948                         {\r
3949                                 set_hero(randint1(base) + base, FALSE);\r
3950                                 hp_player(10);\r
3951                                 set_afraid(0);\r
3952                         }\r
3953                 }\r
3954                 break;\r
3955 \r
3956         case 6:\r
3957                 if (name) return _("耐電撃", "Resist Lightning");\r
3958                 if (desc) return _("一定時間、電撃への耐性を得る。装備による耐性に累積する。",\r
3959                         "Gives resistance to electricity. This resistance can be added to which from equipment for more powerful resistance.");\r
3960     \r
3961                 {\r
3962                         int base = 20;\r
3963 \r
3964                         if (info) return info_duration(base, base);\r
3965 \r
3966                         if (cast)\r
3967                         {\r
3968                                 set_oppose_elec(randint1(base) + base, FALSE);\r
3969                         }\r
3970                 }\r
3971                 break;\r
3972 \r
3973         case 7:\r
3974                 if (name) return _("耐酸", "Resist Acid");\r
3975                 if (desc) return _("一定時間、酸への耐性を得る。装備による耐性に累積する。",\r
3976                         "Gives resistance to acid. This resistance can be added to which from equipment for more powerful resistance.");\r
3977     \r
3978                 {\r
3979                         int base = 20;\r
3980 \r
3981                         if (info) return info_duration(base, base);\r
3982 \r
3983                         if (cast)\r
3984                         {\r
3985                                 set_oppose_acid(randint1(base) + base, FALSE);\r
3986                         }\r
3987                 }\r
3988                 break;\r
3989 \r
3990         case 8:\r
3991                 if (name) return _("透明視認", "See Invisibility");\r
3992                 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");\r
3993     \r
3994                 {\r
3995                         int base = 24;\r
3996 \r
3997                         if (info) return info_duration(base, base);\r
3998 \r
3999                         if (cast)\r
4000                         {\r
4001                                 set_tim_invis(randint1(base) + base, FALSE);\r
4002                         }\r
4003                 }\r
4004                 break;\r
4005 \r
4006         case 9:\r
4007                 if (name) return _("解呪", "Remove Curse");\r
4008                 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");\r
4009     \r
4010                 {\r
4011                         if (cast)\r
4012                         {\r
4013                                 if (remove_curse())\r
4014                                 {\r
4015                                         msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));\r
4016                                 }\r
4017                         }\r
4018                 }\r
4019                 break;\r
4020 \r
4021         case 10:\r
4022                 if (name) return _("耐毒", "Resist Poison");\r
4023                 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",\r
4024                         "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");\r
4025     \r
4026                 {\r
4027                         int base = 20;\r
4028 \r
4029                         if (info) return info_duration(base, base);\r
4030 \r
4031                         if (cast)\r
4032                         {\r
4033                                 set_oppose_pois(randint1(base) + base, FALSE);\r
4034                         }\r
4035                 }\r
4036                 break;\r
4037 \r
4038         case 11:\r
4039                 if (name) return _("狂戦士化", "Berserk");\r
4040                 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");\r
4041     \r
4042                 {\r
4043                         int base = 25;\r
4044 \r
4045                         if (info) return info_duration(base, base);\r
4046 \r
4047                         if (cast)\r
4048                         {\r
4049                                 set_shero(randint1(base) + base, FALSE);\r
4050                                 hp_player(30);\r
4051                                 set_afraid(0);\r
4052                         }\r
4053                 }\r
4054                 break;\r
4055 \r
4056         case 12:\r
4057                 if (name) return _("自己分析", "Self Knowledge");\r
4058                 if (desc) return _("現在の自分の状態を完全に知る。",\r
4059                         "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");\r
4060     \r
4061                 {\r
4062                         if (cast)\r
4063                         {\r
4064                                 self_knowledge();\r
4065                         }\r
4066                 }\r
4067                 break;\r
4068 \r
4069         case 13:\r
4070                 if (name) return _("対邪悪結界", "Protection from Evil");\r
4071                 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");\r
4072     \r
4073                 {\r
4074                         int base = 3 * plev;\r
4075                         int sides = 25;\r
4076 \r
4077                         if (info) return info_duration(base, sides);\r
4078 \r
4079                         if (cast)\r
4080                         {\r
4081                                 set_protevil(randint1(sides) + base, FALSE);\r
4082                         }\r
4083                 }\r
4084                 break;\r
4085 \r
4086         case 14:\r
4087                 if (name) return _("癒し", "Cure");\r
4088                 if (desc) return _("毒、朦朧状態、負傷を全快させ、幻覚を直す。", "Heals poison, stun, cut and hallucination completely.");\r
4089     \r
4090                 {\r
4091                         if (cast)\r
4092                         {\r
4093                                 set_poisoned(0);\r
4094                                 set_stun(0);\r
4095                                 set_cut(0);\r
4096                                 set_image(0);\r
4097                         }\r
4098                 }\r
4099                 break;\r
4100 \r
4101         case 15:\r
4102                 if (name) return _("魔法剣", "Mana Branding");\r
4103                 if (desc) return _("一定時間、武器に冷気、炎、電撃、酸、毒のいずれかの属性をつける。武器を持たないと使えない。",\r
4104                         "Makes current weapon some elemental branded. You must wield weapons.");\r
4105     \r
4106                 {\r
4107                         int base = plev / 2;\r
4108 \r
4109                         if (info) return info_duration(base, base);\r
4110 \r
4111                         if (cast)\r
4112                         {\r
4113                                 if (!choose_ele_attack()) return NULL;\r
4114                         }\r
4115                 }\r
4116                 break;\r
4117 \r
4118         case 16:\r
4119                 if (name) return _("テレパシー", "Telepathy");\r
4120                 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");\r
4121     \r
4122                 {\r
4123                         int base = 25;\r
4124                         int sides = 30;\r
4125 \r
4126                         if (info) return info_duration(base, sides);\r
4127 \r
4128                         if (cast)\r
4129                         {\r
4130                                 set_tim_esp(randint1(sides) + base, FALSE);\r
4131                         }\r
4132                 }\r
4133                 break;\r
4134 \r
4135         case 17:\r
4136                 if (name) return _("肌石化", "Stone Skin");\r
4137                 if (desc) return _("一定時間、ACを上昇させる。", "Gives bonus to AC for a while.");\r
4138     \r
4139                 {\r
4140                         int base = 30;\r
4141                         int sides = 20;\r
4142 \r
4143                         if (info) return info_duration(base, sides);\r
4144 \r
4145                         if (cast)\r
4146                         {\r
4147                                 set_shield(randint1(sides) + base, FALSE);\r
4148                         }\r
4149                 }\r
4150                 break;\r
4151 \r
4152         case 18:\r
4153                 if (name) return _("全耐性", "Resistance");\r
4154                 if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。", \r
4155                         "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
4156     \r
4157                 {\r
4158                         int base = 20;\r
4159 \r
4160                         if (info) return info_duration(base, base);\r
4161 \r
4162                         if (cast)\r
4163                         {\r
4164                                 set_oppose_acid(randint1(base) + base, FALSE);\r
4165                                 set_oppose_elec(randint1(base) + base, FALSE);\r
4166                                 set_oppose_fire(randint1(base) + base, FALSE);\r
4167                                 set_oppose_cold(randint1(base) + base, FALSE);\r
4168                                 set_oppose_pois(randint1(base) + base, FALSE);\r
4169                         }\r
4170                 }\r
4171                 break;\r
4172 \r
4173         case 19:\r
4174                 if (name) return _("スピード", "Haste Self");\r
4175                 if (desc) return _("一定時間、加速する。", "Hastes you for a while.");\r
4176     \r
4177                 {\r
4178                         int base = plev;\r
4179                         int sides = 20 + plev;\r
4180 \r
4181                         if (info) return info_duration(base, sides);\r
4182 \r
4183                         if (cast)\r
4184                         {\r
4185                                 set_fast(randint1(sides) + base, FALSE);\r
4186                         }\r
4187                 }\r
4188                 break;\r
4189 \r
4190         case 20:\r
4191                 if (name) return _("壁抜け", "Walk through Wall");\r
4192                 if (desc) return _("一定時間、半物質化し壁を通り抜けられるようになる。", "Gives ability to pass walls for a while.");\r
4193     \r
4194                 {\r
4195                         int base = plev / 2;\r
4196 \r
4197                         if (info) return info_duration(base, base);\r
4198 \r
4199                         if (cast)\r
4200                         {\r
4201                                 set_kabenuke(randint1(base) + base, FALSE);\r
4202                         }\r
4203                 }\r
4204                 break;\r
4205 \r
4206         case 21:\r
4207                 if (name) return _("盾磨き", "Polish Shield");\r
4208                 if (desc) return _("盾に反射の属性をつける。", "Makes a shield a shield of reflection.");\r
4209     \r
4210                 {\r
4211                         if (cast)\r
4212                         {\r
4213                                 pulish_shield();\r
4214                         }\r
4215                 }\r
4216                 break;\r
4217 \r
4218         case 22:\r
4219                 if (name) return _("ゴーレム製造", "Create Golem");\r
4220                 if (desc) return _("1体のゴーレムを製造する。", "Creates a golem.");\r
4221     \r
4222                 {\r
4223                         if (cast)\r
4224                         {\r
4225                                 if (summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_GOLEM, PM_FORCE_PET))\r
4226                                 {\r
4227                                         msg_print(_("ゴーレムを作った。", "You make a golem."));\r
4228                                 }\r
4229                                 else\r
4230                                 {\r
4231                                         msg_print(_("うまくゴーレムを作れなかった。", "No Golems arrive."));\r
4232                                 }\r
4233                         }\r
4234                 }\r
4235                 break;\r
4236 \r
4237         case 23:\r
4238                 if (name) return _("魔法の鎧", "Magical armor");\r
4239                 if (desc) return _("一定時間、魔法防御力とACが上がり、混乱と盲目の耐性、反射能力、麻痺知らず、浮遊を得る。",\r
4240                         "Gives resistance to magic, bonus to AC, resistance to confusion, blindness, reflection, free action and levitation for a while.");\r
4241     \r
4242                 {\r
4243                         int base = 20;\r
4244 \r
4245                         if (info) return info_duration(base, base);\r
4246 \r
4247                         if (cast)\r
4248                         {\r
4249                                 set_magicdef(randint1(base) + base, FALSE);\r
4250                         }\r
4251                 }\r
4252                 break;\r
4253 \r
4254         case 24:\r
4255                 if (name) return _("装備無力化", "Remove Enchantment");\r
4256                 if (desc) return _("武器・防具にかけられたあらゆる魔力を完全に解除する。", "Removes all magics completely from any weapon or armor.");\r
4257     \r
4258                 {\r
4259                         if (cast)\r
4260                         {\r
4261                                 if (!mundane_spell(TRUE)) return NULL;\r
4262                         }\r
4263                 }\r
4264                 break;\r
4265 \r
4266         case 25:\r
4267                 if (name) return _("呪い粉砕", "Remove All Curse");\r
4268                 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");\r
4269     \r
4270                 {\r
4271                         if (cast)\r
4272                         {\r
4273                                 if (remove_all_curse())\r
4274                                 {\r
4275                                         msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));\r
4276                                 }\r
4277                         }\r
4278                 }\r
4279                 break;\r
4280 \r
4281         case 26:\r
4282                 if (name) return _("完全なる知識", "Knowledge True");\r
4283                 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");\r
4284     \r
4285                 {\r
4286                         if (cast)\r
4287                         {\r
4288                                 if (!identify_fully(FALSE)) return NULL;\r
4289                         }\r
4290                 }\r
4291                 break;\r
4292 \r
4293         case 27:\r
4294                 if (name) return _("武器強化", "Enchant Weapon");\r
4295                 if (desc) return _("武器の命中率修正とダメージ修正を強化する。", "Attempts to increase +to-hit, +to-dam of a weapon.");\r
4296     \r
4297                 {\r
4298                         if (cast)\r
4299                         {\r
4300                                 if (!enchant_spell(randint0(4) + 1, randint0(4) + 1, 0)) return NULL;\r
4301                         }\r
4302                 }\r
4303                 break;\r
4304 \r
4305         case 28:\r
4306                 if (name) return _("防具強化", "Enchant Armor");\r
4307                 if (desc) return _("鎧の防御修正を強化する。", "Attempts to increase +AC of an armor.");\r
4308     \r
4309                 {\r
4310                         if (cast)\r
4311                         {\r
4312                                 if (!enchant_spell(0, 0, randint0(3) + 2)) return NULL;\r
4313                         }\r
4314                 }\r
4315                 break;\r
4316 \r
4317         case 29:\r
4318                 if (name) return _("武器属性付与", "Brand Weapon");\r
4319                 if (desc) return _("武器にランダムに属性をつける。", "Makes current weapon a random ego weapon.");\r
4320     \r
4321                 {\r
4322                         if (cast)\r
4323                         {\r
4324                                 brand_weapon(randint0(18));\r
4325                         }\r
4326                 }\r
4327                 break;\r
4328 \r
4329         case 30:\r
4330                 if (name) return _("人間トランプ", "Living Trump");\r
4331                 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",\r
4332                         "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");\r
4333     \r
4334                 {\r
4335                         if (cast)\r
4336                         {\r
4337                                 int mutation;\r
4338 \r
4339                                 if (one_in_(7))\r
4340                                         /* Teleport control */\r
4341                                         mutation = 12;\r
4342                                 else\r
4343                                         /* Random teleportation (uncontrolled) */\r
4344                                         mutation = 77;\r
4345 \r
4346                                 /* Gain the mutation */\r
4347                                 if (gain_random_mutation(mutation))\r
4348                                 {\r
4349                                         msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));\r
4350                                 }\r
4351                         }\r
4352                 }\r
4353                 break;\r
4354 \r
4355         case 31:\r
4356                 if (name) return _("属性への免疫", "Immunity");\r
4357                 if (desc) return _("一定時間、冷気、炎、電撃、酸のいずれかに対する免疫を得る。",\r
4358                         "Gives an immunity to fire, cold, electricity or acid for a while.");\r
4359     \r
4360                 {\r
4361                         int base = 13;\r
4362 \r
4363                         if (info) return info_duration(base, base);\r
4364 \r
4365                         if (cast)\r
4366                         {\r
4367                                 if (!choose_ele_immune(base + randint1(base))) return NULL;\r
4368                         }\r
4369                 }\r
4370                 break;\r
4371         }\r
4372 \r
4373         return "";\r
4374 }\r
4375 \r
4376 /*!\r
4377  * @brief 悪魔領域魔法の各処理を行う\r
4378  * @param spell 魔法ID\r
4379  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)\r
4380  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。\r
4381  */\r
4382 static cptr do_daemon_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
4383 {\r
4384         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
4385         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
4386         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
4387         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
4388         static const char s_dam[] = _("損傷:", "dam ");\r
4389 \r
4390         int dir;\r
4391         int plev = p_ptr->lev;\r
4392 \r
4393         switch (spell)\r
4394         {\r
4395         case 0:\r
4396                 if (name) return _("マジック・ミサイル", "Magic Missile");\r
4397                 if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");\r
4398     \r
4399                 {\r
4400                         int dice = 3 + (plev - 1) / 5;\r
4401                         int sides = 4;\r
4402 \r
4403                         if (info) return info_damage(dice, sides, 0);\r
4404 \r
4405                         if (cast)\r
4406                         {\r
4407                                 if (!get_aim_dir(&dir)) return NULL;\r
4408 \r
4409                                 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));\r
4410                         }\r
4411                 }\r
4412                 break;\r
4413 \r
4414         case 1:\r
4415                 if (name) return _("無生命感知", "Detect Unlife");\r
4416                 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");\r
4417     \r
4418                 {\r
4419                         int rad = DETECT_RAD_DEFAULT;\r
4420 \r
4421                         if (info) return info_radius(rad);\r
4422 \r
4423                         if (cast)\r
4424                         {\r
4425                                 detect_monsters_nonliving(rad);\r
4426                         }\r
4427                 }\r
4428                 break;\r
4429 \r
4430         case 2:\r
4431                 if (name) return _("邪なる祝福", "Evil Bless");\r
4432                 if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives bonus to hit and AC for a few turns.");\r
4433     \r
4434                 {\r
4435                         int base = 12;\r
4436 \r
4437                         if (info) return info_duration(base, base);\r
4438 \r
4439                         if (cast)\r
4440                         {\r
4441                                 set_blessed(randint1(base) + base, FALSE);\r
4442                         }\r
4443                 }\r
4444                 break;\r
4445 \r
4446         case 3:\r
4447                 if (name) return _("耐火炎", "Resist Fire");\r
4448                 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。", \r
4449                         "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");\r
4450     \r
4451                 {\r
4452                         int base = 20;\r
4453 \r
4454                         if (info) return info_duration(base, base);\r
4455 \r
4456                         if (cast)\r
4457                         {\r
4458                                 set_oppose_fire(randint1(base) + base, FALSE);\r
4459                         }\r
4460                 }\r
4461                 break;\r
4462 \r
4463         case 4:\r
4464                 if (name) return _("恐慌", "Horrify");\r
4465                 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");\r
4466     \r
4467                 {\r
4468                         int power = plev;\r
4469 \r
4470                         if (info) return info_power(power);\r
4471 \r
4472                         if (cast)\r
4473                         {\r
4474                                 if (!get_aim_dir(&dir)) return NULL;\r
4475 \r
4476                                 fear_monster(dir, power);\r
4477                                 stun_monster(dir, power);\r
4478                         }\r
4479                 }\r
4480                 break;\r
4481 \r
4482         case 5:\r
4483                 if (name) return _("地獄の矢", "Nether Bolt");\r
4484                 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");\r
4485     \r
4486                 {\r
4487                         int dice = 6 + (plev - 5) / 4;\r
4488                         int sides = 8;\r
4489 \r
4490                         if (info) return info_damage(dice, sides, 0);\r
4491 \r
4492                         if (cast)\r
4493                         {\r
4494                                 if (!get_aim_dir(&dir)) return NULL;\r
4495 \r
4496                                 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));\r
4497                         }\r
4498                 }\r
4499                 break;\r
4500 \r
4501         case 6:\r
4502                 if (name) return _("古代の死霊召喚", "Summon Manes");\r
4503                 if (desc) return _("古代の死霊を召喚する。", "Summons a manes.");\r
4504     \r
4505                 {\r
4506                         if (cast)\r
4507                         {\r
4508                                 if (!summon_specific(-1, p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET)))\r
4509                                 {\r
4510                                         msg_print(_("古代の死霊は現れなかった。", "No Manes arrive."));\r
4511                                 }\r
4512                         }\r
4513                 }\r
4514                 break;\r
4515 \r
4516         case 7:\r
4517                 if (name) return _("地獄の焔", "Hellish Flame");\r
4518                 if (desc) return _("邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",\r
4519                         "Fires a ball of evil power. Hurts good monsters greatly.");\r
4520     \r
4521                 {\r
4522                         int dice = 3;\r
4523                         int sides = 6;\r
4524                         int rad = (plev < 30) ? 2 : 3;\r
4525                         int base;\r
4526 \r
4527                         if (p_ptr->pclass == CLASS_MAGE ||\r
4528                             p_ptr->pclass == CLASS_HIGH_MAGE ||\r
4529                             p_ptr->pclass == CLASS_SORCERER)\r
4530                                 base = plev + plev / 2;\r
4531                         else\r
4532                                 base = plev + plev / 4;\r
4533 \r
4534 \r
4535                         if (info) return info_damage(dice, sides, base);\r
4536 \r
4537                         if (cast)\r
4538                         {\r
4539                                 if (!get_aim_dir(&dir)) return NULL;\r
4540 \r
4541                                 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides) + base, rad);\r
4542                         }\r
4543                 }\r
4544                 break;\r
4545 \r
4546         case 8:\r
4547                 if (name) return _("デーモン支配", "Dominate Demon");\r
4548                 if (desc) return _("悪魔1体を魅了する。抵抗されると無効", "Attempts to charm a demon.");\r
4549     \r
4550                 {\r
4551                         int power = plev;\r
4552 \r
4553                         if (info) return info_power(power);\r
4554 \r
4555                         if (cast)\r
4556                         {\r
4557                                 if (!get_aim_dir(&dir)) return NULL;\r
4558 \r
4559                                 control_one_demon(dir, power);\r
4560                         }\r
4561                 }\r
4562                 break;\r
4563 \r
4564         case 9:\r
4565                 if (name) return _("ビジョン", "Vision");\r
4566                 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");\r
4567     \r
4568                 {\r
4569                         int rad = DETECT_RAD_MAP;\r
4570 \r
4571                         if (info) return info_radius(rad);\r
4572 \r
4573                         if (cast)\r
4574                         {\r
4575                                 map_area(rad);\r
4576                         }\r
4577                 }\r
4578                 break;\r
4579 \r
4580         case 10:\r
4581                 if (name) return _("耐地獄", "Resist Nether");\r
4582                 if (desc) return _("一定時間、地獄への耐性を得る。", "Gives resistance to nether for a while.");\r
4583     \r
4584                 {\r
4585                         int base = 20;\r
4586 \r
4587                         if (info) return info_duration(base, base);\r
4588 \r
4589                         if (cast)\r
4590                         {\r
4591                                 set_tim_res_nether(randint1(base) + base, FALSE);\r
4592                         }\r
4593                 }\r
4594                 break;\r
4595 \r
4596         case 11:\r
4597                 if (name) return _("プラズマ・ボルト", "Plasma bolt");\r
4598                 if (desc) return _("プラズマのボルトもしくはビームを放つ。", "Fires a bolt or beam of plasma.");\r
4599     \r
4600                 {\r
4601                         int dice = 11 + (plev - 5) / 4;\r
4602                         int sides = 8;\r
4603 \r
4604                         if (info) return info_damage(dice, sides, 0);\r
4605 \r
4606                         if (cast)\r
4607                         {\r
4608                                 if (!get_aim_dir(&dir)) return NULL;\r
4609 \r
4610                                 fire_bolt_or_beam(beam_chance(), GF_PLASMA, dir, damroll(dice, sides));\r
4611                         }\r
4612                 }\r
4613                 break;\r
4614 \r
4615         case 12:\r
4616                 if (name) return _("ファイア・ボール", "Fire Ball");\r
4617                 if (desc) return _("炎の球を放つ。", "Fires a ball of fire.");\r
4618     \r
4619                 {\r
4620                         HIT_POINT dam = plev + 55;\r
4621                         int rad = 2;\r
4622 \r
4623                         if (info) return info_damage(0, 0, dam);\r
4624 \r
4625                         if (cast)\r
4626                         {\r
4627                                 if (!get_aim_dir(&dir)) return NULL;\r
4628 \r
4629                                 fire_ball(GF_FIRE, dir, dam, rad);\r
4630                         }\r
4631                 }\r
4632                 break;\r
4633 \r
4634         case 13:\r
4635                 if (name) return _("炎の刃", "Fire Branding");\r
4636                 if (desc) return _("武器に炎の属性をつける。", "Makes current weapon fire branded.");\r
4637     \r
4638                 {\r
4639                         if (cast)\r
4640                         {\r
4641                                 brand_weapon(1);\r
4642                         }\r
4643                 }\r
4644                 break;\r
4645 \r
4646         case 14:\r
4647                 if (name) return _("地獄球", "Nether Ball");\r
4648                 if (desc) return _("大きな地獄の球を放つ。", "Fires a huge ball of nether.");\r
4649     \r
4650                 {\r
4651                         HIT_POINT dam = plev * 3 / 2 + 100;\r
4652                         int rad = plev / 20 + 2;\r
4653 \r
4654                         if (info) return info_damage(0, 0, dam);\r
4655 \r
4656                         if (cast)\r
4657                         {\r
4658                                 if (!get_aim_dir(&dir)) return NULL;\r
4659 \r
4660                                 fire_ball(GF_NETHER, dir, dam, rad);\r
4661                         }\r
4662                 }\r
4663                 break;\r
4664 \r
4665         case 15:\r
4666                 if (name) return _("デーモン召喚", "Summon Demon");\r
4667                 if (desc) return _("悪魔1体を召喚する。", "Summons a demon.");\r
4668     \r
4669                 {\r
4670                         if (cast)\r
4671                         {\r
4672                                 bool pet = !one_in_(3);\r
4673                                 u32b flg = 0L;\r
4674 \r
4675                                 if (pet) flg |= PM_FORCE_PET;\r
4676                                 else flg |= PM_NO_PET;\r
4677                                 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;\r
4678 \r
4679                                 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, plev*2/3+randint1(plev/2), SUMMON_DEMON, flg))\r
4680                                 {\r
4681                                         msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));\r
4682 \r
4683                                         if (pet)\r
4684                                         {\r
4685                                                 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));\r
4686                                         }\r
4687                                         else\r
4688                                         {\r
4689                                                 msg_print(_("「卑しき者よ、我は汝の下僕にあらず! お前の魂を頂くぞ!」",\r
4690                                                                         "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));\r
4691                                         }\r
4692                                 }\r
4693                                 else\r
4694                                 {\r
4695                                         msg_print(_("悪魔は現れなかった。", "No demons arrive."));\r
4696                                 }\r
4697                                 break;\r
4698                         }\r
4699                 }\r
4700                 break;\r
4701 \r
4702         case 16:\r
4703                 if (name) return _("悪魔の目", "Devilish Eye");\r
4704                 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");\r
4705     \r
4706                 {\r
4707                         int base = 30;\r
4708                         int sides = 25;\r
4709 \r
4710                         if (info) return info_duration(base, sides);\r
4711 \r
4712                         if (cast)\r
4713                         {\r
4714                                 set_tim_esp(randint1(sides) + base, FALSE);\r
4715                         }\r
4716                 }\r
4717                 break;\r
4718 \r
4719         case 17:\r
4720                 if (name) return _("悪魔のクローク", "Devil Cloak");\r
4721                 if (desc) return _("恐怖を取り除き、一定時間、炎と冷気の耐性、炎のオーラを得る。耐性は装備による耐性に累積する。", \r
4722                         "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
4723     \r
4724                 {\r
4725                         TIME_EFFECT base = 20;\r
4726 \r
4727                         if (info) return info_duration(base, base);\r
4728 \r
4729                         if (cast)\r
4730                         {\r
4731                                 TIME_EFFECT dur = randint1(base) + base;\r
4732                                         \r
4733                                 set_oppose_fire(dur, FALSE);\r
4734                                 set_oppose_cold(dur, FALSE);\r
4735                                 set_tim_sh_fire(dur, FALSE);\r
4736                                 set_afraid(0);\r
4737                                 break;\r
4738                         }\r
4739                 }\r
4740                 break;\r
4741 \r
4742         case 18:\r
4743                 if (name) return _("溶岩流", "The Flow of Lava");\r
4744                 if (desc) return _("自分を中心とした炎の球を作り出し、床を溶岩に変える。", \r
4745                         "Generates a ball of fire centered on you which transforms floors to magma.");\r
4746     \r
4747                 {\r
4748                         HIT_POINT dam = (55 + plev) * 2;\r
4749                         int rad = 3;\r
4750 \r
4751                         if (info) return info_damage(0, 0, dam/2);\r
4752 \r
4753                         if (cast)\r
4754                         {\r
4755                                 fire_ball(GF_FIRE, 0, dam, rad);\r
4756                                 fire_ball_hide(GF_LAVA_FLOW, 0, 2 + randint1(2), rad);\r
4757                         }\r
4758                 }\r
4759                 break;\r
4760 \r
4761         case 19:\r
4762                 if (name) return _("プラズマ球", "Plasma Ball");\r
4763                 if (desc) return _("プラズマの球を放つ。", "Fires a ball of plasma.");\r
4764     \r
4765                 {\r
4766                         HIT_POINT dam = plev * 3 / 2 + 80;\r
4767                         int rad = 2 + plev / 40;\r
4768 \r
4769                         if (info) return info_damage(0, 0, dam);\r
4770 \r
4771                         if (cast)\r
4772                         {\r
4773                                 if (!get_aim_dir(&dir)) return NULL;\r
4774 \r
4775                                 fire_ball(GF_PLASMA, dir, dam, rad);\r
4776                         }\r
4777                 }\r
4778                 break;\r
4779 \r
4780         case 20:\r
4781                 if (name) return _("悪魔変化", "Polymorph Demon");\r
4782                 if (desc) return _("一定時間、悪魔に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔としての能力を得る。", \r
4783                         "Mimic a demon for a while. Loses abilities of original race and gets abilities as a demon.");\r
4784     \r
4785                 {\r
4786                         int base = 10 + plev / 2;\r
4787 \r
4788                         if (info) return info_duration(base, base);\r
4789 \r
4790                         if (cast)\r
4791                         {\r
4792                                 set_mimic(base + randint1(base), MIMIC_DEMON, FALSE);\r
4793                         }\r
4794                 }\r
4795                 break;\r
4796 \r
4797         case 21:\r
4798                 if (name) return _("地獄の波動", "Nather Wave");\r
4799                 if (desc) return _("視界内の全てのモンスターにダメージを与える。善良なモンスターに特に大きなダメージを与える。", \r
4800                         "Damages all monsters in sight. Hurts good monsters greatly.");\r
4801     \r
4802                 {\r
4803                         int sides1 = plev * 2;\r
4804                         int sides2 = plev * 2;\r
4805 \r
4806                         if (info) return format("%sd%d+d%d", s_dam, sides1, sides2);\r
4807 \r
4808                         if (cast)\r
4809                         {\r
4810                                 dispel_monsters(randint1(sides1));\r
4811                                 dispel_good(randint1(sides2));\r
4812                         }\r
4813                 }\r
4814                 break;\r
4815 \r
4816         case 22:\r
4817                 if (name) return _("サキュバスの接吻", "Kiss of Succubus");\r
4818                 if (desc) return _("因果混乱の球を放つ。", "Fires a ball of nexus.");\r
4819     \r
4820                 {\r
4821                         HIT_POINT dam = 100 + plev * 2;\r
4822                         int rad = 4;\r
4823 \r
4824                         if (info) return info_damage(0, 0, dam);\r
4825 \r
4826                         if (cast)\r
4827                         {\r
4828                                 if (!get_aim_dir(&dir)) return NULL;\r
4829                                 fire_ball(GF_NEXUS, dir, dam, rad);\r
4830                         }\r
4831                 }\r
4832                 break;\r
4833 \r
4834         case 23:\r
4835                 if (name) return _("破滅の手", "Doom Hand");\r
4836                 if (desc) return _("破滅の手を放つ。食らったモンスターはそのときのHPの半分前後のダメージを受ける。", "Attempts to make a monster's HP almost half.");\r
4837     \r
4838                 {\r
4839                         if (cast)\r
4840                         {\r
4841                                 if (!get_aim_dir(&dir))\r
4842                                         return NULL;\r
4843                                 else \r
4844                                         msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));\r
4845                                 \r
4846                                 fire_ball_hide(GF_HAND_DOOM, dir, plev * 2, 0);\r
4847                         }\r
4848                 }\r
4849                 break;\r
4850 \r
4851         case 24:\r
4852                 if (name) return _("士気高揚", "Raise the Morale");\r
4853                 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");\r
4854     \r
4855                 {\r
4856                         int base = 25;\r
4857 \r
4858                         if (info) return info_duration(base, base);\r
4859 \r
4860                         if (cast)\r
4861                         {\r
4862                                 set_hero(randint1(base) + base, FALSE);\r
4863                                 hp_player(10);\r
4864                                 set_afraid(0);\r
4865                         }\r
4866                 }\r
4867                 break;\r
4868 \r
4869         case 25:\r
4870                 if (name) return _("不滅の肉体", "Immortal Body");\r
4871                 if (desc) return _("一定時間、時間逆転への耐性を得る。", "Gives resistance to time for a while.");\r
4872     \r
4873                 {\r
4874                         int base = 20;\r
4875 \r
4876                         if (info) return info_duration(base, base);\r
4877 \r
4878                         if (cast)\r
4879                         {\r
4880                                 set_tim_res_time(randint1(base)+base, FALSE);\r
4881                         }\r
4882                 }\r
4883                 break;\r
4884 \r
4885         case 26:\r
4886                 if (name) return _("狂気の円環", "Insanity Circle");\r
4887                 if (desc) return _("自分を中心としたカオスの球、混乱の球を発生させ、近くのモンスターを魅了する。", \r
4888                         "Generate balls of chaos, confusion and charm centered on you.");\r
4889     \r
4890                 {\r
4891                         HIT_POINT dam = 50 + plev;\r
4892                         int power = 20 + plev;\r
4893                         int rad = 3 + plev / 20;\r
4894 \r
4895                         if (info) return format("%s%d+%d", s_dam, dam/2, dam/2);\r
4896 \r
4897                         if (cast)\r
4898                         {\r
4899                                 fire_ball(GF_CHAOS, 0, dam, rad);\r
4900                                 fire_ball(GF_CONFUSION, 0, dam, rad);\r
4901                                 fire_ball(GF_CHARM, 0, power, rad);\r
4902                         }\r
4903                 }\r
4904                 break;\r
4905 \r
4906         case 27:\r
4907                 if (name) return _("ペット爆破", "Explode Pets");\r
4908                 if (desc) return _("全てのペットを強制的に爆破させる。", "Makes all pets explode.");\r
4909     \r
4910                 {\r
4911                         if (cast)\r
4912                         {\r
4913                                 discharge_minion();\r
4914                         }\r
4915                 }\r
4916                 break;\r
4917 \r
4918         case 28:\r
4919                 if (name) return _("グレーターデーモン召喚", "Summon Greater Demon");\r
4920                 if (desc) return _("上級デーモンを召喚する。召喚するには人間('p','h','t'で表されるモンスター)の死体を捧げなければならない。", \r
4921                         "Summons greater demon. It need to sacrifice a corpse of human ('p','h' or 't').");\r
4922     \r
4923                 {\r
4924                         if (cast)\r
4925                         {\r
4926                                 if (!cast_summon_greater_demon()) return NULL;\r
4927                         }\r
4928                 }\r
4929                 break;\r
4930 \r
4931         case 29:\r
4932                 if (name) return _("地獄嵐", "Nether Storm");\r
4933                 if (desc) return _("超巨大な地獄の球を放つ。", "Generate a huge ball of nether.");\r
4934     \r
4935                 {\r
4936                         HIT_POINT dam = plev * 15;\r
4937                         int rad = plev / 5;\r
4938 \r
4939                         if (info) return info_damage(0, 0, dam);\r
4940 \r
4941                         if (cast)\r
4942                         {\r
4943                                 if (!get_aim_dir(&dir)) return NULL;\r
4944 \r
4945                                 fire_ball(GF_NETHER, dir, dam, rad);\r
4946                         }\r
4947                 }\r
4948                 break;\r
4949 \r
4950         case 30:\r
4951                 if (name) return _("血の呪い", "Bloody Curse");\r
4952                 if (desc) return _("自分がダメージを受けることによって対象に呪いをかけ、ダメージを与え様々な効果を引き起こす。",\r
4953                         "Puts blood curse which damages and causes various effects on a monster. You also take damage.");\r
4954     \r
4955                 {\r
4956                         HIT_POINT dam = 600;\r
4957                         int rad = 0;\r
4958 \r
4959                         if (info) return info_damage(0, 0, dam);\r
4960 \r
4961                         if (cast)\r
4962                         {\r
4963                                 if (!get_aim_dir(&dir)) return NULL;\r
4964 \r
4965                                 fire_ball_hide(GF_BLOOD_CURSE, dir, dam, rad);\r
4966                                 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("血の呪い", "Blood curse"), -1);\r
4967                         }\r
4968                 }\r
4969                 break;\r
4970 \r
4971         case 31:\r
4972                 if (name) return _("魔王変化", "Polymorph Demonlord");\r
4973                 if (desc) return _("悪魔の王に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔の王としての能力を得、壁を破壊しながら歩く。",\r
4974                         "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
4975     \r
4976                 {\r
4977                         int base = 15;\r
4978 \r
4979                         if (info) return info_duration(base, base);\r
4980 \r
4981                         if (cast)\r
4982                         {\r
4983                                 set_mimic(base + randint1(base), MIMIC_DEMON_LORD, FALSE);\r
4984                         }\r
4985                 }\r
4986                 break;\r
4987         }\r
4988 \r
4989         return "";\r
4990 }\r
4991 \r
4992 /*!\r
4993  * @brief 破邪領域魔法の各処理を行う\r
4994  * @param spell 魔法ID\r
4995  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)\r
4996  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。\r
4997  */\r
4998 static cptr do_crusade_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
4999 {\r
5000         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
5001         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
5002         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
5003         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
5004 \r
5005         int dir;\r
5006         int plev = p_ptr->lev;\r
5007 \r
5008         switch (spell)\r
5009         {\r
5010         case 0:\r
5011                 if (name) return _("懲罰", "Punishment");\r
5012                 if (desc) return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");\r
5013     \r
5014                 {\r
5015                         int dice = 3 + (plev - 1) / 5;\r
5016                         int sides = 4;\r
5017 \r
5018                         if (info) return info_damage(dice, sides, 0);\r
5019 \r
5020                         if (cast)\r
5021                         {\r
5022                                 if (!get_aim_dir(&dir)) return NULL;\r
5023 \r
5024                                 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));\r
5025                         }\r
5026                 }\r
5027                 break;\r
5028 \r
5029         case 1:\r
5030                 if (name) return _("邪悪存在感知", "Detect Evil");\r
5031                 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");\r
5032     \r
5033                 {\r
5034                         int rad = DETECT_RAD_DEFAULT;\r
5035 \r
5036                         if (info) return info_radius(rad);\r
5037 \r
5038                         if (cast)\r
5039                         {\r
5040                                 detect_monsters_evil(rad);\r
5041                         }\r
5042                 }\r
5043                 break;\r
5044 \r
5045         case 2:\r
5046                 if (name) return _("恐怖除去", "Remove Fear");\r
5047                 if (desc) return _("恐怖を取り除く。", "Removes fear.");\r
5048     \r
5049                 {\r
5050                         if (cast)\r
5051                         {\r
5052                                 set_afraid(0);\r
5053                         }\r
5054                 }\r
5055                 break;\r
5056 \r
5057         case 3:\r
5058                 if (name) return _("威圧", "Scare Monster");\r
5059                 if (desc) return _("モンスター1体を恐怖させる。抵抗されると無効。", "Attempts to scare a monster.");\r
5060     \r
5061                 {\r
5062                         int power = plev;\r
5063 \r
5064                         if (info) return info_power(power);\r
5065 \r
5066                         if (cast)\r
5067                         {\r
5068                                 if (!get_aim_dir(&dir)) return NULL;\r
5069 \r
5070                                 fear_monster(dir, power);\r
5071                         }\r
5072                 }\r
5073                 break;\r
5074 \r
5075         case 4:\r
5076                 if (name) return _("聖域", "Sanctuary");\r
5077                 if (desc) return _("隣接した全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep monsters in the adjacent squares.");\r
5078     \r
5079                 {\r
5080                         int power = plev;\r
5081 \r
5082                         if (info) return info_power(power);\r
5083 \r
5084                         if (cast)\r
5085                         {\r
5086                                 sleep_monsters_touch();\r
5087                         }\r
5088                 }\r
5089                 break;\r
5090 \r
5091         case 5:\r
5092                 if (name) return _("入口", "Portal");\r
5093                 if (desc) return _("中距離のテレポートをする。", "Teleport medium distance.");\r
5094     \r
5095                 {\r
5096                         POSITION range = 25 + plev / 2;\r
5097 \r
5098                         if (info) return info_range(range);\r
5099 \r
5100                         if (cast)\r
5101                         {\r
5102                                 teleport_player(range, 0L);\r
5103                         }\r
5104                 }\r
5105                 break;\r
5106 \r
5107         case 6:\r
5108                 if (name) return _("スターダスト", "Star Dust");\r
5109                 if (desc) return _("ターゲット付近に閃光のボルトを連射する。", "Fires many bolts of light near the target.");\r
5110     \r
5111                 {\r
5112                         int dice = 3 + (plev - 1) / 9;\r
5113                         int sides = 2;\r
5114 \r
5115                         if (info) return info_multi_damage_dice(dice, sides);\r
5116 \r
5117                         if (cast)\r
5118                         {\r
5119                                 if (!get_aim_dir(&dir)) return NULL;\r
5120                                 fire_blast(GF_LITE, dir, dice, sides, 10, 3);\r
5121                         }\r
5122                 }\r
5123                 break;\r
5124 \r
5125         case 7:\r
5126                 if (name) return _("身体浄化", "Purify");\r
5127                 if (desc) return _("傷、毒、朦朧から全快する。", "Heals all cut, stun and poison status.");\r
5128     \r
5129                 {\r
5130                         if (cast)\r
5131                         {\r
5132                                 set_cut(0);\r
5133                                 set_poisoned(0);\r
5134                                 set_stun(0);\r
5135                         }\r
5136                 }\r
5137                 break;\r
5138 \r
5139         case 8:\r
5140                 if (name) return _("邪悪飛ばし", "Scatter Evil");\r
5141                 if (desc) return _("邪悪なモンスター1体をテレポートさせる。抵抗されると無効。", "Attempts to teleport an evil monster away.");\r
5142     \r
5143                 {\r
5144                         int power = MAX_SIGHT * 5;\r
5145 \r
5146                         if (info) return info_power(power);\r
5147 \r
5148                         if (cast)\r
5149                         {\r
5150                                 if (!get_aim_dir(&dir)) return NULL;\r
5151                                 fire_ball(GF_AWAY_EVIL, dir, power, 0);\r
5152                         }\r
5153                 }\r
5154                 break;\r
5155 \r
5156         case 9:\r
5157                 if (name) return _("聖なる光球", "Holy Orb");\r
5158                 if (desc) return _("聖なる力をもつ宝珠を放つ。邪悪なモンスターに対して大きなダメージを与えるが、善良なモンスターには効果がない。", \r
5159                         "Fires a ball with holy power. Hurts evil monsters greatly, but don't effect good monsters.");\r
5160     \r
5161                 {\r
5162                         int dice = 3;\r
5163                         int sides = 6;\r
5164                         int rad = (plev < 30) ? 2 : 3;\r
5165                         int base;\r
5166 \r
5167                         if (p_ptr->pclass == CLASS_PRIEST ||\r
5168                             p_ptr->pclass == CLASS_HIGH_MAGE ||\r
5169                             p_ptr->pclass == CLASS_SORCERER)\r
5170                                 base = plev + plev / 2;\r
5171                         else\r
5172                                 base = plev + plev / 4;\r
5173 \r
5174 \r
5175                         if (info) return info_damage(dice, sides, base);\r
5176 \r
5177                         if (cast)\r
5178                         {\r
5179                                 if (!get_aim_dir(&dir)) return NULL;\r
5180 \r
5181                                 fire_ball(GF_HOLY_FIRE, dir, damroll(dice, sides) + base, rad);\r
5182                         }\r
5183                 }\r
5184                 break;\r
5185 \r
5186         case 10:\r
5187                 if (name) return _("悪魔払い", "Exorcism");\r
5188                 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与え、邪悪なモンスターを恐怖させる。", \r
5189                         "Damages all undead and demons in sight, and scares all evil monsters in sight.");\r
5190     \r
5191                 {\r
5192                         int sides = plev;\r
5193                         int power = plev;\r
5194 \r
5195                         if (info) return info_damage(1, sides, 0);\r
5196 \r
5197                         if (cast)\r
5198                         {\r
5199                                 dispel_undead(randint1(sides));\r
5200                                 dispel_demons(randint1(sides));\r
5201                                 turn_evil(power);\r
5202                         }\r
5203                 }\r
5204                 break;\r
5205 \r
5206         case 11:\r
5207                 if (name) return _("解呪", "Remove Curse");\r
5208                 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");\r
5209     \r
5210                 {\r
5211                         if (cast)\r
5212                         {\r
5213                                 if (remove_curse())\r
5214                                 {\r
5215                                         msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));\r
5216                                 }\r
5217                         }\r
5218                 }\r
5219                 break;\r
5220 \r
5221         case 12:\r
5222                 if (name) return _("透明視認", "Sense Unseen");\r
5223                 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");\r
5224     \r
5225                 {\r
5226                         int base = 24;\r
5227 \r
5228                         if (info) return info_duration(base, base);\r
5229 \r
5230                         if (cast)\r
5231                         {\r
5232                                 set_tim_invis(randint1(base) + base, FALSE);\r
5233                         }\r
5234                 }\r
5235                 break;\r
5236 \r
5237         case 13:\r
5238                 if (name) return _("対邪悪結界", "Protection from Evil");\r
5239                 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");\r
5240     \r
5241                 {\r
5242                         int base = 25;\r
5243                         int sides = 3 * plev;\r
5244 \r
5245                         if (info) return info_duration(base, sides);\r
5246 \r
5247                         if (cast)\r
5248                         {\r
5249                                 set_protevil(randint1(sides) + base, FALSE);\r
5250                         }\r
5251                 }\r
5252                 break;\r
5253 \r
5254         case 14:\r
5255                 if (name) return _("裁きの雷", "Judgment Thunder");\r
5256                 if (desc) return _("強力な電撃のボルトを放つ。", "Fires a powerful bolt of lightning.");\r
5257     \r
5258                 {\r
5259                         HIT_POINT dam = plev * 5;\r
5260 \r
5261                         if (info) return info_damage(0, 0, dam);\r
5262 \r
5263                         if (cast)\r
5264                         {\r
5265                                 if (!get_aim_dir(&dir)) return NULL;\r
5266                                 fire_bolt(GF_ELEC, dir, dam);\r
5267                         }\r
5268                 }\r
5269                 break;\r
5270 \r
5271         case 15:\r
5272                 if (name) return _("聖なる御言葉", "Holy Word");\r
5273                 if (desc) return _("視界内の邪悪な存在に大きなダメージを与え、体力を回復し、毒、恐怖、朦朧状態、負傷から全快する。",\r
5274                         "Damages all evil monsters in sight, heals HP somewhat, and completely heals poison, fear, stun and cut status.");\r
5275     \r
5276                 {\r
5277                         int dam_sides = plev * 6;\r
5278                         int heal = 100;\r
5279 \r
5280                         if (info) return format(_("損:1d%d/回%d", "dam:d%d/h%d"), dam_sides, heal);\r
5281                         if (cast)\r
5282                         {\r
5283                                 dispel_evil(randint1(dam_sides));\r
5284                                 hp_player(heal);\r
5285                                 set_afraid(0);\r
5286                                 set_poisoned(0);\r
5287                                 set_stun(0);\r
5288                                 set_cut(0);\r
5289                         }\r
5290                 }\r
5291                 break;\r
5292 \r
5293         case 16:\r
5294                 if (name) return _("開かれた道", "Unbarring Ways");\r
5295                 if (desc) return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");\r
5296     \r
5297                 {\r
5298                         if (cast)\r
5299                         {\r
5300                                 if (!get_aim_dir(&dir)) return NULL;\r
5301 \r
5302                                 destroy_door(dir);\r
5303                         }\r
5304                 }\r
5305                 break;\r
5306 \r
5307         case 17:\r
5308                 if (name) return _("封魔", "Arrest");\r
5309                 if (desc) return _("邪悪なモンスターの動きを止める。", "Attempts to paralyze an evil monster.");\r
5310     \r
5311                 {\r
5312                         int power = plev * 2;\r
5313 \r
5314                         if (info) return info_power(power);\r
5315 \r
5316                         if (cast)\r
5317                         {\r
5318                                 if (!get_aim_dir(&dir)) return NULL;\r
5319                                 stasis_evil(dir);\r
5320                         }\r
5321                 }\r
5322                 break;\r
5323 \r
5324         case 18:\r
5325                 if (name) return _("聖なるオーラ", "Holy Aura");\r
5326                 if (desc) return _("一定時間、邪悪なモンスターを傷つける聖なるオーラを得る。",\r
5327                         "Gives aura of holy power which injures evil monsters which attacked you for a while.");\r
5328     \r
5329                 {\r
5330                         int base = 20;\r
5331 \r
5332                         if (info) return info_duration(base, base);\r
5333 \r
5334                         if (cast)\r
5335                         {\r
5336                                 set_tim_sh_holy(randint1(base) + base, FALSE);\r
5337                         }\r
5338                 }\r
5339                 break;\r
5340 \r
5341         case 19:\r
5342                 if (name) return _("アンデッド&悪魔退散", "Dispel Undead & Demons");\r
5343                 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与える。", "Damages all undead and demons in sight.");\r
5344     \r
5345                 {\r
5346                         int sides = plev * 4;\r
5347 \r
5348                         if (info) return info_damage(1, sides, 0);\r
5349 \r
5350                         if (cast)\r
5351                         {\r
5352                                 dispel_undead(randint1(sides));\r
5353                                 dispel_demons(randint1(sides));\r
5354                         }\r
5355                 }\r
5356                 break;\r
5357 \r
5358         case 20:\r
5359                 if (name) return _("邪悪退散", "Dispel Evil");\r
5360                 if (desc) return _("視界内の全ての邪悪なモンスターにダメージを与える。", "Damages all evil monsters in sight.");\r
5361     \r
5362                 {\r
5363                         int sides = plev * 4;\r
5364 \r
5365                         if (info) return info_damage(1, sides, 0);\r
5366 \r
5367                         if (cast)\r
5368                         {\r
5369                                 dispel_evil(randint1(sides));\r
5370                         }\r
5371                 }\r
5372                 break;\r
5373 \r
5374         case 21:\r
5375                 if (name) return _("聖なる刃", "Holy Blade");\r
5376                 if (desc) return _("通常の武器に滅邪の属性をつける。", "Makes current weapon especially deadly against evil monsters.");\r
5377     \r
5378                 {\r
5379                         if (cast)\r
5380                         {\r
5381                                 brand_weapon(13);\r
5382                         }\r
5383                 }\r
5384                 break;\r
5385 \r
5386         case 22:\r
5387                 if (name) return _("スターバースト", "Star Burst");\r
5388                 if (desc) return _("巨大な閃光の球を放つ。", "Fires a huge ball of powerful light.");\r
5389     \r
5390                 {\r
5391                         HIT_POINT dam = 100 + plev * 2;\r
5392                         int rad = 4;\r
5393 \r
5394                         if (info) return info_damage(0, 0, dam);\r
5395 \r
5396                         if (cast)\r
5397                         {\r
5398                                 if (!get_aim_dir(&dir)) return NULL;\r
5399 \r
5400                                 fire_ball(GF_LITE, dir, dam, rad);\r
5401                         }\r
5402                 }\r
5403                 break;\r
5404 \r
5405         case 23:\r
5406                 if (name) return _("天使召喚", "Summon Angel");\r
5407                 if (desc) return _("天使を1体召喚する。", "Summons an angel.");\r
5408     \r
5409                 {\r
5410                         if (cast)\r
5411                         {\r
5412                                 bool pet = !one_in_(3);\r
5413                                 u32b flg = 0L;\r
5414 \r
5415                                 if (pet) flg |= PM_FORCE_PET;\r
5416                                 else flg |= PM_NO_PET;\r
5417                                 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;\r
5418 \r
5419                                 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_ANGEL, flg))\r
5420                                 {\r
5421                                         if (pet)\r
5422                                         {\r
5423                                                 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));\r
5424                                         }\r
5425                                         else\r
5426                                         {\r
5427                                                 msg_print(_("「我は汝の下僕にあらず! 悪行者よ、悔い改めよ!」", "Mortal! Repent of thy impiousness."));\r
5428                                         }\r
5429                                 }\r
5430                         }\r
5431                 }\r
5432                 break;\r
5433 \r
5434         case 24:\r
5435                 if (name) return _("士気高揚", "Heroism");\r
5436                 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");\r
5437     \r
5438                 {\r
5439                         int base = 25;\r
5440 \r
5441                         if (info) return info_duration(base, base);\r
5442 \r
5443                         if (cast)\r
5444                         {\r
5445                                 set_hero(randint1(base) + base, FALSE);\r
5446                                 hp_player(10);\r
5447                                 set_afraid(0);\r
5448                         }\r
5449                 }\r
5450                 break;\r
5451 \r
5452         case 25:\r
5453                 if (name) return _("呪い退散", "Dispel Curse");\r
5454                 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");\r
5455     \r
5456                 {\r
5457                         if (cast)\r
5458                         {\r
5459                                 if (remove_all_curse())\r
5460                                 {\r
5461                                         msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));\r
5462                                 }\r
5463                         }\r
5464                 }\r
5465                 break;\r
5466 \r
5467         case 26:\r
5468                 if (name) return _("邪悪追放", "Banish Evil");\r
5469                 if (desc) return _("視界内の全ての邪悪なモンスターをテレポートさせる。抵抗されると無効。", \r
5470                         "Teleports all evil monsters in sight away unless resisted.");\r
5471     \r
5472                 {\r
5473                         int power = 100;\r
5474 \r
5475                         if (info) return info_power(power);\r
5476 \r
5477                         if (cast)\r
5478                         {\r
5479                                 if (banish_evil(power))\r
5480                                 {\r
5481                                         msg_print(_("神聖な力が邪悪を打ち払った!", "The holy power banishes evil!"));\r
5482                                 }\r
5483                         }\r
5484                 }\r
5485                 break;\r
5486 \r
5487         case 27:\r
5488                 if (name) return _("ハルマゲドン", "Armageddon");\r
5489                 if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroy everything in nearby area.");\r
5490     \r
5491                 {\r
5492                         int base = 12;\r
5493                         int sides = 4;\r
5494 \r
5495                         if (cast)\r
5496                         {\r
5497                                 destroy_area(p_ptr->y, p_ptr->x, base + randint1(sides), FALSE);\r
5498                         }\r
5499                 }\r
5500                 break;\r
5501 \r
5502         case 28:\r
5503                 if (name) return _("目には目を", "An Eye for an Eye");\r
5504                 if (desc) return _("一定時間、自分がダメージを受けたときに攻撃を行ったモンスターに対して同等のダメージを与える。", \r
5505                         "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
5506     \r
5507                 {\r
5508                         int base = 10;\r
5509 \r
5510                         if (info) return info_duration(base, base);\r
5511 \r
5512                         if (cast)\r
5513                         {\r
5514                                 set_tim_eyeeye(randint1(base) + base, FALSE);\r
5515                         }\r
5516                 }\r
5517                 break;\r
5518 \r
5519         case 29:\r
5520                 if (name) return _("神の怒り", "Wrath of the God");\r
5521                 if (desc) return _("ターゲットの周囲に分解の球を多数落とす。", "Drops many balls of disintegration near the target.");\r
5522     \r
5523                 {\r
5524                         HIT_POINT dam = plev * 3 + 25;\r
5525                         int rad = 2;\r
5526 \r
5527                         if (info) return info_multi_damage(dam);\r
5528 \r
5529                         if (cast)\r
5530                         {\r
5531                                 if (!cast_wrath_of_the_god(dam, rad)) return NULL;\r
5532                         }\r
5533                 }\r
5534                 break;\r
5535 \r
5536         case 30:\r
5537                 if (name) return _("神威", "Divine Intervention");\r
5538                 if (desc) return _("隣接するモンスターに聖なるダメージを与え、視界内のモンスターにダメージ、減速、朦朧、混乱、恐怖、眠りを与える。さらに体力を回復する。", \r
5539                         "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
5540     \r
5541                 {\r
5542                         int b_dam = plev * 11;\r
5543                         int d_dam = plev * 4;\r
5544                         int heal = 100;\r
5545                         int power = plev * 4;\r
5546 \r
5547                         if (info) return format(_("回%d/損%d+%d", "h%d/dm%d+%d"), heal, d_dam, b_dam/2);\r
5548                         if (cast)\r
5549                         {\r
5550                                 project(0, 1, p_ptr->y, p_ptr->x, b_dam, GF_HOLY_FIRE, PROJECT_KILL, -1);\r
5551                                 dispel_monsters(d_dam);\r
5552                                 slow_monsters(plev);\r
5553                                 stun_monsters(power);\r
5554                                 confuse_monsters(power);\r
5555                                 turn_monsters(power);\r
5556                                 stasis_monsters(power);\r
5557                                 hp_player(heal);\r
5558                         }\r
5559                 }\r
5560                 break;\r
5561 \r
5562         case 31:\r
5563                 if (name) return _("聖戦", "Crusade");\r
5564                 if (desc) return _("視界内の善良なモンスターをペットにしようとし、ならなかった場合及び善良でないモンスターを恐怖させる。さらに多数の加速された騎士を召喚し、ヒーロー、祝福、加速、対邪悪結界を得る。", \r
5565                         "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
5566     \r
5567                 {\r
5568                         if (cast)\r
5569                         {\r
5570                                 int base = 25;\r
5571                                 int sp_sides = 20 + plev;\r
5572                                 int sp_base = plev;\r
5573 \r
5574                                 int i;\r
5575                                 crusade();\r
5576                                 for (i = 0; i < 12; i++)\r
5577                                 {\r
5578                                         int attempt = 10;\r
5579                                         POSITION my = 0, mx = 0;\r
5580 \r
5581                                         while (attempt--)\r
5582                                         {\r
5583                                                 scatter(&my, &mx, p_ptr->y, p_ptr->x, 4, 0);\r
5584 \r
5585                                                 /* Require empty grids */\r
5586                                                 if (cave_empty_bold2(my, mx)) break;\r
5587                                         }\r
5588                                         if (attempt < 0) continue;\r
5589                                         summon_specific(-1, my, mx, plev, SUMMON_KNIGHTS, (PM_ALLOW_GROUP | PM_FORCE_PET | PM_HASTE));\r
5590                                 }\r
5591                                 set_hero(randint1(base) + base, FALSE);\r
5592                                 set_blessed(randint1(base) + base, FALSE);\r
5593                                 set_fast(randint1(sp_sides) + sp_base, FALSE);\r
5594                                 set_protevil(randint1(base) + base, FALSE);\r
5595                                 set_afraid(0);\r
5596                         }\r
5597                 }\r
5598                 break;\r
5599         }\r
5600 \r
5601         return "";\r
5602 }\r
5603 \r
5604 \r
5605 /*!\r
5606  * @brief 歌の各処理を行う\r
5607  * @param spell 歌ID\r
5608  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP)\r
5609  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。\r
5610  */\r
5611 static cptr do_music_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
5612 {\r
5613         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
5614         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
5615         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
5616         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
5617         bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;\r
5618         bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;\r
5619         bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;\r
5620         static const char s_dam[] = _("損傷:", "dam ");\r
5621 \r
5622         int dir;\r
5623         int plev = p_ptr->lev;\r
5624 \r
5625         switch (spell)\r
5626         {\r
5627         case 0:\r
5628                 if (name) return _("遅鈍の歌", "Song of Holding");\r
5629                 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");\r
5630     \r
5631                 /* Stop singing before start another */\r
5632                 if (cast || fail) stop_singing();\r
5633 \r
5634                 if (cast)\r
5635                 {\r
5636                         msg_print(_("ゆっくりとしたメロディを口ずさみ始めた...", "You start humming a slow, steady melody..."));\r
5637                         start_singing(spell, MUSIC_SLOW);\r
5638                 }\r
5639 \r
5640                 {\r
5641                         int power = plev;\r
5642 \r
5643                         if (info) return info_power(power);\r
5644 \r
5645                         if (cont)\r
5646                         {\r
5647                                 slow_monsters(plev);\r
5648                         }\r
5649                 }\r
5650                 break;\r
5651 \r
5652         case 1:\r
5653                 if (name) return _("祝福の歌", "Song of Blessing");\r
5654                 if (desc) return _("命中率とACのボーナスを得る。", "Gives bonus to hit and AC for a few turns.");\r
5655     \r
5656                 /* Stop singing before start another */\r
5657                 if (cast || fail) stop_singing();\r
5658 \r
5659                 if (cast)\r
5660                 {\r
5661                         msg_print(_("厳かなメロディを奏で始めた...", "The holy power of the Music of the Ainur enters you..."));\r
5662                         start_singing(spell, MUSIC_BLESS);\r
5663                 }\r
5664 \r
5665                 if (stop)\r
5666                 {\r
5667                         if (!p_ptr->blessed)\r
5668                         {\r
5669                                 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));\r
5670                         }\r
5671                 }\r
5672 \r
5673                 break;\r
5674 \r
5675         case 2:\r
5676                 if (name) return _("崩壊の音色", "Wrecking Note");\r
5677                 if (desc) return _("轟音のボルトを放つ。", "Fires a bolt of sound.");\r
5678     \r
5679                 /* Stop singing before start another */\r
5680                 if (cast || fail) stop_singing();\r
5681 \r
5682                 {\r
5683                         int dice = 4 + (plev - 1) / 5;\r
5684                         int sides = 4;\r
5685 \r
5686                         if (info) return info_damage(dice, sides, 0);\r
5687 \r
5688                         if (cast)\r
5689                         {\r
5690                                 if (!get_aim_dir(&dir)) return NULL;\r
5691 \r
5692                                 fire_bolt(GF_SOUND, dir, damroll(dice, sides));\r
5693                         }\r
5694                 }\r
5695                 break;\r
5696 \r
5697         case 3:\r
5698                 if (name) return _("朦朧の旋律", "Stun Pattern");\r
5699                 if (desc) return _("視界内の全てのモンスターを朦朧させる。抵抗されると無効。", "Attempts to stun all monsters in sight.");\r
5700     \r
5701                 /* Stop singing before start another */\r
5702                 if (cast || fail) stop_singing();\r
5703 \r
5704                 if (cast)\r
5705                 {\r
5706                         msg_print(_("眩惑させるメロディを奏で始めた...", "You weave a pattern of sounds to bewilder and daze..."));\r
5707                         start_singing(spell, MUSIC_STUN);\r
5708                 }\r
5709 \r
5710                 {\r
5711                         int dice = plev / 10;\r
5712                         int sides = 2;\r
5713 \r
5714                         if (info) return info_power_dice(dice, sides);\r
5715 \r
5716                         if (cont)\r
5717                         {\r
5718                                 stun_monsters(damroll(dice, sides));\r
5719                         }\r
5720                 }\r
5721 \r
5722                 break;\r
5723 \r
5724         case 4:\r
5725                 if (name) return _("生命の流れ", "Flow of Life");\r
5726                 if (desc) return _("体力を少し回復させる。", "Heals HP a little.");\r
5727     \r
5728                 /* Stop singing before start another */\r
5729                 if (cast || fail) stop_singing();\r
5730 \r
5731                 if (cast)\r
5732                 {\r
5733                         msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing a song of healing..."));\r
5734                         start_singing(spell, MUSIC_L_LIFE);\r
5735                 }\r
5736 \r
5737                 {\r
5738                         int dice = 2;\r
5739                         int sides = 6;\r
5740 \r
5741                         if (info) return info_heal(dice, sides, 0);\r
5742 \r
5743                         if (cont)\r
5744                         {\r
5745                                 hp_player(damroll(dice, sides));\r
5746                         }\r
5747                 }\r
5748 \r
5749                 break;\r
5750 \r
5751         case 5:\r
5752                 if (name) return _("太陽の歌", "Song of the Sun");\r
5753                 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");\r
5754     \r
5755                 /* Stop singing before start another */\r
5756                 if (cast || fail) stop_singing();\r
5757 \r
5758                 {\r
5759                         int dice = 2;\r
5760                         int sides = plev / 2;\r
5761                         int rad = plev / 10 + 1;\r
5762 \r
5763                         if (info) return info_damage(dice, sides, 0);\r
5764 \r
5765                         if (cast)\r
5766                         {\r
5767                                 msg_print(_("光り輝く歌が辺りを照らした。", "Your uplifting song brings brightness to dark places..."));\r
5768                                 lite_area(damroll(dice, sides), rad);\r
5769                         }\r
5770                 }\r
5771                 break;\r
5772 \r
5773         case 6:\r
5774                 if (name) return _("恐怖の歌", "Song of Fear");\r
5775                 if (desc) return _("視界内の全てのモンスターを恐怖させる。抵抗されると無効。", "Attempts to scare all monsters in sight.");\r
5776     \r
5777                 /* Stop singing before start another */\r
5778                 if (cast || fail) stop_singing();\r
5779 \r
5780                 if (cast)\r
5781                 {\r
5782                         msg_print(_("おどろおどろしいメロディを奏で始めた...", "You start weaving a fearful pattern..."));\r
5783                         start_singing(spell, MUSIC_FEAR);                       \r
5784                 }\r
5785 \r
5786                 {\r
5787                         int power = plev;\r
5788 \r
5789                         if (info) return info_power(power);\r
5790 \r
5791                         if (cont)\r
5792                         {\r
5793                                 project_hack(GF_TURN_ALL, power);\r
5794                         }\r
5795                 }\r
5796 \r
5797                 break;\r
5798 \r
5799         case 7:\r
5800                 if (name) return _("戦いの歌", "Heroic Ballad");\r
5801                 if (desc) return _("ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");\r
5802 \r
5803                 /* Stop singing before start another */\r
5804                 if (cast || fail) stop_singing();\r
5805 \r
5806                 if (cast)\r
5807                 {\r
5808                         msg_print(_("激しい戦いの歌を歌った...", "You start singing a song of intense fighting..."));\r
5809 \r
5810                         (void)hp_player(10);\r
5811                         (void)set_afraid(0);\r
5812 \r
5813                         /* Recalculate hitpoints */\r
5814                         p_ptr->update |= (PU_HP);\r
5815 \r
5816                         start_singing(spell, MUSIC_HERO);\r
5817                 }\r
5818 \r
5819                 if (stop)\r
5820                 {\r
5821                         if (!p_ptr->hero)\r
5822                         {\r
5823                                 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));\r
5824                                 /* Recalculate hitpoints */\r
5825                                 p_ptr->update |= (PU_HP);\r
5826                         }\r
5827                 }\r
5828 \r
5829                 break;\r
5830 \r
5831         case 8:\r
5832                 if (name) return _("霊的知覚", "Clairaudience");\r
5833                 if (desc) return _("近くの罠/扉/階段を感知する。レベル15で全てのモンスター、20で財宝とアイテムを感知できるようになる。レベル25で周辺の地形を感知し、40でその階全体を永久に照らし、ダンジョン内のすべてのアイテムを感知する。この効果は歌い続けることで順に起こる。", \r
5834                         "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
5835     \r
5836                 /* Stop singing before start another */\r
5837                 if (cast || fail) stop_singing();\r
5838 \r
5839                 if (cast)\r
5840                 {\r
5841                         msg_print(_("静かな音楽が感覚を研ぎ澄まさせた...", "Your quiet music sharpens your sense of hearing..."));\r
5842                         /* Hack -- Initialize the turn count */\r
5843                         SINGING_COUNT(p_ptr) = 0;\r
5844                         start_singing(spell, MUSIC_DETECT);\r
5845                 }\r
5846 \r
5847                 {\r
5848                         int rad = DETECT_RAD_DEFAULT;\r
5849 \r
5850                         if (info) return info_radius(rad);\r
5851 \r
5852                         if (cont)\r
5853                         {\r
5854                                 int count = SINGING_COUNT(p_ptr);\r
5855 \r
5856                                 if (count >= 19) wiz_lite(FALSE);\r
5857                                 if (count >= 11)\r
5858                                 {\r
5859                                         map_area(rad);\r
5860                                         if (plev > 39 && count < 19)\r
5861                                                 SINGING_COUNT(p_ptr) = count + 1;\r
5862                                 }\r
5863                                 if (count >= 6)\r
5864                                 {\r
5865                                         /* There are too many hidden treasure.  So... */\r
5866                                         /* detect_treasure(rad); */\r
5867                                         detect_objects_gold(rad);\r
5868                                         detect_objects_normal(rad);\r
5869 \r
5870                                         if (plev > 24 && count < 11)\r
5871                                                 SINGING_COUNT(p_ptr) = count + 1;\r
5872                                 }\r
5873                                 if (count >= 3)\r
5874                                 {\r
5875                                         detect_monsters_invis(rad);\r
5876                                         detect_monsters_normal(rad);\r
5877 \r
5878                                         if (plev > 19 && count < 6)\r
5879                                                 SINGING_COUNT(p_ptr) = count + 1;\r
5880                                 }\r
5881                                 detect_traps(rad, TRUE);\r
5882                                 detect_doors(rad);\r
5883                                 detect_stairs(rad);\r
5884 \r
5885                                 if (plev > 14 && count < 3)\r
5886                                         SINGING_COUNT(p_ptr) = count + 1;\r
5887                         }\r
5888                 }\r
5889 \r
5890                 break;\r
5891 \r
5892         case 9:\r
5893                 if (name) return _("魂の歌", "Soul Shriek");\r
5894                 if (desc) return _("視界内の全てのモンスターに対して精神攻撃を行う。", "Damages all monsters in sight with PSI damages.");\r
5895 \r
5896                 /* Stop singing before start another */\r
5897                 if (cast || fail) stop_singing();\r
5898 \r
5899                 if (cast)\r
5900                 {\r
5901                         msg_print(_("精神を捻じ曲げる歌を歌った...", "You start singing a song of soul in pain..."));\r
5902                         start_singing(spell, MUSIC_PSI);\r
5903                 }\r
5904 \r
5905                 {\r
5906                         int dice = 1;\r
5907                         int sides = plev * 3 / 2;\r
5908 \r
5909                         if (info) return info_damage(dice, sides, 0);\r
5910 \r
5911                         if (cont)\r
5912                         {\r
5913                                 project_hack(GF_PSI, damroll(dice, sides));\r
5914                         }\r
5915                 }\r
5916 \r
5917                 break;\r
5918 \r
5919         case 10:\r
5920                 if (name) return _("知識の歌", "Song of Lore");\r
5921                 if (desc) return _("自分のいるマスと隣りのマスに落ちているアイテムを鑑定する。", "Identifies all items which are in the adjacent squares.");\r
5922     \r
5923                 /* Stop singing before start another */\r
5924                 if (cast || fail) stop_singing();\r
5925 \r
5926                 if (cast)\r
5927                 {\r
5928                         msg_print(_("この世界の知識が流れ込んできた...", "You recall the rich lore of the world..."));\r
5929                         start_singing(spell, MUSIC_ID);\r
5930                 }\r
5931 \r
5932                 {\r
5933                         int rad = 1;\r
5934 \r
5935                         if (info) return info_radius(rad);\r
5936 \r
5937                         /*\r
5938                          * 歌の開始時にも効果発動:\r
5939                          * MP不足で鑑定が発動される前に歌が中断してしまうのを防止。\r
5940                          */\r
5941                         if (cont || cast)\r
5942                         {\r
5943                                 project(0, rad, p_ptr->y, p_ptr->x, 0, GF_IDENTIFY, PROJECT_ITEM, -1);\r
5944                         }\r
5945                 }\r
5946 \r
5947                 break;\r
5948 \r
5949         case 11:\r
5950                 if (name) return _("隠遁の歌", "Hiding Tune");\r
5951                 if (desc) return _("隠密行動能力を上昇させる。", "Gives improved stealth.");\r
5952 \r
5953                 /* Stop singing before start another */\r
5954                 if (cast || fail) stop_singing();\r
5955 \r
5956                 if (cast)\r
5957                 {\r
5958                         msg_print(_("あなたの姿が景色にとけこんでいった...", "Your song carries you beyond the sight of mortal eyes..."));\r
5959                         start_singing(spell, MUSIC_STEALTH);\r
5960                 }\r
5961 \r
5962                 if (stop)\r
5963                 {\r
5964                         if (!p_ptr->tim_stealth)\r
5965                         {\r
5966                                 msg_print(_("姿がはっきりと見えるようになった。", "You are no longer hided."));\r
5967                         }\r
5968                 }\r
5969 \r
5970                 break;\r
5971 \r
5972         case 12:\r
5973                 if (name) return _("幻影の旋律", "Illusion Pattern");\r
5974                 if (desc) return _("視界内の全てのモンスターを混乱させる。抵抗されると無効。", "Attempts to confuse all monsters in sight.");\r
5975     \r
5976                 /* Stop singing before start another */\r
5977                 if (cast || fail) stop_singing();\r
5978 \r
5979                 if (cast)\r
5980                 {\r
5981                         msg_print(_("辺り一面に幻影が現れた...", "You weave a pattern of sounds to beguile and confuse..."));\r
5982                         start_singing(spell, MUSIC_CONF);\r
5983                 }\r
5984 \r
5985                 {\r
5986                         int power = plev * 2;\r
5987 \r
5988                         if (info) return info_power(power);\r
5989 \r
5990                         if (cont)\r
5991                         {\r
5992                                 confuse_monsters(power);\r
5993                         }\r
5994                 }\r
5995 \r
5996                 break;\r
5997 \r
5998         case 13:\r
5999                 if (name) return _("破滅の叫び", "Doomcall");\r
6000                 if (desc) return _("視界内の全てのモンスターに対して轟音攻撃を行う。", "Damages all monsters in sight with booming sound.");\r
6001     \r
6002                 /* Stop singing before start another */\r
6003                 if (cast || fail) stop_singing();\r
6004 \r
6005                 if (cast)\r
6006                 {\r
6007                         msg_print(_("轟音が響いた...", "The fury of the Downfall of Numenor lashes out..."));\r
6008                         start_singing(spell, MUSIC_SOUND);\r
6009                 }\r
6010 \r
6011                 {\r
6012                         int dice = 10 + plev / 5;\r
6013                         int sides = 7;\r
6014 \r
6015                         if (info) return info_damage(dice, sides, 0);\r
6016 \r
6017                         if (cont)\r
6018                         {\r
6019                                 project_hack(GF_SOUND, damroll(dice, sides));\r
6020                         }\r
6021                 }\r
6022 \r
6023                 break;\r
6024 \r
6025         case 14:\r
6026                 if (name) return _("フィリエルの歌", "Firiel's Song");\r
6027                 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");\r
6028     \r
6029                 {\r
6030                         /* Stop singing before start another */\r
6031                         if (cast || fail) stop_singing();\r
6032 \r
6033                         if (cast)\r
6034                         {\r
6035                                 msg_print(_("生命と復活のテーマを奏で始めた...", "The themes of life and revival are woven into your song..."));\r
6036                                 animate_dead(0, p_ptr->y, p_ptr->x);\r
6037                         }\r
6038                 }\r
6039                 break;\r
6040 \r
6041         case 15:\r
6042                 if (name) return _("旅の仲間", "Fellowship Chant");\r
6043                 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");\r
6044 \r
6045                 /* Stop singing before start another */\r
6046                 if (cast || fail) stop_singing();\r
6047 \r
6048                 if (cast)\r
6049                 {\r
6050                         msg_print(_("安らかなメロディを奏で始めた...", "You weave a slow, soothing melody of imploration..."));\r
6051                         start_singing(spell, MUSIC_CHARM);\r
6052                 }\r
6053 \r
6054                 {\r
6055                         int dice = 10 + plev / 15;\r
6056                         int sides = 6;\r
6057 \r
6058                         if (info) return info_power_dice(dice, sides);\r
6059 \r
6060                         if (cont)\r
6061                         {\r
6062                                 charm_monsters(damroll(dice, sides));\r
6063                         }\r
6064                 }\r
6065 \r
6066                 break;\r
6067 \r
6068         case 16:\r
6069                 if (name) return _("分解音波", "Sound of disintegration");\r
6070                 if (desc) return _("壁を掘り進む。自分の足元のアイテムは蒸発する。", "Makes you be able to burrow into walls. Objects under your feet evaporate.");\r
6071 \r
6072                 /* Stop singing before start another */\r
6073                 if (cast || fail) stop_singing();\r
6074 \r
6075                 if (cast)\r
6076                 {\r
6077                         msg_print(_("粉砕するメロディを奏で始めた...", "You weave a violent pattern of sounds to break wall."));\r
6078                         start_singing(spell, MUSIC_WALL);\r
6079                 }\r
6080 \r
6081                 {\r
6082                         /*\r
6083                          * 歌の開始時にも効果発動:\r
6084                          * MP不足で効果が発動される前に歌が中断してしまうのを防止。\r
6085                          */\r
6086                         if (cont || cast)\r
6087                         {\r
6088                                 project(0, 0, p_ptr->y, p_ptr->x,\r
6089                                         0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1);\r
6090                         }\r
6091                 }\r
6092                 break;\r
6093 \r
6094         case 17:\r
6095                 if (name) return _("元素耐性", "Finrod's Resistance");\r
6096                 if (desc) return _("酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。", \r
6097                         "Gives resistance to fire, cold, electricity, acid and poison. These resistances can be added to which from equipment for more powerful resistances.");\r
6098     \r
6099                 /* Stop singing before start another */\r
6100                 if (cast || fail) stop_singing();\r
6101 \r
6102                 if (cast)\r
6103                 {\r
6104                         msg_print(_("元素の力に対する忍耐の歌を歌った。", "You sing a song of perseverance against powers..."));\r
6105                         start_singing(spell, MUSIC_RESIST);\r
6106                 }\r
6107 \r
6108                 if (stop)\r
6109                 {\r
6110                         if (!p_ptr->oppose_acid)\r
6111                         {\r
6112                                 msg_print(_("酸への耐性が薄れた気がする。", "You feel less resistant to acid."));\r
6113                         }\r
6114 \r
6115                         if (!p_ptr->oppose_elec)\r
6116                         {\r
6117                                 msg_print(_("電撃への耐性が薄れた気がする。", "You feel less resistant to elec."));\r
6118                         }\r
6119 \r
6120                         if (!p_ptr->oppose_fire)\r
6121                         {\r
6122                                 msg_print(_("火への耐性が薄れた気がする。", "You feel less resistant to fire."));\r
6123                         }\r
6124 \r
6125                         if (!p_ptr->oppose_cold)\r
6126                         {\r
6127                                 msg_print(_("冷気への耐性が薄れた気がする。", "You feel less resistant to cold."));\r
6128                         }\r
6129 \r
6130                         if (!p_ptr->oppose_pois)\r
6131                         {\r
6132                                 msg_print(_("毒への耐性が薄れた気がする。", "You feel less resistant to pois."));\r
6133                         }\r
6134                 }\r
6135 \r
6136                 break;\r
6137 \r
6138         case 18:\r
6139                 if (name) return _("ホビットのメロディ", "Hobbit Melodies");\r
6140                 if (desc) return _("加速する。", "Hastes you.");\r
6141 \r
6142                 /* Stop singing before start another */\r
6143                 if (cast || fail) stop_singing();\r
6144 \r
6145                 if (cast)\r
6146                 {\r
6147                         msg_print(_("軽快な歌を口ずさみ始めた...", "You start singing joyful pop song..."));\r
6148                         start_singing(spell, MUSIC_SPEED);\r
6149                 }\r
6150 \r
6151                 if (stop)\r
6152                 {\r
6153                         if (!p_ptr->fast)\r
6154                         {\r
6155                                 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));\r
6156                         }\r
6157                 }\r
6158 \r
6159                 break;\r
6160 \r
6161         case 19:\r
6162                 if (name) return _("歪んだ世界", "World Contortion");\r
6163                 if (desc) return _("近くのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all nearby monsters away unless resisted.");\r
6164     \r
6165                 {\r
6166                         int rad = plev / 15 + 1;\r
6167                         int power = plev * 3 + 1;\r
6168 \r
6169                         if (info) return info_radius(rad);\r
6170 \r
6171                         /* Stop singing before start another */\r
6172                         if (cast || fail) stop_singing();\r
6173 \r
6174                         if (cast)\r
6175                         {\r
6176                                 msg_print(_("歌が空間を歪めた...", "Reality whirls wildly as you sing a dizzying melody..."));\r
6177                                 project(0, rad, p_ptr->y, p_ptr->x, power, GF_AWAY_ALL, PROJECT_KILL, -1);\r
6178                         }\r
6179                 }\r
6180                 break;\r
6181 \r
6182         case 20:\r
6183                 if (name) return _("退散の歌", "Dispelling chant");\r
6184                 if (desc) return _("視界内の全てのモンスターにダメージを与える。邪悪なモンスターに特に大きなダメージを与える。", \r
6185                         "Damages all monsters in sight. Hurts evil monsters greatly.");\r
6186     \r
6187                 /* Stop singing before start another */\r
6188                 if (cast || fail) stop_singing();\r
6189 \r
6190                 if (cast)\r
6191                 {\r
6192                         msg_print(_("耐えられない不協和音が敵を責め立てた...", "You cry out in an ear-wracking voice..."));\r
6193                         start_singing(spell, MUSIC_DISPEL);\r
6194                 }\r
6195 \r
6196                 {\r
6197                         int m_sides = plev * 3;\r
6198                         int e_sides = plev * 3;\r
6199 \r
6200                         if (info) return format("%s1d%d+1d%d", s_dam, m_sides, e_sides);\r
6201 \r
6202                         if (cont)\r
6203                         {\r
6204                                 dispel_monsters(randint1(m_sides));\r
6205                                 dispel_evil(randint1(e_sides));\r
6206                         }\r
6207                 }\r
6208                 break;\r
6209 \r
6210         case 21:\r
6211                 if (name) return _("サルマンの甘言", "The Voice of Saruman");\r
6212                 if (desc) return _("視界内の全てのモンスターを減速させ、眠らせようとする。抵抗されると無効。", "Attempts to slow and sleep all monsters in sight.");\r
6213     \r
6214                 /* Stop singing before start another */\r
6215                 if (cast || fail) stop_singing();\r
6216 \r
6217                 if (cast)\r
6218                 {\r
6219                         msg_print(_("優しく、魅力的な歌を口ずさみ始めた...", "You start humming a gentle and attractive song..."));\r
6220                         start_singing(spell, MUSIC_SARUMAN);\r
6221                 }\r
6222 \r
6223                 {\r
6224                         int power = plev;\r
6225 \r
6226                         if (info) return info_power(power);\r
6227 \r
6228                         if (cont)\r
6229                         {\r
6230                                 slow_monsters(plev);\r
6231                                 sleep_monsters(plev);\r
6232                         }\r
6233                 }\r
6234 \r
6235                 break;\r
6236 \r
6237         case 22:\r
6238                 if (name) return _("嵐の音色", "Song of the Tempest");\r
6239                 if (desc) return _("轟音のビームを放つ。", "Fires a beam of sound.");\r
6240     \r
6241                 {\r
6242                         int dice = 15 + (plev - 1) / 2;\r
6243                         int sides = 10;\r
6244 \r
6245                         if (info) return info_damage(dice, sides, 0);\r
6246 \r
6247                         /* Stop singing before start another */\r
6248                         if (cast || fail) stop_singing();\r
6249 \r
6250                         if (cast)\r
6251                         {\r
6252                                 if (!get_aim_dir(&dir)) return NULL;\r
6253 \r
6254                                 fire_beam(GF_SOUND, dir, damroll(dice, sides));\r
6255                         }\r
6256                 }\r
6257                 break;\r
6258 \r
6259         case 23:\r
6260                 if (name) return _("もう一つの世界", "Ambarkanta");\r
6261                 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");\r
6262     \r
6263                 {\r
6264                         int base = 15;\r
6265                         int sides = 20;\r
6266 \r
6267                         if (info) return info_delay(base, sides);\r
6268 \r
6269                         /* Stop singing before start another */\r
6270                         if (cast || fail) stop_singing();\r
6271 \r
6272                         if (cast)\r
6273                         {\r
6274                                 msg_print(_("周囲が変化し始めた...", "You sing of the primeval shaping of Middle-earth..."));\r
6275                                 alter_reality();\r
6276                         }\r
6277                 }\r
6278                 break;\r
6279 \r
6280         case 24:\r
6281                 if (name) return _("破壊の旋律", "Wrecking Pattern");\r
6282                 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。", \r
6283                         "Shakes dungeon structure, and results in random swapping of floors and walls.");\r
6284 \r
6285                 /* Stop singing before start another */\r
6286                 if (cast || fail) stop_singing();\r
6287 \r
6288                 if (cast)\r
6289                 {\r
6290                         msg_print(_("破壊的な歌が響きわたった...", "You weave a pattern of sounds to contort and shatter..."));\r
6291                         start_singing(spell, MUSIC_QUAKE);\r
6292                 }\r
6293 \r
6294                 {\r
6295                         int rad = 10;\r
6296 \r
6297                         if (info) return info_radius(rad);\r
6298 \r
6299                         if (cont)\r
6300                         {\r
6301                                 earthquake(p_ptr->y, p_ptr->x, 10);\r
6302                         }\r
6303                 }\r
6304 \r
6305                 break;\r
6306 \r
6307 \r
6308         case 25:\r
6309                 if (name) return _("停滞の歌", "Stationary Shriek");\r
6310                 if (desc) return _("視界内の全てのモンスターを麻痺させようとする。抵抗されると無効。", "Attempts to freeze all monsters in sight.");\r
6311     \r
6312                 /* Stop singing before start another */\r
6313                 if (cast || fail) stop_singing();\r
6314 \r
6315                 if (cast)\r
6316                 {\r
6317                         msg_print(_("ゆっくりとしたメロディを奏で始めた...", "You weave a very slow pattern which is almost likely to stop..."));\r
6318                         start_singing(spell, MUSIC_STASIS);\r
6319                 }\r
6320 \r
6321                 {\r
6322                         int power = plev * 4;\r
6323 \r
6324                         if (info) return info_power(power);\r
6325 \r
6326                         if (cont)\r
6327                         {\r
6328                                 stasis_monsters(power);\r
6329                         }\r
6330                 }\r
6331 \r
6332                 break;\r
6333 \r
6334         case 26:\r
6335                 if (name) return _("守りの歌", "Endurance");\r
6336                 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。", \r
6337                         "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
6338     \r
6339                 {\r
6340                         /* Stop singing before start another */\r
6341                         if (cast || fail) stop_singing();\r
6342 \r
6343                         if (cast)\r
6344                         {\r
6345                                 msg_print(_("歌が神聖な場を作り出した...", "The holy power of the Music is creating sacred field..."));\r
6346                                 warding_glyph();\r
6347                         }\r
6348                 }\r
6349                 break;\r
6350 \r
6351         case 27:\r
6352                 if (name) return _("英雄の詩", "The Hero's Poem");\r
6353                 if (desc) return _("加速し、ヒーロー気分になり、視界内の全てのモンスターにダメージを与える。", \r
6354                         "Hastes you. Gives heroism. Damages all monsters in sight.");\r
6355     \r
6356                 /* Stop singing before start another */\r
6357                 if (cast || fail) stop_singing();\r
6358 \r
6359                 if (cast)\r
6360                 {\r
6361                         msg_print(_("英雄の歌を口ずさんだ...", "You chant a powerful, heroic call to arms..."));\r
6362                         (void)hp_player(10);\r
6363                         (void)set_afraid(0);\r
6364 \r
6365                         /* Recalculate hitpoints */\r
6366                         p_ptr->update |= (PU_HP);\r
6367 \r
6368                         start_singing(spell, MUSIC_SHERO);\r
6369                 }\r
6370 \r
6371                 if (stop)\r
6372                 {\r
6373                         if (!p_ptr->hero)\r
6374                         {\r
6375                                 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));\r
6376                                 /* Recalculate hitpoints */\r
6377                                 p_ptr->update |= (PU_HP);\r
6378                         }\r
6379 \r
6380                         if (!p_ptr->fast)\r
6381                         {\r
6382                                 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));\r
6383                         }\r
6384                 }\r
6385 \r
6386                 {\r
6387                         int dice = 1;\r
6388                         int sides = plev * 3;\r
6389 \r
6390                         if (info) return info_damage(dice, sides, 0);\r
6391 \r
6392                         if (cont)\r
6393                         {\r
6394                                 dispel_monsters(damroll(dice, sides));\r
6395                         }\r
6396                 }\r
6397                 break;\r
6398 \r
6399         case 28:\r
6400                 if (name) return _("ヤヴァンナの助け", "Relief of Yavanna");\r
6401                 if (desc) return _("強力な回復の歌で、負傷と朦朧状態も全快する。", "Powerful healing song. Also heals cut and stun completely.");\r
6402     \r
6403                 /* Stop singing before start another */\r
6404                 if (cast || fail) stop_singing();\r
6405 \r
6406                 if (cast)\r
6407                 {\r
6408                         msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing the song..."));\r
6409                         start_singing(spell, MUSIC_H_LIFE);\r
6410                 }\r
6411 \r
6412                 {\r
6413                         int dice = 15;\r
6414                         int sides = 10;\r
6415 \r
6416                         if (info) return info_heal(dice, sides, 0);\r
6417 \r
6418                         if (cont)\r
6419                         {\r
6420                                 hp_player(damroll(dice, sides));\r
6421                                 set_stun(0);\r
6422                                 set_cut(0);\r
6423                         }\r
6424                 }\r
6425 \r
6426                 break;\r
6427 \r
6428         case 29:\r
6429                 if (name) return _("再生の歌", "Goddess' rebirth");\r
6430                 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");\r
6431     \r
6432                 {\r
6433                         /* Stop singing before start another */\r
6434                         if (cast || fail) stop_singing();\r
6435 \r
6436                         if (cast)\r
6437                         {\r
6438                                 msg_print(_("暗黒の中に光と美をふりまいた。体が元の活力を取り戻した。",\r
6439                                                         "You strewed light and beauty in the dark as you sing. You feel refreshed."));\r
6440                                 (void)do_res_stat(A_STR);\r
6441                                 (void)do_res_stat(A_INT);\r
6442                                 (void)do_res_stat(A_WIS);\r
6443                                 (void)do_res_stat(A_DEX);\r
6444                                 (void)do_res_stat(A_CON);\r
6445                                 (void)do_res_stat(A_CHR);\r
6446                                 (void)restore_level();\r
6447                         }\r
6448                 }\r
6449                 break;\r
6450 \r
6451         case 30:\r
6452                 if (name) return _("サウロンの魔術", "Wizardry of Sauron");\r
6453                 if (desc) return _("非常に強力でごく小さい轟音の球を放つ。", "Fires an extremely powerful tiny ball of sound.");\r
6454     \r
6455                 {\r
6456                         int dice = 50 + plev;\r
6457                         int sides = 10;\r
6458                         int rad = 0;\r
6459 \r
6460                         if (info) return info_damage(dice, sides, 0);\r
6461 \r
6462                         /* Stop singing before start another */\r
6463                         if (cast || fail) stop_singing();\r
6464 \r
6465                         if (cast)\r
6466                         {\r
6467                                 if (!get_aim_dir(&dir)) return NULL;\r
6468 \r
6469                                 fire_ball(GF_SOUND, dir, damroll(dice, sides), rad);\r
6470                         }\r
6471                 }\r
6472                 break;\r
6473 \r
6474         case 31:\r
6475                 if (name) return _("フィンゴルフィンの挑戦", "Fingolfin's Challenge");\r
6476                 if (desc) return _("ダメージを受けなくなるバリアを張る。", \r
6477                         "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks.");\r
6478     \r
6479                 /* Stop singing before start another */\r
6480                 if (cast || fail) stop_singing();\r
6481 \r
6482                 if (cast)\r
6483                 {\r
6484                         msg_print(_("フィンゴルフィンの冥王への挑戦を歌った...",\r
6485                                                 "You recall the valor of Fingolfin's challenge to the Dark Lord..."));\r
6486 \r
6487                         /* Redraw map */\r
6488                         p_ptr->redraw |= (PR_MAP);\r
6489                 \r
6490                         /* Update monsters */\r
6491                         p_ptr->update |= (PU_MONSTERS);\r
6492                 \r
6493                         /* Window stuff */\r
6494                         p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);\r
6495 \r
6496                         start_singing(spell, MUSIC_INVULN);\r
6497                 }\r
6498 \r
6499                 if (stop)\r
6500                 {\r
6501                         if (!p_ptr->invuln)\r
6502                         {\r
6503                                 msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));\r
6504                                 /* Redraw map */\r
6505                                 p_ptr->redraw |= (PR_MAP);\r
6506 \r
6507                                 /* Update monsters */\r
6508                                 p_ptr->update |= (PU_MONSTERS);\r
6509 \r
6510                                 /* Window stuff */\r
6511                                 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);\r
6512                         }\r
6513                 }\r
6514 \r
6515                 break;\r
6516         }\r
6517 \r
6518         return "";\r
6519 }\r
6520 \r
6521 /*!\r
6522  * @brief 剣術の各処理を行う\r
6523  * @param spell 剣術ID\r
6524  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_CAST)\r
6525  * @return SPELL_NAME / SPELL_DESC 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。\r
6526  */\r
6527 static cptr do_hissatsu_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
6528 {\r
6529         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
6530         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
6531         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
6532 \r
6533         int dir;\r
6534         int plev = p_ptr->lev;\r
6535 \r
6536         switch (spell)\r
6537         {\r
6538         case 0:\r
6539                 if (name) return _("飛飯綱", "Tobi-Izuna");\r
6540                 if (desc) return _("2マス離れたところにいるモンスターを攻撃する。", "Attacks a two squares distant monster.");\r
6541     \r
6542                 if (cast)\r
6543                 {\r
6544                         project_length = 2;\r
6545                         if (!get_aim_dir(&dir)) return NULL;\r
6546 \r
6547                         project_hook(GF_ATTACK, dir, HISSATSU_2, PROJECT_STOP | PROJECT_KILL);\r
6548                 }\r
6549                 break;\r
6550 \r
6551         case 1:\r
6552                 if (name) return _("五月雨斬り", "3-Way Attack");\r
6553                 if (desc) return _("3方向に対して攻撃する。", "Attacks in 3 directions in one time.");\r
6554     \r
6555                 if (cast)\r
6556                 {\r
6557                         int cdir;\r
6558                         int y, x;\r
6559 \r
6560                         if (!get_rep_dir2(&dir)) return NULL;\r
6561                         if (dir == 5) return NULL;\r
6562 \r
6563                         for (cdir = 0;cdir < 8; cdir++)\r
6564                         {\r
6565                                 if (cdd[cdir] == dir) break;\r
6566                         }\r
6567 \r
6568                         if (cdir == 8) return NULL;\r
6569 \r
6570                         y = p_ptr->y + ddy_cdd[cdir];\r
6571                         x = p_ptr->x + ddx_cdd[cdir];\r
6572                         if (cave[y][x].m_idx)\r
6573                                 py_attack(y, x, 0);\r
6574                         else\r
6575                                 msg_print(_("攻撃は空を切った。", "You attack the empty air."));\r
6576                         \r
6577                         y = p_ptr->y + ddy_cdd[(cdir + 7) % 8];\r
6578                         x = p_ptr->x + ddx_cdd[(cdir + 7) % 8];\r
6579                         if (cave[y][x].m_idx)\r
6580                                 py_attack(y, x, 0);\r
6581                         else\r
6582                                 msg_print(_("攻撃は空を切った。", "You attack the empty air."));\r
6583                         \r
6584                         y = p_ptr->y + ddy_cdd[(cdir + 1) % 8];\r
6585                         x = p_ptr->x + ddx_cdd[(cdir + 1) % 8];\r
6586                         if (cave[y][x].m_idx)\r
6587                                 py_attack(y, x, 0);\r
6588                         else\r
6589                                 msg_print(_("攻撃は空を切った。", "You attack the empty air."));\r
6590                 }\r
6591                 break;\r
6592 \r
6593         case 2:\r
6594                 if (name) return _("ブーメラン", "Boomerang");\r
6595                 if (desc) return _("武器を手元に戻ってくるように投げる。戻ってこないこともある。", \r
6596                         "Throws current weapon. And it'll return to your hand unless failed.");\r
6597     \r
6598                 if (cast)\r
6599                 {\r
6600                         if (!do_cmd_throw(1, TRUE, -1)) return NULL;\r
6601                 }\r
6602                 break;\r
6603 \r
6604         case 3:\r
6605                 if (name) return _("焔霊", "Burning Strike");\r
6606                 if (desc) return _("火炎耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to fire.");\r
6607     \r
6608                 if (cast)\r
6609                 {\r
6610                         int y, x;\r
6611 \r
6612                         if (!get_rep_dir2(&dir)) return NULL;\r
6613                         if (dir == 5) return NULL;\r
6614 \r
6615                         y = p_ptr->y + ddy[dir];\r
6616                         x = p_ptr->x + ddx[dir];\r
6617 \r
6618                         if (cave[y][x].m_idx)\r
6619                                 py_attack(y, x, HISSATSU_FIRE);\r
6620                         else\r
6621                         {\r
6622                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
6623                                 return NULL;\r
6624                         }\r
6625                 }\r
6626                 break;\r
6627 \r
6628         case 4:\r
6629                 if (name) return _("殺気感知", "Detect Ferocity");\r
6630                 if (desc) return _("近くの思考することができるモンスターを感知する。", "Detects all monsters except mindless in your vicinity.");\r
6631     \r
6632                 if (cast)\r
6633                 {\r
6634                         detect_monsters_mind(DETECT_RAD_DEFAULT);\r
6635                 }\r
6636                 break;\r
6637 \r
6638         case 5:\r
6639                 if (name) return _("みね打ち", "Strike to Stun");\r
6640                 if (desc) return _("相手にダメージを与えないが、朦朧とさせる。", "Attempts to stun a monster in the adjacent.");\r
6641     \r
6642                 if (cast)\r
6643                 {\r
6644                         int y, x;\r
6645 \r
6646                         if (!get_rep_dir2(&dir)) return NULL;\r
6647                         if (dir == 5) return NULL;\r
6648 \r
6649                         y = p_ptr->y + ddy[dir];\r
6650                         x = p_ptr->x + ddx[dir];\r
6651 \r
6652                         if (cave[y][x].m_idx)\r
6653                                 py_attack(y, x, HISSATSU_MINEUCHI);\r
6654                         else\r
6655                         {\r
6656                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
6657                                 return NULL;\r
6658                         }\r
6659                 }\r
6660                 break;\r
6661 \r
6662         case 6:\r
6663                 if (name) return _("カウンター", "Counter");\r
6664                 if (desc) return _("相手に攻撃されたときに反撃する。反撃するたびにMPを消費。", \r
6665                         "Prepares to counterattack. When attack by a monster, strikes back using SP each time.");\r
6666     \r
6667                 if (cast)\r
6668                 {\r
6669                         if (p_ptr->riding)\r
6670                         {\r
6671                                 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));\r
6672                                 return NULL;\r
6673                         }\r
6674                         msg_print(_("相手の攻撃に対して身構えた。", "You prepare to counter blow."));\r
6675                         p_ptr->counter = TRUE;\r
6676                 }\r
6677                 break;\r
6678 \r
6679         case 7:\r
6680                 if (name) return _("払い抜け", "Harainuke");\r
6681                 if (desc) return _("攻撃した後、反対側に抜ける。", \r
6682                         "Attacks monster with your weapons normally, then move through counter side of the monster.");\r
6683     \r
6684                 if (cast)\r
6685                 {\r
6686                         POSITION y, x;\r
6687 \r
6688                         if (p_ptr->riding)\r
6689                         {\r
6690                                 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));\r
6691                                 return NULL;\r
6692                         }\r
6693         \r
6694                         if (!get_rep_dir2(&dir)) return NULL;\r
6695         \r
6696                         if (dir == 5) return NULL;\r
6697                         y = p_ptr->y + ddy[dir];\r
6698                         x = p_ptr->x + ddx[dir];\r
6699         \r
6700                         if (!cave[y][x].m_idx)\r
6701                         {\r
6702                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
6703                                 return NULL;\r
6704                         }\r
6705         \r
6706                         py_attack(y, x, 0);\r
6707         \r
6708                         if (!player_can_enter(cave[y][x].feat, 0) || is_trap(cave[y][x].feat))\r
6709                                 break;\r
6710         \r
6711                         y += ddy[dir];\r
6712                         x += ddx[dir];\r
6713         \r
6714                         if (player_can_enter(cave[y][x].feat, 0) && !is_trap(cave[y][x].feat) && !cave[y][x].m_idx)\r
6715                         {\r
6716                                 msg_print(NULL);\r
6717         \r
6718                                 /* Move the player */\r
6719                                 (void)move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);\r
6720                         }\r
6721                 }\r
6722                 break;\r
6723 \r
6724         case 8:\r
6725                 if (name) return _("サーペンツタン", "Serpent's Tongue");\r
6726                 if (desc) return _("毒耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to poison.");\r
6727     \r
6728                 if (cast)\r
6729                 {\r
6730                         int y, x;\r
6731 \r
6732                         if (!get_rep_dir2(&dir)) return NULL;\r
6733                         if (dir == 5) return NULL;\r
6734 \r
6735                         y = p_ptr->y + ddy[dir];\r
6736                         x = p_ptr->x + ddx[dir];\r
6737 \r
6738                         if (cave[y][x].m_idx)\r
6739                                 py_attack(y, x, HISSATSU_POISON);\r
6740                         else\r
6741                         {\r
6742                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
6743                                 return NULL;\r
6744                         }\r
6745                 }\r
6746                 break;\r
6747 \r
6748         case 9:\r
6749                 if (name) return _("斬魔剣弐の太刀", "Zammaken");\r
6750                 if (desc) return _("生命のない邪悪なモンスターに大ダメージを与えるが、他のモンスターには全く効果がない。", \r
6751                         "Attacks an evil unliving monster with great damage. No effect to other  monsters.");\r
6752     \r
6753                 if (cast)\r
6754                 {\r
6755                         int y, x;\r
6756 \r
6757                         if (!get_rep_dir2(&dir)) return NULL;\r
6758                         if (dir == 5) return NULL;\r
6759 \r
6760                         y = p_ptr->y + ddy[dir];\r
6761                         x = p_ptr->x + ddx[dir];\r
6762 \r
6763                         if (cave[y][x].m_idx)\r
6764                                 py_attack(y, x, HISSATSU_ZANMA);\r
6765                         else\r
6766                         {\r
6767                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
6768                                 return NULL;\r
6769                         }\r
6770                 }\r
6771                 break;\r
6772 \r
6773         case 10:\r
6774                 if (name) return _("裂風剣", "Wind Blast");\r
6775                 if (desc) return _("攻撃した相手を後方へ吹き飛ばす。", "Attacks an adjacent monster, and blow it away.");\r
6776     \r
6777                 if (cast)\r
6778                 {\r
6779                         int y, x;\r
6780 \r
6781                         if (!get_rep_dir2(&dir)) return NULL;\r
6782                         if (dir == 5) return NULL;\r
6783 \r
6784                         y = p_ptr->y + ddy[dir];\r
6785                         x = p_ptr->x + ddx[dir];\r
6786 \r
6787                         if (cave[y][x].m_idx)\r
6788                                 py_attack(y, x, 0);\r
6789                         else\r
6790                         {\r
6791                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
6792                                 return NULL;\r
6793                         }\r
6794                         if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)\r
6795                         {\r
6796                                 return "";\r
6797                         }\r
6798                         if (cave[y][x].m_idx)\r
6799                         {\r
6800                                 int i;\r
6801                                 POSITION ty = y, tx = x;\r
6802                                 POSITION oy = y, ox = x;\r
6803                                 MONSTER_IDX m_idx = cave[y][x].m_idx;\r
6804                                 monster_type *m_ptr = &m_list[m_idx];\r
6805                                 char m_name[80];\r
6806         \r
6807                                 monster_desc(m_name, m_ptr, 0);\r
6808         \r
6809                                 for (i = 0; i < 5; i++)\r
6810                                 {\r
6811                                         y += ddy[dir];\r
6812                                         x += ddx[dir];\r
6813                                         if (cave_empty_bold(y, x))\r
6814                                         {\r
6815                                                 ty = y;\r
6816                                                 tx = x;\r
6817                                         }\r
6818                                         else break;\r
6819                                 }\r
6820                                 if ((ty != oy) || (tx != ox))\r
6821                                 {\r
6822                                         msg_format(_("%sを吹き飛ばした!", "You blow %s away!"), m_name);\r
6823                                         cave[oy][ox].m_idx = 0;\r
6824                                         cave[ty][tx].m_idx = m_idx;\r
6825                                         m_ptr->fy = ty;\r
6826                                         m_ptr->fx = tx;\r
6827         \r
6828                                         update_mon(m_idx, TRUE);\r
6829                                         lite_spot(oy, ox);\r
6830                                         lite_spot(ty, tx);\r
6831         \r
6832                                         if (r_info[m_ptr->r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))\r
6833                                                 p_ptr->update |= (PU_MON_LITE);\r
6834                                 }\r
6835                         }\r
6836                 }\r
6837                 break;\r
6838 \r
6839         case 11:\r
6840                 if (name) return _("刀匠の目利き", "Judge");\r
6841                 if (desc) return _("武器・防具を1つ識別する。レベル45以上で武器・防具の能力を完全に知ることができる。", \r
6842                         "Identifies a weapon or armor. Or *identifies* these at level 45.");\r
6843     \r
6844                 if (cast)\r
6845                 {\r
6846                         if (plev > 44)\r
6847                         {\r
6848                                 if (!identify_fully(TRUE)) return NULL;\r
6849                         }\r
6850                         else\r
6851                         {\r
6852                                 if (!ident_spell(TRUE)) return NULL;\r
6853                         }\r
6854                 }\r
6855                 break;\r
6856 \r
6857         case 12:\r
6858                 if (name) return _("破岩斬", "Rock Smash");\r
6859                 if (desc) return _("岩を壊し、岩石系のモンスターに大ダメージを与える。", "Breaks rock. Or greatly damage a monster made by rocks.");\r
6860     \r
6861                 if (cast)\r
6862                 {\r
6863                         int y, x;\r
6864 \r
6865                         if (!get_rep_dir2(&dir)) return NULL;\r
6866                         if (dir == 5) return NULL;\r
6867 \r
6868                         y = p_ptr->y + ddy[dir];\r
6869                         x = p_ptr->x + ddx[dir];\r
6870 \r
6871                         if (cave[y][x].m_idx)\r
6872                                 py_attack(y, x, HISSATSU_HAGAN);\r
6873         \r
6874                         if (!cave_have_flag_bold(y, x, FF_HURT_ROCK)) break;\r
6875         \r
6876                         /* Destroy the feature */\r
6877                         cave_alter_feat(y, x, FF_HURT_ROCK);\r
6878         \r
6879                         /* Update some things */\r
6880                         p_ptr->update |= (PU_FLOW);\r
6881                 }\r
6882                 break;\r
6883 \r
6884         case 13:\r
6885                 if (name) return _("乱れ雪月花", "Midare-Setsugekka");\r
6886                 if (desc) return _("攻撃回数が増え、冷気耐性のないモンスターに大ダメージを与える。", \r
6887                         "Attacks a monster with increased number of attacks and more damage unless it has resistance to cold.");\r
6888     \r
6889                 if (cast)\r
6890                 {\r
6891                         int y, x;\r
6892 \r
6893                         if (!get_rep_dir2(&dir)) return NULL;\r
6894                         if (dir == 5) return NULL;\r
6895 \r
6896                         y = p_ptr->y + ddy[dir];\r
6897                         x = p_ptr->x + ddx[dir];\r
6898 \r
6899                         if (cave[y][x].m_idx)\r
6900                                 py_attack(y, x, HISSATSU_COLD);\r
6901                         else\r
6902                         {\r
6903                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
6904                                 return NULL;\r
6905                         }\r
6906                 }\r
6907                 break;\r
6908 \r
6909         case 14:\r
6910                 if (name) return _("急所突き", "Spot Aiming");\r
6911                 if (desc) return _("モンスターを一撃で倒す攻撃を繰り出す。失敗すると1点しかダメージを与えられない。", \r
6912                         "Attempts to kill a monster instantly. If failed cause only 1HP of damage.");\r
6913     \r
6914                 if (cast)\r
6915                 {\r
6916                         int y, x;\r
6917 \r
6918                         if (!get_rep_dir2(&dir)) return NULL;\r
6919                         if (dir == 5) return NULL;\r
6920 \r
6921                         y = p_ptr->y + ddy[dir];\r
6922                         x = p_ptr->x + ddx[dir];\r
6923 \r
6924                         if (cave[y][x].m_idx)\r
6925                                 py_attack(y, x, HISSATSU_KYUSHO);\r
6926                         else\r
6927                         {\r
6928                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
6929                                 return NULL;\r
6930                         }\r
6931                 }\r
6932                 break;\r
6933 \r
6934         case 15:\r
6935                 if (name) return _("魔神斬り", "Majingiri");\r
6936                 if (desc) return _("会心の一撃で攻撃する。攻撃がかわされやすい。", \r
6937                         "Attempts to attack with critical hit. But this attack is easy to evade for a monster.");\r
6938     \r
6939                 if (cast)\r
6940                 {\r
6941                         int y, x;\r
6942 \r
6943                         if (!get_rep_dir2(&dir)) return NULL;\r
6944                         if (dir == 5) return NULL;\r
6945 \r
6946                         y = p_ptr->y + ddy[dir];\r
6947                         x = p_ptr->x + ddx[dir];\r
6948 \r
6949                         if (cave[y][x].m_idx)\r
6950                                 py_attack(y, x, HISSATSU_MAJIN);\r
6951                         else\r
6952                         {\r
6953                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
6954                                 return NULL;\r
6955                         }\r
6956                 }\r
6957                 break;\r
6958 \r
6959         case 16:\r
6960                 if (name) return _("捨て身", "Desperate Attack");\r
6961                 if (desc) return _("強力な攻撃を繰り出す。次のターンまでの間、食らうダメージが増える。", \r
6962                         "Attacks with all of your power. But all damages you take will be doubled for one turn.");\r
6963     \r
6964                 if (cast)\r
6965                 {\r
6966                         int y, x;\r
6967 \r
6968                         if (!get_rep_dir2(&dir)) return NULL;\r
6969                         if (dir == 5) return NULL;\r
6970 \r
6971                         y = p_ptr->y + ddy[dir];\r
6972                         x = p_ptr->x + ddx[dir];\r
6973 \r
6974                         if (cave[y][x].m_idx)\r
6975                                 py_attack(y, x, HISSATSU_SUTEMI);\r
6976                         else\r
6977                         {\r
6978                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
6979                                 return NULL;\r
6980                         }\r
6981                         p_ptr->sutemi = TRUE;\r
6982                 }\r
6983                 break;\r
6984 \r
6985         case 17:\r
6986                 if (name) return _("雷撃鷲爪斬", "Lightning Eagle");\r
6987                 if (desc) return _("電撃耐性のないモンスターに非常に大きいダメージを与える。", \r
6988                         "Attacks a monster with more damage unless it has resistance to electricity.");\r
6989     \r
6990                 if (cast)\r
6991                 {\r
6992                         int y, x;\r
6993 \r
6994                         if (!get_rep_dir2(&dir)) return NULL;\r
6995                         if (dir == 5) return NULL;\r
6996 \r
6997                         y = p_ptr->y + ddy[dir];\r
6998                         x = p_ptr->x + ddx[dir];\r
6999 \r
7000                         if (cave[y][x].m_idx)\r
7001                                 py_attack(y, x, HISSATSU_ELEC);\r
7002                         else\r
7003                         {\r
7004                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
7005                                 return NULL;\r
7006                         }\r
7007                 }\r
7008                 break;\r
7009 \r
7010         case 18:\r
7011                 if (name) return _("入身", "Rush Attack");\r
7012                 if (desc) return _("素早く相手に近寄り攻撃する。", "Steps close to a monster and attacks at a time.");\r
7013     \r
7014                 if (cast)\r
7015                 {\r
7016                         if (!rush_attack(NULL)) return NULL;\r
7017                 }\r
7018                 break;\r
7019 \r
7020         case 19:\r
7021                 if (name) return _("赤流渦", "Bloody Maelstrom");\r
7022                 if (desc) return _("自分自身も傷を作りつつ、その傷が深いほど大きい威力で全方向の敵を攻撃できる。生きていないモンスターには効果がない。", \r
7023                         "Attacks all adjacent monsters with power corresponding to your cut status. Then increases your cut status. No effect to unliving monsters.");\r
7024     \r
7025                 if (cast)\r
7026                 {\r
7027                         int y = 0, x = 0;\r
7028 \r
7029                         cave_type       *c_ptr;\r
7030                         monster_type    *m_ptr;\r
7031         \r
7032                         if (p_ptr->cut < 300)\r
7033                                 set_cut(p_ptr->cut + 300);\r
7034                         else\r
7035                                 set_cut(p_ptr->cut * 2);\r
7036         \r
7037                         for (dir = 0; dir < 8; dir++)\r
7038                         {\r
7039                                 y = p_ptr->y + ddy_ddd[dir];\r
7040                                 x = p_ptr->x + ddx_ddd[dir];\r
7041                                 c_ptr = &cave[y][x];\r
7042         \r
7043                                 /* Get the monster */\r
7044                                 m_ptr = &m_list[c_ptr->m_idx];\r
7045         \r
7046                                 /* Hack -- attack monsters */\r
7047                                 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))\r
7048                                 {\r
7049                                         if (!monster_living(&r_info[m_ptr->r_idx]))\r
7050                                         {\r
7051                                                 char m_name[80];\r
7052         \r
7053                                                 monster_desc(m_name, m_ptr, 0);\r
7054                                                 msg_format(_("%sには効果がない!", "%s is unharmed!"), m_name);\r
7055                                         }\r
7056                                         else py_attack(y, x, HISSATSU_SEKIRYUKA);\r
7057                                 }\r
7058                         }\r
7059                 }\r
7060                 break;\r
7061 \r
7062         case 20:\r
7063                 if (name) return _("激震撃", "Earthquake Blow");\r
7064                 if (desc) return _("地震を起こす。", "Shakes dungeon structure, and results in random swapping of floors and walls.");\r
7065     \r
7066                 if (cast)\r
7067                 {\r
7068                         int y,x;\r
7069 \r
7070                         if (!get_rep_dir2(&dir)) return NULL;\r
7071                         if (dir == 5) return NULL;\r
7072 \r
7073                         y = p_ptr->y + ddy[dir];\r
7074                         x = p_ptr->x + ddx[dir];\r
7075 \r
7076                         if (cave[y][x].m_idx)\r
7077                                 py_attack(y, x, HISSATSU_QUAKE);\r
7078                         else\r
7079                                 earthquake(p_ptr->y, p_ptr->x, 10);\r
7080                 }\r
7081                 break;\r
7082 \r
7083         case 21:\r
7084                 if (name) return _("地走り", "Crack");\r
7085                 if (desc) return _("衝撃波のビームを放つ。", "Fires a beam of shock wave.");\r
7086     \r
7087                 if (cast)\r
7088                 {\r
7089                         int total_damage = 0, basedam, i;\r
7090                         u32b flgs[TR_FLAG_SIZE];\r
7091                         object_type *o_ptr;\r
7092                         if (!get_aim_dir(&dir)) return NULL;\r
7093                         msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));\r
7094                         for (i = 0; i < 2; i++)\r
7095                         {\r
7096                                 int damage;\r
7097         \r
7098                                 if (!buki_motteruka(INVEN_RARM+i)) break;\r
7099                                 o_ptr = &inventory[INVEN_RARM+i];\r
7100                                 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;\r
7101                                 damage = o_ptr->to_d * 100;\r
7102                                 object_flags(o_ptr, flgs);\r
7103                                 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))\r
7104                                 {\r
7105                                         /* vorpal blade */\r
7106                                         basedam *= 5;\r
7107                                         basedam /= 3;\r
7108                                 }\r
7109                                 else if (have_flag(flgs, TR_VORPAL))\r
7110                                 {\r
7111                                         /* vorpal flag only */\r
7112                                         basedam *= 11;\r
7113                                         basedam /= 9;\r
7114                                 }\r
7115                                 damage += basedam;\r
7116                                 damage *= p_ptr->num_blow[i];\r
7117                                 total_damage += damage / 200;\r
7118                                 if (i) total_damage = total_damage*7/10;\r
7119                         }\r
7120                         fire_beam(GF_FORCE, dir, total_damage);\r
7121                 }\r
7122                 break;\r
7123 \r
7124         case 22:\r
7125                 if (name) return _("気迫の雄叫び", "War Cry");\r
7126                 if (desc) return _("視界内の全モンスターに対して轟音の攻撃を行う。さらに、近くにいるモンスターを怒らせる。", \r
7127                         "Damages all monsters in sight with sound. Aggravate nearby monsters.");\r
7128     \r
7129                 if (cast)\r
7130                 {\r
7131                         msg_print(_("雄叫びをあげた!", "You roar out!"));\r
7132                         project_hack(GF_SOUND, randint1(plev * 3));\r
7133                         aggravate_monsters(0);\r
7134                 }\r
7135                 break;\r
7136 \r
7137         case 23:\r
7138                 if (name) return _("無双三段", "Musou-Sandan");\r
7139                 if (desc) return _("強力な3段攻撃を繰り出す。", "Attacks with powerful 3 strikes.");\r
7140     \r
7141                 if (cast)\r
7142                 {\r
7143                         int i;\r
7144 \r
7145                         if (!get_rep_dir2(&dir)) return NULL;\r
7146                         if (dir == 5) return NULL;\r
7147 \r
7148                         for (i = 0; i < 3; i++)\r
7149                         {\r
7150                                 POSITION y, x;\r
7151                                 POSITION ny, nx;\r
7152                                 MONSTER_IDX m_idx;\r
7153                                 cave_type *c_ptr;\r
7154                                 monster_type *m_ptr;\r
7155         \r
7156                                 y = p_ptr->y + ddy[dir];\r
7157                                 x = p_ptr->x + ddx[dir];\r
7158                                 c_ptr = &cave[y][x];\r
7159         \r
7160                                 if (c_ptr->m_idx)\r
7161                                         py_attack(y, x, HISSATSU_3DAN);\r
7162                                 else\r
7163                                 {\r
7164                                         msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
7165                                         return NULL;\r
7166                                 }\r
7167         \r
7168                                 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)\r
7169                                 {\r
7170                                         return "";\r
7171                                 }\r
7172         \r
7173                                 /* Monster is dead? */\r
7174                                 if (!c_ptr->m_idx) break;\r
7175         \r
7176                                 ny = y + ddy[dir];\r
7177                                 nx = x + ddx[dir];\r
7178                                 m_idx = c_ptr->m_idx;\r
7179                                 m_ptr = &m_list[m_idx];\r
7180         \r
7181                                 /* Monster cannot move back? */\r
7182                                 if (!monster_can_enter(ny, nx, &r_info[m_ptr->r_idx], 0))\r
7183                                 {\r
7184                                         /* -more- */\r
7185                                         if (i < 2) msg_print(NULL);\r
7186                                         continue;\r
7187                                 }\r
7188         \r
7189                                 c_ptr->m_idx = 0;\r
7190                                 cave[ny][nx].m_idx = m_idx;\r
7191                                 m_ptr->fy = ny;\r
7192                                 m_ptr->fx = nx;\r
7193         \r
7194                                 update_mon(m_idx, TRUE);\r
7195         \r
7196                                 /* Redraw the old spot */\r
7197                                 lite_spot(y, x);\r
7198         \r
7199                                 /* Redraw the new spot */\r
7200                                 lite_spot(ny, nx);\r
7201         \r
7202                                 /* Player can move forward? */\r
7203                                 if (player_can_enter(c_ptr->feat, 0))\r
7204                                 {\r
7205                                         /* Move the player */\r
7206                                         if (!move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP)) break;\r
7207                                 }\r
7208                                 else\r
7209                                 {\r
7210                                         break;\r
7211                                 }\r
7212 \r
7213                                 /* -more- */\r
7214                                 if (i < 2) msg_print(NULL);\r
7215                         }\r
7216                 }\r
7217                 break;\r
7218 \r
7219         case 24:\r
7220                 if (name) return _("吸血鬼の牙", "Vampire's Fang");\r
7221                 if (desc) return _("攻撃した相手の体力を吸いとり、自分の体力を回復させる。生命を持たないモンスターには通じない。", \r
7222                         "Attacks with vampiric strikes which absorbs HP from a monster and gives them to you. No effect to unliving monsters.");\r
7223     \r
7224                 if (cast)\r
7225                 {\r
7226                         int y, x;\r
7227 \r
7228                         if (!get_rep_dir2(&dir)) return NULL;\r
7229                         if (dir == 5) return NULL;\r
7230 \r
7231                         y = p_ptr->y + ddy[dir];\r
7232                         x = p_ptr->x + ddx[dir];\r
7233 \r
7234                         if (cave[y][x].m_idx)\r
7235                                 py_attack(y, x, HISSATSU_DRAIN);\r
7236                         else\r
7237                         {\r
7238                                         msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
7239                                 return NULL;\r
7240                         }\r
7241                 }\r
7242                 break;\r
7243 \r
7244         case 25:\r
7245                 if (name) return _("幻惑", "Moon Dazzling");\r
7246                 if (desc) return _("視界内の起きている全モンスターに朦朧、混乱、眠りを与えようとする。", "Attempts to stun, confuse and sleep all waking monsters.");\r
7247     \r
7248                 if (cast)\r
7249                 {\r
7250                         msg_print(_("武器を不規則に揺らした...", "You irregularly wave your weapon..."));\r
7251                         project_hack(GF_ENGETSU, plev * 4);\r
7252                         project_hack(GF_ENGETSU, plev * 4);\r
7253                         project_hack(GF_ENGETSU, plev * 4);\r
7254                 }\r
7255                 break;\r
7256 \r
7257         case 26:\r
7258                 if (name) return _("百人斬り", "Hundred Slaughter");\r
7259                 if (desc) return _("連続して入身でモンスターを攻撃する。攻撃するたびにMPを消費。MPがなくなるか、モンスターを倒せなかったら百人斬りは終了する。", \r
7260                         "Performs a series of rush attacks. The series continues while killing each monster in a time and SP remains.");\r
7261     \r
7262                 if (cast)\r
7263                 {\r
7264                         const int mana_cost_per_monster = 8;\r
7265                         bool is_new = TRUE;\r
7266                         bool mdeath;\r
7267 \r
7268                         do\r
7269                         {\r
7270                                 if (!rush_attack(&mdeath)) break;\r
7271                                 if (is_new)\r
7272                                 {\r
7273                                         /* Reserve needed mana point */\r
7274                                         p_ptr->csp -= technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;\r
7275                                         is_new = FALSE;\r
7276                                 }\r
7277                                 else\r
7278                                         p_ptr->csp -= mana_cost_per_monster;\r
7279 \r
7280                                 if (!mdeath) break;\r
7281                                 command_dir = 0;\r
7282 \r
7283                                 p_ptr->redraw |= PR_MANA;\r
7284                                 handle_stuff();\r
7285                         }\r
7286                         while (p_ptr->csp > mana_cost_per_monster);\r
7287 \r
7288                         if (is_new) return NULL;\r
7289         \r
7290                         /* Restore reserved mana */\r
7291                         p_ptr->csp += technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;\r
7292                 }\r
7293                 break;\r
7294 \r
7295         case 27:\r
7296                 if (name) return _("天翔龍閃", "Dragonic Flash");\r
7297                 if (desc) return _("視界内の場所を指定して、その場所と自分の間にいる全モンスターを攻撃し、その場所に移動する。", \r
7298                         "Runs toward given location while attacking all monsters on the path.");\r
7299     \r
7300                 if (cast)\r
7301                 {\r
7302                         POSITION y, x;\r
7303 \r
7304                         if (!tgt_pt(&x, &y)) return NULL;\r
7305 \r
7306                         if (!cave_player_teleportable_bold(y, x, 0L) ||\r
7307                             (distance(y, x, p_ptr->y, p_ptr->x) > MAX_SIGHT / 2) ||\r
7308                             !projectable(p_ptr->y, p_ptr->x, y, x))\r
7309                         {\r
7310                                 msg_print(_("失敗!", "You cannot move to that place!"));\r
7311                                 break;\r
7312                         }\r
7313                         if (p_ptr->anti_tele)\r
7314                         {\r
7315                                 msg_print(_("不思議な力がテレポートを防いだ!", "A mysterious force prevents you from teleporting!"));\r
7316                                 break;\r
7317                         }\r
7318                         project(0, 0, y, x, HISSATSU_ISSEN, GF_ATTACK, PROJECT_BEAM | PROJECT_KILL, -1);\r
7319                         teleport_player_to(y, x, 0L);\r
7320                 }\r
7321                 break;\r
7322 \r
7323         case 28:\r
7324                 if (name) return _("二重の剣撃", "Twin Slash");\r
7325                 if (desc) return _("1ターンで2度攻撃を行う。", "double attacks at a time.");\r
7326     \r
7327                 if (cast)\r
7328                 {\r
7329                         int x, y;\r
7330         \r
7331                         if (!get_rep_dir(&dir, FALSE)) return NULL;\r
7332 \r
7333                         y = p_ptr->y + ddy[dir];\r
7334                         x = p_ptr->x + ddx[dir];\r
7335 \r
7336                         if (cave[y][x].m_idx)\r
7337                         {\r
7338                                 py_attack(y, x, 0);\r
7339                                 if (cave[y][x].m_idx)\r
7340                                 {\r
7341                                         handle_stuff();\r
7342                                         py_attack(y, x, 0);\r
7343                                 }\r
7344                         }\r
7345                         else\r
7346                         {\r
7347                                 msg_print(_("その方向にはモンスターはいません。", "You don't see any monster in this direction"));\r
7348                                 return NULL;\r
7349                         }\r
7350                 }\r
7351                 break;\r
7352 \r
7353         case 29:\r
7354                 if (name) return _("虎伏絶刀勢", "Kofuku-Zettousei");\r
7355                 if (desc) return _("強力な攻撃を行い、近くの場所にも効果が及ぶ。", "Performs a powerful attack which even effect nearby monsters.");\r
7356     \r
7357                 if (cast)\r
7358                 {\r
7359                         int total_damage = 0, basedam, i;\r
7360                         int y, x;\r
7361                         u32b flgs[TR_FLAG_SIZE];\r
7362                         object_type *o_ptr;\r
7363         \r
7364                         if (!get_rep_dir2(&dir)) return NULL;\r
7365                         if (dir == 5) return NULL;\r
7366 \r
7367                         y = p_ptr->y + ddy[dir];\r
7368                         x = p_ptr->x + ddx[dir];\r
7369 \r
7370                         if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)\r
7371                         {\r
7372                                 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));\r
7373                                 return "";\r
7374                         }\r
7375                         msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));\r
7376                         for (i = 0; i < 2; i++)\r
7377                         {\r
7378                                 int damage;\r
7379                                 if (!buki_motteruka(INVEN_RARM+i)) break;\r
7380                                 o_ptr = &inventory[INVEN_RARM+i];\r
7381                                 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;\r
7382                                 damage = o_ptr->to_d * 100;\r
7383                                 object_flags(o_ptr, flgs);\r
7384                                 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))\r
7385                                 {\r
7386                                         /* vorpal blade */\r
7387                                         basedam *= 5;\r
7388                                         basedam /= 3;\r
7389                                 }\r
7390                                 else if (have_flag(flgs, TR_VORPAL))\r
7391                                 {\r
7392                                         /* vorpal flag only */\r
7393                                         basedam *= 11;\r
7394                                         basedam /= 9;\r
7395                                 }\r
7396                                 damage += basedam;\r
7397                                 damage += p_ptr->to_d[i] * 100;\r
7398                                 damage *= p_ptr->num_blow[i];\r
7399                                 total_damage += (damage / 100);\r
7400                         }\r
7401                         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
7402                 }\r
7403                 break;\r
7404 \r
7405         case 30:\r
7406                 if (name) return _("慶雲鬼忍剣", "Keiun-Kininken");\r
7407                 if (desc) return _("自分もダメージをくらうが、相手に非常に大きなダメージを与える。アンデッドには特に効果がある。", \r
7408                         "Attacks a monster with extremely powerful damage. But you also takes some damages. Hurts a undead monster greatly.");\r
7409     \r
7410                 if (cast)\r
7411                 {\r
7412                         int y, x;\r
7413 \r
7414                         if (!get_rep_dir2(&dir)) return NULL;\r
7415                         if (dir == 5) return NULL;\r
7416 \r
7417                         y = p_ptr->y + ddy[dir];\r
7418                         x = p_ptr->x + ddx[dir];\r
7419 \r
7420                         if (cave[y][x].m_idx)\r
7421                                 py_attack(y, x, HISSATSU_UNDEAD);\r
7422                         else\r
7423                         {\r
7424                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
7425                                 return NULL;\r
7426                         }\r
7427                         take_hit(DAMAGE_NOESCAPE, 100 + randint1(100), _("慶雲鬼忍剣を使った衝撃", "exhaustion on using Keiun-Kininken"), -1);\r
7428                 }\r
7429                 break;\r
7430 \r
7431         case 31:\r
7432                 if (name) return _("切腹", "Harakiri");\r
7433                 if (desc) return _("「武士道とは、死ぬことと見つけたり。」", "'Busido is found in death'");\r
7434 \r
7435                 if (cast)\r
7436                 {\r
7437                         int i;\r
7438                         if (!get_check(_("本当に自殺しますか?", "Do you really want to commit suicide? "))) return NULL;\r
7439                                 /* Special Verification for suicide */\r
7440                         prt(_("確認のため '@' を押して下さい。", "Please verify SUICIDE by typing the '@' sign: "), 0, 0);\r
7441         \r
7442                         flush();\r
7443                         i = inkey();\r
7444                         prt("", 0, 0);\r
7445                         if (i != '@') return NULL;\r
7446                         if (p_ptr->total_winner)\r
7447                         {\r
7448                                 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);\r
7449                                 p_ptr->total_winner = TRUE;\r
7450                         }\r
7451                         else\r
7452                         {\r
7453                                 msg_print(_("武士道とは、死ぬことと見つけたり。", "Meaning of Bushi-do is found in the death."));\r
7454                                 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);\r
7455                         }\r
7456                 }\r
7457                 break;\r
7458         }\r
7459 \r
7460         return "";\r
7461 }\r
7462 \r
7463 /*!\r
7464  * @brief 呪術領域の武器呪縛の対象にできる武器かどうかを返す。 / An "item_tester_hook" for offer\r
7465  * @param o_ptr オブジェクト構造体の参照ポインタ\r
7466  * @return 呪縛可能な武器ならばTRUEを返す\r
7467  */\r
7468 static bool item_tester_hook_weapon_except_bow(object_type *o_ptr)\r
7469 {\r
7470         switch (o_ptr->tval)\r
7471         {\r
7472                 case TV_SWORD:\r
7473                 case TV_HAFTED:\r
7474                 case TV_POLEARM:\r
7475                 case TV_DIGGING:\r
7476                 {\r
7477                         return (TRUE);\r
7478                 }\r
7479         }\r
7480 \r
7481         return (FALSE);\r
7482 }\r
7483 \r
7484 /*!\r
7485  * @brief 呪術領域の各処理に使える呪われた装備かどうかを返す。 / An "item_tester_hook" for offer\r
7486  * @param o_ptr オブジェクト構造体の参照ポインタ\r
7487  * @return 使える装備ならばTRUEを返す\r
7488  */\r
7489 static bool item_tester_hook_cursed(object_type *o_ptr)\r
7490 {\r
7491         return (bool)(object_is_cursed(o_ptr));\r
7492 }\r
7493 \r
7494 /*!\r
7495  * @brief 呪術領域魔法の各処理を行う\r
7496  * @param spell 魔法ID\r
7497  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_CONT / SPELL_STOP)\r
7498  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。\r
7499  */\r
7500 static cptr do_hex_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
7501 {\r
7502         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
7503         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
7504         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
7505         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
7506         bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;\r
7507         bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;\r
7508 \r
7509         bool add = TRUE;\r
7510 \r
7511         PLAYER_LEVEL plev = p_ptr->lev;\r
7512         HIT_POINT power;\r
7513 \r
7514         switch (spell)\r
7515         {\r
7516         /*** 1st book (0-7) ***/\r
7517         case 0:\r
7518                 if (name) return _("邪なる祝福", "Evily blessing");\r
7519                 if (desc) return _("祝福により攻撃精度と防御力が上がる。", "Attempts to increase +to_hit of a weapon and AC");\r
7520                 if (cast)\r
7521                 {\r
7522                         if (!p_ptr->blessed)\r
7523                         {\r
7524                                 msg_print(_("高潔な気分になった!", "You feel righteous!"));\r
7525                         }\r
7526                 }\r
7527                 if (stop)\r
7528                 {\r
7529                         if (!p_ptr->blessed)\r
7530                         {\r
7531                                 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));\r
7532                         }\r
7533                 }\r
7534                 break;\r
7535 \r
7536         case 1:\r
7537                 if (name) return _("軽傷の治癒", "Cure light wounds");\r
7538                 if (desc) return _("HPや傷を少し回復させる。", "Heals cut and HP a little.");\r
7539                 if (info) return info_heal(1, 10, 0);\r
7540                 if (cast)\r
7541                 {\r
7542                         msg_print(_("気分が良くなってくる。", "You feel better and better."));\r
7543                 }\r
7544                 if (cast || cont)\r
7545                 {\r
7546                         hp_player(damroll(1, 10));\r
7547                         set_cut(p_ptr->cut - 10);\r
7548                 }\r
7549                 break;\r
7550 \r
7551         case 2:\r
7552                 if (name) return _("悪魔のオーラ", "Demonic aura");\r
7553                 if (desc) return _("炎のオーラを身にまとい、回復速度が速くなる。", "Gives fire aura and regeneration.");\r
7554                 if (cast)\r
7555                 {\r
7556                         msg_print(_("体が炎のオーラで覆われた。", "You have enveloped by fiery aura!"));\r
7557                 }\r
7558                 if (stop)\r
7559                 {\r
7560                         msg_print(_("炎のオーラが消え去った。", "Fiery aura disappeared."));\r
7561                 }\r
7562                 break;\r
7563 \r
7564         case 3:\r
7565                 if (name) return _("悪臭霧", "Stinking mist");\r
7566                 if (desc) return _("視界内のモンスターに微弱量の毒のダメージを与える。", "Deals few damages of poison to all monsters in your sight.");\r
7567                 power = plev / 2 + 5;\r
7568                 if (info) return info_damage(1, power, 0);\r
7569                 if (cast || cont)\r
7570                 {\r
7571                         project_hack(GF_POIS, randint1(power));\r
7572                 }\r
7573                 break;\r
7574 \r
7575         case 4:\r
7576                 if (name) return _("腕力強化", "Extra might");\r
7577                 if (desc) return _("術者の腕力を上昇させる。", "Attempts to increase your strength.");\r
7578                 if (cast)\r
7579                 {\r
7580                         msg_print(_("何だか力が湧いて来る。", "You feel you get stronger."));\r
7581                 }\r
7582                 break;\r
7583 \r
7584         case 5:\r
7585                 if (name) return _("武器呪縛", "Curse weapon");\r
7586                 if (desc) return _("装備している武器を呪う。", "Curses your weapon.");\r
7587                 if (cast)\r
7588                 {\r
7589                         OBJECT_IDX item;\r
7590                         cptr q, s;\r
7591                         char o_name[MAX_NLEN];\r
7592                         object_type *o_ptr;\r
7593                         u32b f[TR_FLAG_SIZE];\r
7594 \r
7595                         item_tester_hook = item_tester_hook_weapon_except_bow;\r
7596                         q = _("どれを呪いますか?", "Which weapon do you curse?");\r
7597                         s = _("武器を装備していない。", "You wield no weapons.");\r
7598 \r
7599                         if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;\r
7600 \r
7601                         o_ptr = &inventory[item];\r
7602                         object_desc(o_name, o_ptr, OD_NAME_ONLY);\r
7603                         object_flags(o_ptr, f);\r
7604 \r
7605                         if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;\r
7606 \r
7607                         if (!one_in_(3) &&\r
7608                                 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))\r
7609                         {\r
7610                                 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);\r
7611                                 if (one_in_(3))\r
7612                                 {\r
7613                                         if (o_ptr->to_d > 0)\r
7614                                         {\r
7615                                                 o_ptr->to_d -= randint1(3) % 2;\r
7616                                                 if (o_ptr->to_d < 0) o_ptr->to_d = 0;\r
7617                                         }\r
7618                                         if (o_ptr->to_h > 0)\r
7619                                         {\r
7620                                                 o_ptr->to_h -= randint1(3) % 2;\r
7621                                                 if (o_ptr->to_h < 0) o_ptr->to_h = 0;\r
7622                                         }\r
7623                                         if (o_ptr->to_a > 0)\r
7624                                         {\r
7625                                                 o_ptr->to_a -= randint1(3) % 2;\r
7626                                                 if (o_ptr->to_a < 0) o_ptr->to_a = 0;\r
7627                                         }\r
7628                                         msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);\r
7629                                 }\r
7630                         }\r
7631                         else\r
7632                         {\r
7633                                 int curse_rank = 0;\r
7634                                 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);\r
7635                                 o_ptr->curse_flags |= (TRC_CURSED);\r
7636 \r
7637                                 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))\r
7638                                 {\r
7639 \r
7640                                         if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);\r
7641                                         if (one_in_(666))\r
7642                                         {\r
7643                                                 o_ptr->curse_flags |= (TRC_TY_CURSE);\r
7644                                                 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);\r
7645 \r
7646                                                 add_flag(o_ptr->art_flags, TR_AGGRAVATE);\r
7647                                                 add_flag(o_ptr->art_flags, TR_VORPAL);\r
7648                                                 add_flag(o_ptr->art_flags, TR_VAMPIRIC);\r
7649                                                 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));\r
7650                                                 curse_rank = 2;\r
7651                                         }\r
7652                                 }\r
7653 \r
7654                                 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);\r
7655                         }\r
7656 \r
7657                         p_ptr->update |= (PU_BONUS);\r
7658                         add = FALSE;\r
7659                 }\r
7660                 break;\r
7661 \r
7662         case 6:\r
7663                 if (name) return _("邪悪感知", "Evil detection");\r
7664                 if (desc) return _("周囲の邪悪なモンスターを感知する。", "Detects evil monsters.");\r
7665                 if (info) return info_range(MAX_SIGHT);\r
7666                 if (cast)\r
7667                 {\r
7668                         msg_print(_("邪悪な生物の存在を感じ取ろうとした。", "You attend to the presence of evil creatures."));\r
7669                 }\r
7670                 break;\r
7671 \r
7672         case 7:\r
7673                 if (name) return _("我慢", "Patience");\r
7674                 if (desc) return _("数ターン攻撃を耐えた後、受けたダメージを地獄の業火として周囲に放出する。", \r
7675                         "Bursts hell fire strongly after patients any damage while few turns.");\r
7676                 power = MIN(200, (HEX_REVENGE_POWER(p_ptr) * 2));\r
7677                 if (info) return info_damage(0, 0, power);\r
7678                 if (cast)\r
7679                 {\r
7680                         int a = 3 - (p_ptr->pspeed - 100) / 10;\r
7681                         MAGIC_NUM2 r = 3 + randint1(3) + MAX(0, MIN(3, a));\r
7682 \r
7683                         if (HEX_REVENGE_TURN(p_ptr) > 0)\r
7684                         {\r
7685                                 msg_print(_("すでに我慢をしている。", "You are already patienting."));\r
7686                                 return NULL;\r
7687                         }\r
7688 \r
7689                         HEX_REVENGE_TYPE(p_ptr) = 1;\r
7690                         HEX_REVENGE_TURN(p_ptr) = r;\r
7691                         HEX_REVENGE_POWER(p_ptr) = 0;\r
7692                         msg_print(_("じっと耐えることにした。", "You decide to patient all damages."));\r
7693                         add = FALSE;\r
7694                 }\r
7695                 if (cont)\r
7696                 {\r
7697                         int rad = 2 + (power / 50);\r
7698 \r
7699                         HEX_REVENGE_TURN(p_ptr)--;\r
7700 \r
7701                         if ((HEX_REVENGE_TURN(p_ptr) <= 0) || (power >= 200))\r
7702                         {\r
7703                                 msg_print(_("我慢が解かれた!", "Time for end of patioence!"));\r
7704                                 if (power)\r
7705                                 {\r
7706                                         project(0, rad, p_ptr->y, p_ptr->x, power, GF_HELL_FIRE,\r
7707                                                 (PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);\r
7708                                 }\r
7709                                 if (p_ptr->wizard)\r
7710                                 {\r
7711                                         msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);\r
7712                                 }\r
7713 \r
7714                                 /* Reset */\r
7715                                 HEX_REVENGE_TYPE(p_ptr) = 0;\r
7716                                 HEX_REVENGE_TURN(p_ptr) = 0;\r
7717                                 HEX_REVENGE_POWER(p_ptr) = 0;\r
7718                         }\r
7719                 }\r
7720                 break;\r
7721 \r
7722         /*** 2nd book (8-15) ***/\r
7723         case 8:\r
7724                 if (name) return _("氷の鎧", "Ice armor");\r
7725                 if (desc) return _("氷のオーラを身にまとい、防御力が上昇する。", "Gives fire aura and bonus to AC.");\r
7726                 if (cast)\r
7727                 {\r
7728                         msg_print(_("体が氷の鎧で覆われた。", "You have enveloped by ice armor!"));\r
7729                 }\r
7730                 if (stop)\r
7731                 {\r
7732                         msg_print(_("氷の鎧が消え去った。", "Ice armor disappeared."));\r
7733                 }\r
7734                 break;\r
7735 \r
7736         case 9:\r
7737                 if (name) return _("重傷の治癒", "Cure serious wounds");\r
7738                 if (desc) return _("体力や傷を多少回復させる。", "Heals cut and HP more.");\r
7739                 if (info) return info_heal(2, 10, 0);\r
7740                 if (cast)\r
7741                 {\r
7742                         msg_print(_("気分が良くなってくる。", "You feel better and better."));\r
7743                 }\r
7744                 if (cast || cont)\r
7745                 {\r
7746                         hp_player(damroll(2, 10));\r
7747                         set_cut((p_ptr->cut / 2) - 10);\r
7748                 }\r
7749                 break;\r
7750 \r
7751         case 10:\r
7752                 if (name) return _("薬品吸入", "Inhail potion");\r
7753                 if (desc) return _("呪文詠唱を中止することなく、薬の効果を得ることができる。", "Quaffs a potion without canceling of casting a spell.");\r
7754                 if (cast)\r
7755                 {\r
7756                         CASTING_HEX_FLAGS(p_ptr) |= (1L << HEX_INHAIL);\r
7757                         do_cmd_quaff_potion();\r
7758                         CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_INHAIL);\r
7759                         add = FALSE;\r
7760                 }\r
7761                 break;\r
7762 \r
7763         case 11:\r
7764                 if (name) return _("衰弱の霧", "Hypodynamic mist");\r
7765                 if (desc) return _("視界内のモンスターに微弱量の衰弱属性のダメージを与える。", \r
7766                         "Deals few damages of hypodynamia to all monsters in your sight.");\r
7767                 power = (plev / 2) + 5;\r
7768                 if (info) return info_damage(1, power, 0);\r
7769                 if (cast || cont)\r
7770                 {\r
7771                         project_hack(GF_HYPODYNAMIA, randint1(power));\r
7772                 }\r
7773                 break;\r
7774 \r
7775         case 12:\r
7776                 if (name) return _("魔剣化", "Swords to runeswords");\r
7777                 if (desc) return _("武器の攻撃力を上げる。切れ味を得、呪いに応じて与えるダメージが上昇し、善良なモンスターに対するダメージが2倍になる。", \r
7778                         "Gives vorpal ability to your weapon. Increases damages by your weapon acccording to curse of your weapon.");\r
7779                 if (cast)\r
7780                 {\r
7781 #ifdef JP\r
7782                         msg_print("あなたの武器が黒く輝いた。");\r
7783 #else\r
7784                         if (!empty_hands(FALSE))\r
7785                                 msg_print("Your weapons glow bright black.");\r
7786                         else\r
7787                                 msg_print("Your weapon glows bright black.");\r
7788 #endif\r
7789                 }\r
7790                 if (stop)\r
7791                 {\r
7792 #ifdef JP\r
7793                         msg_print("武器の輝きが消え去った。");\r
7794 #else\r
7795                         msg_format("Brightness of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");\r
7796 #endif\r
7797                 }\r
7798                 break;\r
7799 \r
7800         case 13:\r
7801                 if (name) return _("混乱の手", "Touch of confusion");\r
7802                 if (desc) return _("攻撃した際モンスターを混乱させる。", "Confuses a monster when you attack.");\r
7803                 if (cast)\r
7804                 {\r
7805                         msg_print(_("あなたの手が赤く輝き始めた。", "Your hands glow bright red."));\r
7806                 }\r
7807                 if (stop)\r
7808                 {\r
7809                         msg_print(_("手の輝きがなくなった。", "Brightness on your hands disappeard."));\r
7810                 }\r
7811                 break;\r
7812 \r
7813         case 14:\r
7814                 if (name) return _("肉体強化", "Building up");\r
7815                 if (desc) return _("術者の腕力、器用さ、耐久力を上昇させる。攻撃回数の上限を 1 増加させる。", \r
7816                         "Attempts to increases your strength, dexterity and constitusion.");\r
7817                 if (cast)\r
7818                 {\r
7819                         msg_print(_("身体が強くなった気がした。", "You feel your body is developed more now."));\r
7820                 }\r
7821                 break;\r
7822 \r
7823         case 15:\r
7824                 if (name) return _("反テレポート結界", "Anti teleport barrier");\r
7825                 if (desc) return _("視界内のモンスターのテレポートを阻害するバリアを張る。", "Obstructs all teleportations by monsters in your sight.");\r
7826                 power = plev * 3 / 2;\r
7827                 if (info) return info_power(power);\r
7828                 if (cast)\r
7829                 {\r
7830                         msg_print(_("テレポートを防ぐ呪いをかけた。", "You feel anyone can not teleport except you."));\r
7831                 }\r
7832                 break;\r
7833 \r
7834         /*** 3rd book (16-23) ***/\r
7835         case 16:\r
7836                 if (name) return _("衝撃のクローク", "Cloak of shock");\r
7837                 if (desc) return _("電気のオーラを身にまとい、動きが速くなる。", "Gives lightning aura and a bonus to speed.");\r
7838                 if (cast)\r
7839                 {\r
7840                         msg_print(_("体が稲妻のオーラで覆われた。", "You have enveloped by electrical aura!"));\r
7841                 }\r
7842                 if (stop)\r
7843                 {\r
7844                         msg_print(_("稲妻のオーラが消え去った。", "Electrical aura disappeared."));\r
7845                 }\r
7846                 break;\r
7847 \r
7848         case 17:\r
7849                 if (name) return _("致命傷の治癒", "Cure critical wounds");\r
7850                 if (desc) return _("体力や傷を回復させる。", "Heals cut and HP greatry.");\r
7851                 if (info) return info_heal(4, 10, 0);\r
7852                 if (cast)\r
7853                 {\r
7854                         msg_print(_("気分が良くなってくる。", "You feel better and better."));\r
7855                 }\r
7856                 if (cast || cont)\r
7857                 {\r
7858                         hp_player(damroll(4, 10));\r
7859                         set_stun(0);\r
7860                         set_cut(0);\r
7861                         set_poisoned(0);\r
7862                 }\r
7863                 break;\r
7864 \r
7865         case 18:\r
7866                 if (name) return _("呪力封入", "Recharging");\r
7867                 if (desc) return _("魔法の道具に魔力を再充填する。", "Recharges a magic device.");\r
7868                 power = plev * 2;\r
7869                 if (info) return info_power(power);\r
7870                 if (cast)\r
7871                 {\r
7872                         if (!recharge(power)) return NULL;\r
7873                         add = FALSE;\r
7874                 }\r
7875                 break;\r
7876 \r
7877         case 19:\r
7878                 if (name) return _("死者復活", "Animate Dead");\r
7879                 if (desc) return _("死体を蘇らせてペットにする。", "Raises corpses and skeletons from dead.");\r
7880                 if (cast)\r
7881                 {\r
7882                         msg_print(_("死者への呼びかけを始めた。", "You start to call deads.!"));\r
7883                 }\r
7884                 if (cast || cont)\r
7885                 {\r
7886                         animate_dead(0, p_ptr->y, p_ptr->x);\r
7887                 }\r
7888                 break;\r
7889 \r
7890         case 20:\r
7891                 if (name) return _("防具呪縛", "Curse armor");\r
7892                 if (desc) return _("装備している防具に呪いをかける。", "Curse a piece of armour that you wielding.");\r
7893                 if (cast)\r
7894                 {\r
7895                         OBJECT_IDX item;\r
7896                         cptr q, s;\r
7897                         char o_name[MAX_NLEN];\r
7898                         object_type *o_ptr;\r
7899                         u32b f[TR_FLAG_SIZE];\r
7900 \r
7901                         item_tester_hook = object_is_armour;\r
7902                         q = _("どれを呪いますか?", "Which piece of armour do you curse?");\r
7903                         s = _("防具を装備していない。", "You wield no piece of armours.");\r
7904 \r
7905                         if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;\r
7906 \r
7907                         o_ptr = &inventory[item];\r
7908                         object_desc(o_name, o_ptr, OD_NAME_ONLY);\r
7909                         object_flags(o_ptr, f);\r
7910 \r
7911                         if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;\r
7912 \r
7913                         if (!one_in_(3) &&\r
7914                                 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))\r
7915                         {\r
7916                                 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);\r
7917                                 if (one_in_(3))\r
7918                                 {\r
7919                                         if (o_ptr->to_d > 0)\r
7920                                         {\r
7921                                                 o_ptr->to_d -= randint1(3) % 2;\r
7922                                                 if (o_ptr->to_d < 0) o_ptr->to_d = 0;\r
7923                                         }\r
7924                                         if (o_ptr->to_h > 0)\r
7925                                         {\r
7926                                                 o_ptr->to_h -= randint1(3) % 2;\r
7927                                                 if (o_ptr->to_h < 0) o_ptr->to_h = 0;\r
7928                                         }\r
7929                                         if (o_ptr->to_a > 0)\r
7930                                         {\r
7931                                                 o_ptr->to_a -= randint1(3) % 2;\r
7932                                                 if (o_ptr->to_a < 0) o_ptr->to_a = 0;\r
7933                                         }\r
7934                                         msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);\r
7935                                 }\r
7936                         }\r
7937                         else\r
7938                         {\r
7939                                 int curse_rank = 0;\r
7940                                 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);\r
7941                                 o_ptr->curse_flags |= (TRC_CURSED);\r
7942 \r
7943                                 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))\r
7944                                 {\r
7945 \r
7946                                         if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);\r
7947                                         if (one_in_(666))\r
7948                                         {\r
7949                                                 o_ptr->curse_flags |= (TRC_TY_CURSE);\r
7950                                                 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);\r
7951 \r
7952                                                 add_flag(o_ptr->art_flags, TR_AGGRAVATE);\r
7953                                                 add_flag(o_ptr->art_flags, TR_RES_POIS);\r
7954                                                 add_flag(o_ptr->art_flags, TR_RES_DARK);\r
7955                                                 add_flag(o_ptr->art_flags, TR_RES_NETHER);\r
7956                                                 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));\r
7957                                                 curse_rank = 2;\r
7958                                         }\r
7959                                 }\r
7960 \r
7961                                 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);\r
7962                         }\r
7963 \r
7964                         p_ptr->update |= (PU_BONUS);\r
7965                         add = FALSE;\r
7966                 }\r
7967                 break;\r
7968 \r
7969         case 21:\r
7970                 if (name) return _("影のクローク", "Cloak of shadow");\r
7971                 if (desc) return _("影のオーラを身にまとい、敵に影のダメージを与える。", "Gives aura of shadow.");\r
7972                 if (cast)\r
7973                 {\r
7974                         object_type *o_ptr = &inventory[INVEN_OUTER];\r
7975 \r
7976                         if (!o_ptr->k_idx)\r
7977                         {\r
7978                                 msg_print(_("クロークを身につけていない!", "You don't ware any cloak."));\r
7979                                 return NULL;\r
7980                         }\r
7981                         else if (!object_is_cursed(o_ptr))\r
7982                         {\r
7983                                 msg_print(_("クロークは呪われていない!", "Your cloak is not cursed."));\r
7984                                 return NULL;\r
7985                         }\r
7986                         else\r
7987                         {\r
7988                                 msg_print(_("影のオーラを身にまとった。", "You have enveloped by shadow aura!"));\r
7989                         }\r
7990                 }\r
7991                 if (cont)\r
7992                 {\r
7993                         object_type *o_ptr = &inventory[INVEN_OUTER];\r
7994 \r
7995                         if ((!o_ptr->k_idx) || (!object_is_cursed(o_ptr)))\r
7996                         {\r
7997                                 do_spell(REALM_HEX, spell, SPELL_STOP);\r
7998                                 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << spell);\r
7999                                 CASTING_HEX_NUM(p_ptr)--;\r
8000                                 if (!SINGING_SONG_ID(p_ptr)) set_action(ACTION_NONE);\r
8001                         }\r
8002                 }\r
8003                 if (stop)\r
8004                 {\r
8005                         msg_print(_("影のオーラが消え去った。", "Shadow aura disappeared."));\r
8006                 }\r
8007                 break;\r
8008 \r
8009         case 22:\r
8010                 if (name) return _("苦痛を魔力に", "Pains to mana");\r
8011                 if (desc) return _("視界内のモンスターに精神ダメージ与え、魔力を吸い取る。", "Deals psychic damages to all monsters in sight, and drains some mana.");\r
8012                 power = plev * 3 / 2;\r
8013                 if (info) return info_damage(1, power, 0);\r
8014                 if (cast || cont)\r
8015                 {\r
8016                         project_hack(GF_PSI_DRAIN, randint1(power));\r
8017                 }\r
8018                 break;\r
8019 \r
8020         case 23:\r
8021                 if (name) return _("目には目を", "Eye for an eye");\r
8022                 if (desc) return _("打撃や魔法で受けたダメージを、攻撃元のモンスターにも与える。", "Returns same damage which you got to the monster which damaged you.");\r
8023                 if (cast)\r
8024                 {\r
8025                         msg_print(_("復讐したい欲望にかられた。", "You wish strongly you want to revenge anything."));\r
8026                 }\r
8027                 break;\r
8028 \r
8029         /*** 4th book (24-31) ***/\r
8030         case 24:\r
8031                 if (name) return _("反増殖結界", "Anti multiply barrier");\r
8032                 if (desc) return _("その階の増殖するモンスターの増殖を阻止する。", "Obstructs all multiplying by monsters in entire floor.");\r
8033                 if (cast)\r
8034                 {\r
8035                         msg_print(_("増殖を阻止する呪いをかけた。", "You feel anyone can not already multiply."));\r
8036                 }\r
8037                 break;\r
8038 \r
8039         case 25:\r
8040                 if (name) return _("全復活", "Restoration");\r
8041                 if (desc) return _("経験値を徐々に復活し、減少した能力値を回復させる。", "Restores experience and status.");\r
8042                 if (cast)\r
8043                 {\r
8044                         msg_print(_("体が元の活力を取り戻し始めた。", "You feel your lost status starting to return."));\r
8045                 }\r
8046                 if (cast || cont)\r
8047                 {\r
8048                         bool flag = FALSE;\r
8049                         int d = (p_ptr->max_exp - p_ptr->exp);\r
8050                         int r = (p_ptr->exp / 20);\r
8051                         int i;\r
8052 \r
8053                         if (d > 0)\r
8054                         {\r
8055                                 if (d < r)\r
8056                                         p_ptr->exp = p_ptr->max_exp;\r
8057                                 else\r
8058                                         p_ptr->exp += r;\r
8059 \r
8060                                 /* Check the experience */\r
8061                                 check_experience();\r
8062 \r
8063                                 flag = TRUE;\r
8064                         }\r
8065                         for (i = A_STR; i < 6; i ++)\r
8066                         {\r
8067                                 if (p_ptr->stat_cur[i] < p_ptr->stat_max[i])\r
8068                                 {\r
8069                                         if (p_ptr->stat_cur[i] < 18)\r
8070                                                 p_ptr->stat_cur[i]++;\r
8071                                         else\r
8072                                                 p_ptr->stat_cur[i] += 10;\r
8073 \r
8074                                         if (p_ptr->stat_cur[i] > p_ptr->stat_max[i])\r
8075                                                 p_ptr->stat_cur[i] = p_ptr->stat_max[i];\r
8076 \r
8077                                         /* Recalculate bonuses */\r
8078                                         p_ptr->update |= (PU_BONUS);\r
8079 \r
8080                                         flag = TRUE;\r
8081                                 }\r
8082                         }\r
8083 \r
8084                         if (!flag)\r
8085                         {\r
8086                                 msg_format(_("%sの呪文の詠唱をやめた。", "Finish casting '%^s'."), do_spell(REALM_HEX, HEX_RESTORE, SPELL_NAME));\r
8087                                 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_RESTORE);\r
8088                                 if (cont) CASTING_HEX_NUM(p_ptr)--;\r
8089                                 if (CASTING_HEX_NUM(p_ptr)) p_ptr->action = ACTION_NONE;\r
8090 \r
8091                                 /* Redraw status */\r
8092                                 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);\r
8093                                 p_ptr->redraw |= (PR_EXTRA);\r
8094 \r
8095                                 return "";\r
8096                         }\r
8097                 }\r
8098                 break;\r
8099 \r
8100         case 26:\r
8101                 if (name) return _("呪力吸収", "Drain curse power");\r
8102                 if (desc) return _("呪われた武器の呪いを吸収して魔力を回復する。", "Drains curse on your weapon and heals SP a little.");\r
8103                 if (cast)\r
8104                 {\r
8105                         OBJECT_IDX item;\r
8106                         cptr s, q;\r
8107                         u32b f[TR_FLAG_SIZE];\r
8108                         object_type *o_ptr;\r
8109 \r
8110                         item_tester_hook = item_tester_hook_cursed;\r
8111                         q = _("どの装備品から吸収しますか?", "Which cursed equipment do you drain mana from?");\r
8112                         s = _("呪われたアイテムを装備していない。", "You have no cursed equipment.");\r
8113 \r
8114                         if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;\r
8115 \r
8116                         o_ptr = &inventory[item];\r
8117                         object_flags(o_ptr, f);\r
8118 \r
8119                         p_ptr->csp += (p_ptr->lev / 5) + randint1(p_ptr->lev / 5);\r
8120                         if (have_flag(f, TR_TY_CURSE) || (o_ptr->curse_flags & TRC_TY_CURSE)) p_ptr->csp += randint1(5);\r
8121                         if (p_ptr->csp > p_ptr->msp) p_ptr->csp = p_ptr->msp;\r
8122 \r
8123                         if (o_ptr->curse_flags & TRC_PERMA_CURSE)\r
8124                         {\r
8125                                 /* Nothing */\r
8126                         }\r
8127                         else if (o_ptr->curse_flags & TRC_HEAVY_CURSE)\r
8128                         {\r
8129                                 if (one_in_(7))\r
8130                                 {\r
8131                                         msg_print(_("呪いを全て吸い取った。", "Heavy curse vanished away."));\r
8132                                         o_ptr->curse_flags = 0L;\r
8133                                 }\r
8134                         }\r
8135                         else if ((o_ptr->curse_flags & (TRC_CURSED)) && one_in_(3))\r
8136                         {\r
8137                                 msg_print(_("呪いを全て吸い取った。", "Curse vanished away."));\r
8138                                 o_ptr->curse_flags = 0L;\r
8139                         }\r
8140 \r
8141                         add = FALSE;\r
8142                 }\r
8143                 break;\r
8144 \r
8145         case 27:\r
8146                 if (name) return _("吸血の刃", "Swords to vampires");\r
8147                 if (desc) return _("吸血属性で攻撃する。", "Gives vampiric ability to your weapon.");\r
8148                 if (cast)\r
8149                 {\r
8150 #ifdef JP\r
8151                         msg_print("あなたの武器が血を欲している。");\r
8152 #else\r
8153                         if (!empty_hands(FALSE))\r
8154                                 msg_print("Your weapons want more blood now.");\r
8155                         else\r
8156                                 msg_print("Your weapon wants more blood now.");\r
8157 #endif\r
8158                 }\r
8159                 if (stop)\r
8160                 {\r
8161 #ifdef JP\r
8162                         msg_print("武器の渇望が消え去った。");\r
8163 #else\r
8164                         msg_format("Thirsty of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");\r
8165 #endif\r
8166                 }\r
8167                 break;\r
8168 \r
8169         case 28:\r
8170                 if (name) return _("朦朧の言葉", "Word of stun");\r
8171                 if (desc) return _("視界内のモンスターを朦朧とさせる。", "Stuns all monsters in your sight.");\r
8172                 power = plev * 4;\r
8173                 if (info) return info_power(power);\r
8174                 if (cast || cont)\r
8175                 {\r
8176                         stun_monsters(power);\r
8177                 }\r
8178                 break;\r
8179 \r
8180         case 29:\r
8181                 if (name) return _("影移動", "Moving into shadow");\r
8182                 if (desc) return _("モンスターの隣のマスに瞬間移動する。", "Teleports you close to a monster.");\r
8183                 if (cast)\r
8184                 {\r
8185                         int i, dir;\r
8186                         POSITION y, x;\r
8187                         bool flag;\r
8188 \r
8189                         for (i = 0; i < 3; i++)\r
8190                         {\r
8191                                 if (!tgt_pt(&x, &y)) return FALSE;\r
8192 \r
8193                                 flag = FALSE;\r
8194 \r
8195                                 for (dir = 0; dir < 8; dir++)\r
8196                                 {\r
8197                                         int dy = y + ddy_ddd[dir];\r
8198                                         int dx = x + ddx_ddd[dir];\r
8199                                         if (dir == 5) continue;\r
8200                                         if(cave[dy][dx].m_idx) flag = TRUE;\r
8201                                 }\r
8202 \r
8203                                 if (!cave_empty_bold(y, x) || (cave[y][x].info & CAVE_ICKY) ||\r
8204                                         (distance(y, x, p_ptr->y, p_ptr->x) > plev + 2))\r
8205                                 {\r
8206                                         msg_print(_("そこには移動できない。", "Can not teleport to there."));\r
8207                                         continue;\r
8208                                 }\r
8209                                 break;\r
8210                         }\r
8211 \r
8212                         if (flag && randint0(plev * plev / 2))\r
8213                         {\r
8214                                 teleport_player_to(y, x, 0L);\r
8215                         }\r
8216                         else\r
8217                         {\r
8218                                 msg_print(_("おっと!", "Oops!"));\r
8219                                 teleport_player(30, 0L);\r
8220                         }\r
8221 \r
8222                         add = FALSE;\r
8223                 }\r
8224                 break;\r
8225 \r
8226         case 30:\r
8227                 if (name) return _("反魔法結界", "Anti magic barrier");\r
8228                 if (desc) return _("視界内のモンスターの魔法を阻害するバリアを張る。", "Obstructs all magic spell of monsters in your sight.");\r
8229                 power = plev * 3 / 2;\r
8230                 if (info) return info_power(power);\r
8231                 if (cast)\r
8232                 {\r
8233                         msg_print(_("魔法を防ぐ呪いをかけた。", "You feel anyone can not cast spells except you."));\r
8234                 }\r
8235                 break;\r
8236 \r
8237         case 31:\r
8238                 if (name) return _("復讐の宣告", "Revenge sentence");\r
8239                 if (desc) return _("数ターン後にそれまで受けたダメージに応じた威力の地獄の劫火の弾を放つ。", \r
8240                         "Fires  a ball of hell fire to try revenging after few turns.");\r
8241                 power = HEX_REVENGE_POWER(p_ptr);\r
8242                 if (info) return info_damage(0, 0, power);\r
8243                 if (cast)\r
8244                 {\r
8245                         MAGIC_NUM2 r;\r
8246                         int a = 3 - (p_ptr->pspeed - 100) / 10;\r
8247                         r = 1 + randint1(2) + MAX(0, MIN(3, a));\r
8248 \r
8249                         if (HEX_REVENGE_TURN(p_ptr) > 0)\r
8250                         {\r
8251                                 msg_print(_("すでに復讐は宣告済みだ。", "You already pronounced your revenge."));\r
8252                                 return NULL;\r
8253                         }\r
8254 \r
8255                         HEX_REVENGE_TYPE(p_ptr) = 2;\r
8256                         HEX_REVENGE_TURN(p_ptr) = r;\r
8257                         msg_format(_("あなたは復讐を宣告した。あと %d ターン。", "You pronounce your revenge. %d turns left."), r);\r
8258                         add = FALSE;\r
8259                 }\r
8260                 if (cont)\r
8261                 {\r
8262                         HEX_REVENGE_TURN(p_ptr)--;\r
8263 \r
8264                         if (HEX_REVENGE_TURN(p_ptr) <= 0)\r
8265                         {\r
8266                                 int dir;\r
8267 \r
8268                                 if (power)\r
8269                                 {\r
8270                                         command_dir = 0;\r
8271 \r
8272                                         do\r
8273                                         {\r
8274                                                 msg_print(_("復讐の時だ!", "Time to revenge!"));\r
8275                                         }\r
8276                                         while (!get_aim_dir(&dir));\r
8277 \r
8278                                         fire_ball(GF_HELL_FIRE, dir, power, 1);\r
8279 \r
8280                                         if (p_ptr->wizard)\r
8281                                         {\r
8282                                                 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);\r
8283                                         }\r
8284                                 }\r
8285                                 else\r
8286                                 {\r
8287                                         msg_print(_("復讐する気が失せた。", "You are not a mood to revenge."));\r
8288                                 }\r
8289                                 HEX_REVENGE_POWER(p_ptr) = 0;\r
8290                         }\r
8291                 }\r
8292                 break;\r
8293         }\r
8294 \r
8295         /* start casting */\r
8296         if ((cast) && (add))\r
8297         {\r
8298                 /* add spell */\r
8299                 CASTING_HEX_FLAGS(p_ptr) |= 1L << (spell);\r
8300                 CASTING_HEX_NUM(p_ptr)++;\r
8301 \r
8302                 if (p_ptr->action != ACTION_SPELL) set_action(ACTION_SPELL);\r
8303         }\r
8304 \r
8305         /* Redraw status */\r
8306         if (!info)\r
8307         {\r
8308                 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);\r
8309                 p_ptr->redraw |= (PR_EXTRA | PR_HP | PR_MANA);\r
8310         }\r
8311 \r
8312         return "";\r
8313 }\r
8314 \r
8315 \r
8316 /*!\r
8317  * @brief 魔法処理のメインルーチン\r
8318  * @param realm 魔法領域のID\r
8319  * @param spell 各領域の魔法ID\r
8320  * @param mode 求める処理\r
8321  * @return 各領域魔法に各種テキストを求めた場合は文字列参照ポインタ、そうでない場合はNULLポインタを返す。\r
8322  */\r
8323 cptr do_spell(REALM_IDX realm, SPELL_IDX spell, BIT_FLAGS mode)\r
8324 {\r
8325         switch (realm)\r
8326         {\r
8327         case REALM_LIFE:     return do_life_spell(spell, mode);\r
8328         case REALM_SORCERY:  return do_sorcery_spell(spell, mode);\r
8329         case REALM_NATURE:   return do_nature_spell(spell, mode);\r
8330         case REALM_CHAOS:    return do_chaos_spell(spell, mode);\r
8331         case REALM_DEATH:    return do_death_spell(spell, mode);\r
8332         case REALM_TRUMP:    return do_trump_spell(spell, mode);\r
8333         case REALM_ARCANE:   return do_arcane_spell(spell, mode);\r
8334         case REALM_CRAFT:    return do_craft_spell(spell, mode);\r
8335         case REALM_DAEMON:   return do_daemon_spell(spell, mode);\r
8336         case REALM_CRUSADE:  return do_crusade_spell(spell, mode);\r
8337         case REALM_MUSIC:    return do_music_spell(spell, mode);\r
8338         case REALM_HISSATSU: return do_hissatsu_spell(spell, mode);\r
8339         case REALM_HEX:      return do_hex_spell(spell, mode);\r
8340         }\r
8341 \r
8342         return NULL;\r
8343 }\r