OSDN Git Service

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