OSDN Git Service

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