OSDN Git Service

[Refactor] #37353 匠領域処理を cmd-spell.c から realm-craft.c/h へ分離。
[hengband/hengband.git] / src / cmd-spell.c
1 /*!\r
2     @file cmd-spell.c\r
3     @brief 魔法のインターフェイスと発動 / Purpose: Do everything for each spell\r
4     @date 2013/12/31\r
5     @author\r
6     2013 Deskull rearranged comment for Doxygen.\r
7  */\r
8 \r
9 #include "angband.h"\r
10 #include "selfinfo.h"\r
11 #include "cmd-quaff.h"\r
12 #include "spells-summon.h"\r
13 #include "realm-arcane.h"\r
14 #include "realm-chaos.h"\r
15 #include "realm-craft.h"\r
16 #include "realm-death.h"\r
17 #include "realm-life.h"\r
18 #include "realm-nature.h"\r
19 #include "realm-sorcery.h"\r
20 #include "realm-trump.h"\r
21 \r
22 /*!\r
23  * @brief\r
24  * 魔法の効果を「キャプション:ダイス+定数値」のフォーマットで出力する / Generate dice info string such as "foo 2d10"\r
25  * @param str キャプション\r
26  * @param dice ダイス数\r
27  * @param sides ダイス目\r
28  * @param base 固定値\r
29  * @return フォーマットに従い整形された文字列\r
30  */\r
31 cptr info_string_dice(cptr str, int dice, int sides, int base)\r
32 {\r
33         /* Fix value */\r
34         if (!dice)\r
35                 return format("%s%d", str, base);\r
36 \r
37         /* Dice only */\r
38         else if (!base)\r
39                 return format("%s%dd%d", str, dice, sides);\r
40 \r
41         /* Dice plus base value */\r
42         else\r
43                 return format("%s%dd%d%+d", str, dice, sides, base);\r
44 }\r
45 \r
46 \r
47 /*!\r
48  * @brief 魔法によるダメージを出力する / Generate damage-dice info string such as "dam 2d10"\r
49  * @param dice ダイス数\r
50  * @param sides ダイス目\r
51  * @param base 固定値\r
52  * @return フォーマットに従い整形された文字列\r
53  */\r
54 cptr info_damage(int dice, int sides, int base)\r
55 {\r
56         return info_string_dice(_("損傷:", "dam "), dice, sides, base);\r
57 }\r
58 \r
59 /*!\r
60  * @brief 魔法の効果時間を出力する / Generate duration info string such as "dur 20+1d20"\r
61  * @param base 固定値\r
62  * @param sides ダイス目\r
63  * @return フォーマットに従い整形された文字列\r
64  */\r
65 cptr info_duration(int base, int sides)\r
66 {\r
67         return format(_("期間:%d+1d%d", "dur %d+1d%d"), base, sides);\r
68 }\r
69 \r
70 /*!\r
71  * @brief 魔法の効果範囲を出力する / Generate range info string such as "range 5"\r
72  * @param range 効果範囲\r
73  * @return フォーマットに従い整形された文字列\r
74  */\r
75 cptr info_range(POSITION range)\r
76 {\r
77         return format(_("範囲:%d", "range %d"), range);\r
78 }\r
79 \r
80 /*!\r
81  * @brief 魔法による回復量を出力する / Generate heal info string such as "heal 2d8"\r
82  * @param dice ダイス数\r
83  * @param sides ダイス目\r
84  * @param base 固定値\r
85  * @return フォーマットに従い整形された文字列\r
86  */\r
87 cptr info_heal(int dice, int sides, int base)\r
88 {\r
89         return info_string_dice(_("回復:", "heal "), dice, sides, base);\r
90 }\r
91 \r
92 /*!\r
93  * @brief 魔法効果発動までの遅延ターンを出力する / Generate delay info string such as "delay 15+1d15"\r
94  * @param base 固定値\r
95  * @param sides ダイス目\r
96  * @return フォーマットに従い整形された文字列\r
97  */\r
98 cptr info_delay(int base, int sides)\r
99 {\r
100         return format(_("遅延:%d+1d%d", "delay %d+1d%d"), base, sides);\r
101 }\r
102 \r
103 \r
104 /*!\r
105  * @brief 魔法によるダメージを出力する(固定値&複数回処理) / Generate multiple-damage info string such as "dam 25 each"\r
106  * @param dam 固定値\r
107  * @return フォーマットに従い整形された文字列\r
108  */\r
109 cptr info_multi_damage(HIT_POINT dam)\r
110 {\r
111         return format(_("損傷:各%d", "dam %d each"), dam);\r
112 }\r
113 \r
114 \r
115 /*!\r
116  * @brief 魔法によるダメージを出力する(ダイスのみ&複数回処理) / Generate multiple-damage-dice info string such as "dam 5d2 each"\r
117  * @param dice ダイス数\r
118  * @param sides ダイス目\r
119  * @return フォーマットに従い整形された文字列\r
120  */\r
121 cptr info_multi_damage_dice(int dice, int sides)\r
122 {\r
123         return format(_("損傷:各%dd%d", "dam %dd%d each"), dice, sides);\r
124 }\r
125 \r
126 /*!\r
127  * @brief 魔法による一般的な効力値を出力する(固定値) / Generate power info string such as "power 100"\r
128  * @param power 固定値\r
129  * @return フォーマットに従い整形された文字列\r
130  */\r
131 cptr info_power(int power)\r
132 {\r
133         return format(_("効力:%d", "power %d"), power);\r
134 }\r
135 \r
136 \r
137 /*!\r
138  * @brief 魔法による一般的な効力値を出力する(ダイス値) / Generate power info string such as "power 100"\r
139  * @param dice ダイス数\r
140  * @param sides ダイス目\r
141  * @return フォーマットに従い整形された文字列\r
142  */\r
143 /*\r
144  * Generate power info string such as "power 1d100"\r
145  */\r
146 cptr info_power_dice(int dice, int sides)\r
147 {\r
148         return format(_("効力:%dd%d", "power %dd%d"), dice, sides);\r
149 }\r
150 \r
151 \r
152 /*!\r
153  * @brief 魔法の効果半径を出力する / Generate radius info string such as "rad 100"\r
154  * @param rad 効果半径\r
155  * @return フォーマットに従い整形された文字列\r
156  */\r
157 cptr info_radius(int rad)\r
158 {\r
159         return format(_("半径:%d", "rad %d"), rad);\r
160 }\r
161 \r
162 \r
163 /*!\r
164  * @brief 魔法効果の限界重量を出力する / Generate weight info string such as "max wgt 15"\r
165  * @param weight 最大重量\r
166  * @return フォーマットに従い整形された文字列\r
167  */\r
168 cptr info_weight(int weight)\r
169 {\r
170 #ifdef JP\r
171         return format("最大重量:%d.%dkg", lbtokg1(weight), lbtokg2(weight));\r
172 #else\r
173         return format("max wgt %d", weight/10);\r
174 #endif\r
175 }\r
176 \r
177 \r
178 /*!\r
179  * @brief 歌の開始を処理する / Start singing if the player is a Bard \r
180  * @param spell 領域魔法としてのID\r
181  * @param song 魔法効果のID\r
182  * @return なし\r
183  */\r
184 static void start_singing(SPELL_IDX spell, MAGIC_NUM1 song)\r
185 {\r
186         /* Remember the song index */\r
187         SINGING_SONG_EFFECT(p_ptr) = (MAGIC_NUM1)song;\r
188 \r
189         /* Remember the index of the spell which activated the song */\r
190         SINGING_SONG_ID(p_ptr) = (MAGIC_NUM2)spell;\r
191 \r
192 \r
193         /* Now the player is singing */\r
194         set_action(ACTION_SING);\r
195 \r
196 \r
197         /* Recalculate bonuses */\r
198         p_ptr->update |= (PU_BONUS);\r
199 \r
200         /* Redraw status bar */\r
201         p_ptr->redraw |= (PR_STATUS);\r
202 }\r
203 \r
204 /*!\r
205  * @brief 歌の停止を処理する / Stop singing if the player is a Bard \r
206  * @return なし\r
207  */\r
208 void stop_singing(void)\r
209 {\r
210         if (p_ptr->pclass != CLASS_BARD) return;\r
211 \r
212         /* Are there interupted song? */\r
213         if (INTERUPTING_SONG_EFFECT(p_ptr))\r
214         {\r
215                 /* Forget interupted song */\r
216                 INTERUPTING_SONG_EFFECT(p_ptr) = MUSIC_NONE;\r
217                 return;\r
218         }\r
219 \r
220         /* The player is singing? */\r
221         if (!SINGING_SONG_EFFECT(p_ptr)) return;\r
222 \r
223         /* Hack -- if called from set_action(), avoid recursive loop */\r
224         if (p_ptr->action == ACTION_SING) set_action(ACTION_NONE);\r
225 \r
226         /* Message text of each song or etc. */\r
227         do_spell(REALM_MUSIC, SINGING_SONG_ID(p_ptr), SPELL_STOP);\r
228 \r
229         SINGING_SONG_EFFECT(p_ptr) = MUSIC_NONE;\r
230         SINGING_SONG_ID(p_ptr) = 0;\r
231 \r
232         /* Recalculate bonuses */\r
233         p_ptr->update |= (PU_BONUS);\r
234 \r
235         /* Redraw status bar */\r
236         p_ptr->redraw |= (PR_STATUS);\r
237 }\r
238 \r
239 \r
240 /*!\r
241  * @brief 悪魔領域魔法の各処理を行う\r
242  * @param spell 魔法ID\r
243  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)\r
244  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。\r
245  */\r
246 static cptr do_daemon_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
247 {\r
248         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
249         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
250         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
251         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
252         static const char s_dam[] = _("損傷:", "dam ");\r
253 \r
254         int dir;\r
255         int plev = p_ptr->lev;\r
256 \r
257         switch (spell)\r
258         {\r
259         case 0:\r
260                 if (name) return _("マジック・ミサイル", "Magic Missile");\r
261                 if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");\r
262     \r
263                 {\r
264                         int dice = 3 + (plev - 1) / 5;\r
265                         int sides = 4;\r
266 \r
267                         if (info) return info_damage(dice, sides, 0);\r
268 \r
269                         if (cast)\r
270                         {\r
271                                 if (!get_aim_dir(&dir)) return NULL;\r
272 \r
273                                 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));\r
274                         }\r
275                 }\r
276                 break;\r
277 \r
278         case 1:\r
279                 if (name) return _("無生命感知", "Detect Unlife");\r
280                 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");\r
281     \r
282                 {\r
283                         int rad = DETECT_RAD_DEFAULT;\r
284 \r
285                         if (info) return info_radius(rad);\r
286 \r
287                         if (cast)\r
288                         {\r
289                                 detect_monsters_nonliving(rad);\r
290                         }\r
291                 }\r
292                 break;\r
293 \r
294         case 2:\r
295                 if (name) return _("邪なる祝福", "Evil Bless");\r
296                 if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives bonus to hit and AC for a few turns.");\r
297     \r
298                 {\r
299                         int base = 12;\r
300 \r
301                         if (info) return info_duration(base, base);\r
302 \r
303                         if (cast)\r
304                         {\r
305                                 set_blessed(randint1(base) + base, FALSE);\r
306                         }\r
307                 }\r
308                 break;\r
309 \r
310         case 3:\r
311                 if (name) return _("耐火炎", "Resist Fire");\r
312                 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。", \r
313                         "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");\r
314     \r
315                 {\r
316                         int base = 20;\r
317 \r
318                         if (info) return info_duration(base, base);\r
319 \r
320                         if (cast)\r
321                         {\r
322                                 set_oppose_fire(randint1(base) + base, FALSE);\r
323                         }\r
324                 }\r
325                 break;\r
326 \r
327         case 4:\r
328                 if (name) return _("恐慌", "Horrify");\r
329                 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");\r
330     \r
331                 {\r
332                         int power = plev;\r
333 \r
334                         if (info) return info_power(power);\r
335 \r
336                         if (cast)\r
337                         {\r
338                                 if (!get_aim_dir(&dir)) return NULL;\r
339 \r
340                                 fear_monster(dir, power);\r
341                                 stun_monster(dir, power);\r
342                         }\r
343                 }\r
344                 break;\r
345 \r
346         case 5:\r
347                 if (name) return _("地獄の矢", "Nether Bolt");\r
348                 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");\r
349     \r
350                 {\r
351                         int dice = 6 + (plev - 5) / 4;\r
352                         int sides = 8;\r
353 \r
354                         if (info) return info_damage(dice, sides, 0);\r
355 \r
356                         if (cast)\r
357                         {\r
358                                 if (!get_aim_dir(&dir)) return NULL;\r
359 \r
360                                 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));\r
361                         }\r
362                 }\r
363                 break;\r
364 \r
365         case 6:\r
366                 if (name) return _("古代の死霊召喚", "Summon Manes");\r
367                 if (desc) return _("古代の死霊を召喚する。", "Summons a manes.");\r
368     \r
369                 {\r
370                         if (cast)\r
371                         {\r
372                                 if (!summon_specific(-1, p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET)))\r
373                                 {\r
374                                         msg_print(_("古代の死霊は現れなかった。", "No Manes arrive."));\r
375                                 }\r
376                         }\r
377                 }\r
378                 break;\r
379 \r
380         case 7:\r
381                 if (name) return _("地獄の焔", "Hellish Flame");\r
382                 if (desc) return _("邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",\r
383                         "Fires a ball of evil power. Hurts good monsters greatly.");\r
384     \r
385                 {\r
386                         int dice = 3;\r
387                         int sides = 6;\r
388                         int rad = (plev < 30) ? 2 : 3;\r
389                         int base;\r
390 \r
391                         if (p_ptr->pclass == CLASS_MAGE ||\r
392                             p_ptr->pclass == CLASS_HIGH_MAGE ||\r
393                             p_ptr->pclass == CLASS_SORCERER)\r
394                                 base = plev + plev / 2;\r
395                         else\r
396                                 base = plev + plev / 4;\r
397 \r
398 \r
399                         if (info) return info_damage(dice, sides, base);\r
400 \r
401                         if (cast)\r
402                         {\r
403                                 if (!get_aim_dir(&dir)) return NULL;\r
404 \r
405                                 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides) + base, rad);\r
406                         }\r
407                 }\r
408                 break;\r
409 \r
410         case 8:\r
411                 if (name) return _("デーモン支配", "Dominate Demon");\r
412                 if (desc) return _("悪魔1体を魅了する。抵抗されると無効", "Attempts to charm a demon.");\r
413     \r
414                 {\r
415                         int power = plev;\r
416 \r
417                         if (info) return info_power(power);\r
418 \r
419                         if (cast)\r
420                         {\r
421                                 if (!get_aim_dir(&dir)) return NULL;\r
422 \r
423                                 control_one_demon(dir, power);\r
424                         }\r
425                 }\r
426                 break;\r
427 \r
428         case 9:\r
429                 if (name) return _("ビジョン", "Vision");\r
430                 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");\r
431     \r
432                 {\r
433                         int rad = DETECT_RAD_MAP;\r
434 \r
435                         if (info) return info_radius(rad);\r
436 \r
437                         if (cast)\r
438                         {\r
439                                 map_area(rad);\r
440                         }\r
441                 }\r
442                 break;\r
443 \r
444         case 10:\r
445                 if (name) return _("耐地獄", "Resist Nether");\r
446                 if (desc) return _("一定時間、地獄への耐性を得る。", "Gives resistance to nether for a while.");\r
447     \r
448                 {\r
449                         int base = 20;\r
450 \r
451                         if (info) return info_duration(base, base);\r
452 \r
453                         if (cast)\r
454                         {\r
455                                 set_tim_res_nether(randint1(base) + base, FALSE);\r
456                         }\r
457                 }\r
458                 break;\r
459 \r
460         case 11:\r
461                 if (name) return _("プラズマ・ボルト", "Plasma bolt");\r
462                 if (desc) return _("プラズマのボルトもしくはビームを放つ。", "Fires a bolt or beam of plasma.");\r
463     \r
464                 {\r
465                         int dice = 11 + (plev - 5) / 4;\r
466                         int sides = 8;\r
467 \r
468                         if (info) return info_damage(dice, sides, 0);\r
469 \r
470                         if (cast)\r
471                         {\r
472                                 if (!get_aim_dir(&dir)) return NULL;\r
473 \r
474                                 fire_bolt_or_beam(beam_chance(), GF_PLASMA, dir, damroll(dice, sides));\r
475                         }\r
476                 }\r
477                 break;\r
478 \r
479         case 12:\r
480                 if (name) return _("ファイア・ボール", "Fire Ball");\r
481                 if (desc) return _("炎の球を放つ。", "Fires a ball of fire.");\r
482     \r
483                 {\r
484                         HIT_POINT dam = plev + 55;\r
485                         int rad = 2;\r
486 \r
487                         if (info) return info_damage(0, 0, dam);\r
488 \r
489                         if (cast)\r
490                         {\r
491                                 if (!get_aim_dir(&dir)) return NULL;\r
492 \r
493                                 fire_ball(GF_FIRE, dir, dam, rad);\r
494                         }\r
495                 }\r
496                 break;\r
497 \r
498         case 13:\r
499                 if (name) return _("炎の刃", "Fire Branding");\r
500                 if (desc) return _("武器に炎の属性をつける。", "Makes current weapon fire branded.");\r
501     \r
502                 {\r
503                         if (cast)\r
504                         {\r
505                                 brand_weapon(1);\r
506                         }\r
507                 }\r
508                 break;\r
509 \r
510         case 14:\r
511                 if (name) return _("地獄球", "Nether Ball");\r
512                 if (desc) return _("大きな地獄の球を放つ。", "Fires a huge ball of nether.");\r
513     \r
514                 {\r
515                         HIT_POINT dam = plev * 3 / 2 + 100;\r
516                         int rad = plev / 20 + 2;\r
517 \r
518                         if (info) return info_damage(0, 0, dam);\r
519 \r
520                         if (cast)\r
521                         {\r
522                                 if (!get_aim_dir(&dir)) return NULL;\r
523 \r
524                                 fire_ball(GF_NETHER, dir, dam, rad);\r
525                         }\r
526                 }\r
527                 break;\r
528 \r
529         case 15:\r
530                 if (name) return _("デーモン召喚", "Summon Demon");\r
531                 if (desc) return _("悪魔1体を召喚する。", "Summons a demon.");\r
532     \r
533                 {\r
534                         if (cast)\r
535                         {\r
536                                 bool pet = !one_in_(3);\r
537                                 u32b flg = 0L;\r
538 \r
539                                 if (pet) flg |= PM_FORCE_PET;\r
540                                 else flg |= PM_NO_PET;\r
541                                 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;\r
542 \r
543                                 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, plev*2/3+randint1(plev/2), SUMMON_DEMON, flg))\r
544                                 {\r
545                                         msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));\r
546 \r
547                                         if (pet)\r
548                                         {\r
549                                                 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));\r
550                                         }\r
551                                         else\r
552                                         {\r
553                                                 msg_print(_("「卑しき者よ、我は汝の下僕にあらず! お前の魂を頂くぞ!」",\r
554                                                                         "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));\r
555                                         }\r
556                                 }\r
557                                 else\r
558                                 {\r
559                                         msg_print(_("悪魔は現れなかった。", "No demons arrive."));\r
560                                 }\r
561                                 break;\r
562                         }\r
563                 }\r
564                 break;\r
565 \r
566         case 16:\r
567                 if (name) return _("悪魔の目", "Devilish Eye");\r
568                 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");\r
569     \r
570                 {\r
571                         int base = 30;\r
572                         int sides = 25;\r
573 \r
574                         if (info) return info_duration(base, sides);\r
575 \r
576                         if (cast)\r
577                         {\r
578                                 set_tim_esp(randint1(sides) + base, FALSE);\r
579                         }\r
580                 }\r
581                 break;\r
582 \r
583         case 17:\r
584                 if (name) return _("悪魔のクローク", "Devil Cloak");\r
585                 if (desc) return _("恐怖を取り除き、一定時間、炎と冷気の耐性、炎のオーラを得る。耐性は装備による耐性に累積する。", \r
586                         "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
587     \r
588                 {\r
589                         TIME_EFFECT base = 20;\r
590 \r
591                         if (info) return info_duration(base, base);\r
592 \r
593                         if (cast)\r
594                         {\r
595                                 TIME_EFFECT dur = randint1(base) + base;\r
596                                         \r
597                                 set_oppose_fire(dur, FALSE);\r
598                                 set_oppose_cold(dur, FALSE);\r
599                                 set_tim_sh_fire(dur, FALSE);\r
600                                 set_afraid(0);\r
601                                 break;\r
602                         }\r
603                 }\r
604                 break;\r
605 \r
606         case 18:\r
607                 if (name) return _("溶岩流", "The Flow of Lava");\r
608                 if (desc) return _("自分を中心とした炎の球を作り出し、床を溶岩に変える。", \r
609                         "Generates a ball of fire centered on you which transforms floors to magma.");\r
610     \r
611                 {\r
612                         HIT_POINT dam = (55 + plev) * 2;\r
613                         int rad = 3;\r
614 \r
615                         if (info) return info_damage(0, 0, dam/2);\r
616 \r
617                         if (cast)\r
618                         {\r
619                                 fire_ball(GF_FIRE, 0, dam, rad);\r
620                                 fire_ball_hide(GF_LAVA_FLOW, 0, 2 + randint1(2), rad);\r
621                         }\r
622                 }\r
623                 break;\r
624 \r
625         case 19:\r
626                 if (name) return _("プラズマ球", "Plasma Ball");\r
627                 if (desc) return _("プラズマの球を放つ。", "Fires a ball of plasma.");\r
628     \r
629                 {\r
630                         HIT_POINT dam = plev * 3 / 2 + 80;\r
631                         int rad = 2 + plev / 40;\r
632 \r
633                         if (info) return info_damage(0, 0, dam);\r
634 \r
635                         if (cast)\r
636                         {\r
637                                 if (!get_aim_dir(&dir)) return NULL;\r
638 \r
639                                 fire_ball(GF_PLASMA, dir, dam, rad);\r
640                         }\r
641                 }\r
642                 break;\r
643 \r
644         case 20:\r
645                 if (name) return _("悪魔変化", "Polymorph Demon");\r
646                 if (desc) return _("一定時間、悪魔に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔としての能力を得る。", \r
647                         "Mimic a demon for a while. Loses abilities of original race and gets abilities as a demon.");\r
648     \r
649                 {\r
650                         int base = 10 + plev / 2;\r
651 \r
652                         if (info) return info_duration(base, base);\r
653 \r
654                         if (cast)\r
655                         {\r
656                                 set_mimic(base + randint1(base), MIMIC_DEMON, FALSE);\r
657                         }\r
658                 }\r
659                 break;\r
660 \r
661         case 21:\r
662                 if (name) return _("地獄の波動", "Nather Wave");\r
663                 if (desc) return _("視界内の全てのモンスターにダメージを与える。善良なモンスターに特に大きなダメージを与える。", \r
664                         "Damages all monsters in sight. Hurts good monsters greatly.");\r
665     \r
666                 {\r
667                         int sides1 = plev * 2;\r
668                         int sides2 = plev * 2;\r
669 \r
670                         if (info) return format("%sd%d+d%d", s_dam, sides1, sides2);\r
671 \r
672                         if (cast)\r
673                         {\r
674                                 dispel_monsters(randint1(sides1));\r
675                                 dispel_good(randint1(sides2));\r
676                         }\r
677                 }\r
678                 break;\r
679 \r
680         case 22:\r
681                 if (name) return _("サキュバスの接吻", "Kiss of Succubus");\r
682                 if (desc) return _("因果混乱の球を放つ。", "Fires a ball of nexus.");\r
683     \r
684                 {\r
685                         HIT_POINT dam = 100 + plev * 2;\r
686                         int rad = 4;\r
687 \r
688                         if (info) return info_damage(0, 0, dam);\r
689 \r
690                         if (cast)\r
691                         {\r
692                                 if (!get_aim_dir(&dir)) return NULL;\r
693                                 fire_ball(GF_NEXUS, dir, dam, rad);\r
694                         }\r
695                 }\r
696                 break;\r
697 \r
698         case 23:\r
699                 if (name) return _("破滅の手", "Doom Hand");\r
700                 if (desc) return _("破滅の手を放つ。食らったモンスターはそのときのHPの半分前後のダメージを受ける。", "Attempts to make a monster's HP almost half.");\r
701     \r
702                 {\r
703                         if (cast)\r
704                         {\r
705                                 if (!get_aim_dir(&dir))\r
706                                         return NULL;\r
707                                 else \r
708                                         msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));\r
709                                 \r
710                                 fire_ball_hide(GF_HAND_DOOM, dir, plev * 2, 0);\r
711                         }\r
712                 }\r
713                 break;\r
714 \r
715         case 24:\r
716                 if (name) return _("士気高揚", "Raise the Morale");\r
717                 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");\r
718     \r
719                 {\r
720                         int base = 25;\r
721 \r
722                         if (info) return info_duration(base, base);\r
723 \r
724                         if (cast)\r
725                         {\r
726                                 set_hero(randint1(base) + base, FALSE);\r
727                                 hp_player(10);\r
728                                 set_afraid(0);\r
729                         }\r
730                 }\r
731                 break;\r
732 \r
733         case 25:\r
734                 if (name) return _("不滅の肉体", "Immortal Body");\r
735                 if (desc) return _("一定時間、時間逆転への耐性を得る。", "Gives resistance to time for a while.");\r
736     \r
737                 {\r
738                         int base = 20;\r
739 \r
740                         if (info) return info_duration(base, base);\r
741 \r
742                         if (cast)\r
743                         {\r
744                                 set_tim_res_time(randint1(base)+base, FALSE);\r
745                         }\r
746                 }\r
747                 break;\r
748 \r
749         case 26:\r
750                 if (name) return _("狂気の円環", "Insanity Circle");\r
751                 if (desc) return _("自分を中心としたカオスの球、混乱の球を発生させ、近くのモンスターを魅了する。", \r
752                         "Generate balls of chaos, confusion and charm centered on you.");\r
753     \r
754                 {\r
755                         HIT_POINT dam = 50 + plev;\r
756                         int power = 20 + plev;\r
757                         int rad = 3 + plev / 20;\r
758 \r
759                         if (info) return format("%s%d+%d", s_dam, dam/2, dam/2);\r
760 \r
761                         if (cast)\r
762                         {\r
763                                 fire_ball(GF_CHAOS, 0, dam, rad);\r
764                                 fire_ball(GF_CONFUSION, 0, dam, rad);\r
765                                 fire_ball(GF_CHARM, 0, power, rad);\r
766                         }\r
767                 }\r
768                 break;\r
769 \r
770         case 27:\r
771                 if (name) return _("ペット爆破", "Explode Pets");\r
772                 if (desc) return _("全てのペットを強制的に爆破させる。", "Makes all pets explode.");\r
773     \r
774                 {\r
775                         if (cast)\r
776                         {\r
777                                 discharge_minion();\r
778                         }\r
779                 }\r
780                 break;\r
781 \r
782         case 28:\r
783                 if (name) return _("グレーターデーモン召喚", "Summon Greater Demon");\r
784                 if (desc) return _("上級デーモンを召喚する。召喚するには人間('p','h','t'で表されるモンスター)の死体を捧げなければならない。", \r
785                         "Summons greater demon. It need to sacrifice a corpse of human ('p','h' or 't').");\r
786     \r
787                 {\r
788                         if (cast)\r
789                         {\r
790                                 if (!cast_summon_greater_demon()) return NULL;\r
791                         }\r
792                 }\r
793                 break;\r
794 \r
795         case 29:\r
796                 if (name) return _("地獄嵐", "Nether Storm");\r
797                 if (desc) return _("超巨大な地獄の球を放つ。", "Generate a huge ball of nether.");\r
798     \r
799                 {\r
800                         HIT_POINT dam = plev * 15;\r
801                         int rad = plev / 5;\r
802 \r
803                         if (info) return info_damage(0, 0, dam);\r
804 \r
805                         if (cast)\r
806                         {\r
807                                 if (!get_aim_dir(&dir)) return NULL;\r
808 \r
809                                 fire_ball(GF_NETHER, dir, dam, rad);\r
810                         }\r
811                 }\r
812                 break;\r
813 \r
814         case 30:\r
815                 if (name) return _("血の呪い", "Bloody Curse");\r
816                 if (desc) return _("自分がダメージを受けることによって対象に呪いをかけ、ダメージを与え様々な効果を引き起こす。",\r
817                         "Puts blood curse which damages and causes various effects on a monster. You also take damage.");\r
818     \r
819                 {\r
820                         HIT_POINT dam = 600;\r
821                         int rad = 0;\r
822 \r
823                         if (info) return info_damage(0, 0, dam);\r
824 \r
825                         if (cast)\r
826                         {\r
827                                 if (!get_aim_dir(&dir)) return NULL;\r
828 \r
829                                 fire_ball_hide(GF_BLOOD_CURSE, dir, dam, rad);\r
830                                 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("血の呪い", "Blood curse"), -1);\r
831                         }\r
832                 }\r
833                 break;\r
834 \r
835         case 31:\r
836                 if (name) return _("魔王変化", "Polymorph Demonlord");\r
837                 if (desc) return _("悪魔の王に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔の王としての能力を得、壁を破壊しながら歩く。",\r
838                         "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
839     \r
840                 {\r
841                         int base = 15;\r
842 \r
843                         if (info) return info_duration(base, base);\r
844 \r
845                         if (cast)\r
846                         {\r
847                                 set_mimic(base + randint1(base), MIMIC_DEMON_LORD, FALSE);\r
848                         }\r
849                 }\r
850                 break;\r
851         }\r
852 \r
853         return "";\r
854 }\r
855 \r
856 /*!\r
857  * @brief 破邪領域魔法の各処理を行う\r
858  * @param spell 魔法ID\r
859  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)\r
860  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。\r
861  */\r
862 static cptr do_crusade_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
863 {\r
864         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
865         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
866         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
867         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
868 \r
869         int dir;\r
870         int plev = p_ptr->lev;\r
871 \r
872         switch (spell)\r
873         {\r
874         case 0:\r
875                 if (name) return _("懲罰", "Punishment");\r
876                 if (desc) return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");\r
877     \r
878                 {\r
879                         int dice = 3 + (plev - 1) / 5;\r
880                         int sides = 4;\r
881 \r
882                         if (info) return info_damage(dice, sides, 0);\r
883 \r
884                         if (cast)\r
885                         {\r
886                                 if (!get_aim_dir(&dir)) return NULL;\r
887 \r
888                                 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));\r
889                         }\r
890                 }\r
891                 break;\r
892 \r
893         case 1:\r
894                 if (name) return _("邪悪存在感知", "Detect Evil");\r
895                 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");\r
896     \r
897                 {\r
898                         int rad = DETECT_RAD_DEFAULT;\r
899 \r
900                         if (info) return info_radius(rad);\r
901 \r
902                         if (cast)\r
903                         {\r
904                                 detect_monsters_evil(rad);\r
905                         }\r
906                 }\r
907                 break;\r
908 \r
909         case 2:\r
910                 if (name) return _("恐怖除去", "Remove Fear");\r
911                 if (desc) return _("恐怖を取り除く。", "Removes fear.");\r
912     \r
913                 {\r
914                         if (cast)\r
915                         {\r
916                                 set_afraid(0);\r
917                         }\r
918                 }\r
919                 break;\r
920 \r
921         case 3:\r
922                 if (name) return _("威圧", "Scare Monster");\r
923                 if (desc) return _("モンスター1体を恐怖させる。抵抗されると無効。", "Attempts to scare a monster.");\r
924     \r
925                 {\r
926                         int power = plev;\r
927 \r
928                         if (info) return info_power(power);\r
929 \r
930                         if (cast)\r
931                         {\r
932                                 if (!get_aim_dir(&dir)) return NULL;\r
933 \r
934                                 fear_monster(dir, power);\r
935                         }\r
936                 }\r
937                 break;\r
938 \r
939         case 4:\r
940                 if (name) return _("聖域", "Sanctuary");\r
941                 if (desc) return _("隣接した全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep monsters in the adjacent squares.");\r
942     \r
943                 {\r
944                         int power = plev;\r
945 \r
946                         if (info) return info_power(power);\r
947 \r
948                         if (cast)\r
949                         {\r
950                                 sleep_monsters_touch();\r
951                         }\r
952                 }\r
953                 break;\r
954 \r
955         case 5:\r
956                 if (name) return _("入口", "Portal");\r
957                 if (desc) return _("中距離のテレポートをする。", "Teleport medium distance.");\r
958     \r
959                 {\r
960                         POSITION range = 25 + plev / 2;\r
961 \r
962                         if (info) return info_range(range);\r
963 \r
964                         if (cast)\r
965                         {\r
966                                 teleport_player(range, 0L);\r
967                         }\r
968                 }\r
969                 break;\r
970 \r
971         case 6:\r
972                 if (name) return _("スターダスト", "Star Dust");\r
973                 if (desc) return _("ターゲット付近に閃光のボルトを連射する。", "Fires many bolts of light near the target.");\r
974     \r
975                 {\r
976                         int dice = 3 + (plev - 1) / 9;\r
977                         int sides = 2;\r
978 \r
979                         if (info) return info_multi_damage_dice(dice, sides);\r
980 \r
981                         if (cast)\r
982                         {\r
983                                 if (!get_aim_dir(&dir)) return NULL;\r
984                                 fire_blast(GF_LITE, dir, dice, sides, 10, 3);\r
985                         }\r
986                 }\r
987                 break;\r
988 \r
989         case 7:\r
990                 if (name) return _("身体浄化", "Purify");\r
991                 if (desc) return _("傷、毒、朦朧から全快する。", "Heals all cut, stun and poison status.");\r
992     \r
993                 {\r
994                         if (cast)\r
995                         {\r
996                                 set_cut(0);\r
997                                 set_poisoned(0);\r
998                                 set_stun(0);\r
999                         }\r
1000                 }\r
1001                 break;\r
1002 \r
1003         case 8:\r
1004                 if (name) return _("邪悪飛ばし", "Scatter Evil");\r
1005                 if (desc) return _("邪悪なモンスター1体をテレポートさせる。抵抗されると無効。", "Attempts to teleport an evil monster away.");\r
1006     \r
1007                 {\r
1008                         int power = MAX_SIGHT * 5;\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                                 fire_ball(GF_AWAY_EVIL, dir, power, 0);\r
1016                         }\r
1017                 }\r
1018                 break;\r
1019 \r
1020         case 9:\r
1021                 if (name) return _("聖なる光球", "Holy Orb");\r
1022                 if (desc) return _("聖なる力をもつ宝珠を放つ。邪悪なモンスターに対して大きなダメージを与えるが、善良なモンスターには効果がない。", \r
1023                         "Fires a ball with holy power. Hurts evil monsters greatly, but don't effect good monsters.");\r
1024     \r
1025                 {\r
1026                         int dice = 3;\r
1027                         int sides = 6;\r
1028                         int rad = (plev < 30) ? 2 : 3;\r
1029                         int base;\r
1030 \r
1031                         if (p_ptr->pclass == CLASS_PRIEST ||\r
1032                             p_ptr->pclass == CLASS_HIGH_MAGE ||\r
1033                             p_ptr->pclass == CLASS_SORCERER)\r
1034                                 base = plev + plev / 2;\r
1035                         else\r
1036                                 base = plev + plev / 4;\r
1037 \r
1038 \r
1039                         if (info) return info_damage(dice, sides, base);\r
1040 \r
1041                         if (cast)\r
1042                         {\r
1043                                 if (!get_aim_dir(&dir)) return NULL;\r
1044 \r
1045                                 fire_ball(GF_HOLY_FIRE, dir, damroll(dice, sides) + base, rad);\r
1046                         }\r
1047                 }\r
1048                 break;\r
1049 \r
1050         case 10:\r
1051                 if (name) return _("悪魔払い", "Exorcism");\r
1052                 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与え、邪悪なモンスターを恐怖させる。", \r
1053                         "Damages all undead and demons in sight, and scares all evil monsters in sight.");\r
1054     \r
1055                 {\r
1056                         int sides = plev;\r
1057                         int power = plev;\r
1058 \r
1059                         if (info) return info_damage(1, sides, 0);\r
1060 \r
1061                         if (cast)\r
1062                         {\r
1063                                 dispel_undead(randint1(sides));\r
1064                                 dispel_demons(randint1(sides));\r
1065                                 turn_evil(power);\r
1066                         }\r
1067                 }\r
1068                 break;\r
1069 \r
1070         case 11:\r
1071                 if (name) return _("解呪", "Remove Curse");\r
1072                 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");\r
1073     \r
1074                 {\r
1075                         if (cast)\r
1076                         {\r
1077                                 if (remove_curse())\r
1078                                 {\r
1079                                         msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));\r
1080                                 }\r
1081                         }\r
1082                 }\r
1083                 break;\r
1084 \r
1085         case 12:\r
1086                 if (name) return _("透明視認", "Sense Unseen");\r
1087                 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");\r
1088     \r
1089                 {\r
1090                         int base = 24;\r
1091 \r
1092                         if (info) return info_duration(base, base);\r
1093 \r
1094                         if (cast)\r
1095                         {\r
1096                                 set_tim_invis(randint1(base) + base, FALSE);\r
1097                         }\r
1098                 }\r
1099                 break;\r
1100 \r
1101         case 13:\r
1102                 if (name) return _("対邪悪結界", "Protection from Evil");\r
1103                 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");\r
1104     \r
1105                 {\r
1106                         int base = 25;\r
1107                         int sides = 3 * plev;\r
1108 \r
1109                         if (info) return info_duration(base, sides);\r
1110 \r
1111                         if (cast)\r
1112                         {\r
1113                                 set_protevil(randint1(sides) + base, FALSE);\r
1114                         }\r
1115                 }\r
1116                 break;\r
1117 \r
1118         case 14:\r
1119                 if (name) return _("裁きの雷", "Judgment Thunder");\r
1120                 if (desc) return _("強力な電撃のボルトを放つ。", "Fires a powerful bolt of lightning.");\r
1121     \r
1122                 {\r
1123                         HIT_POINT dam = plev * 5;\r
1124 \r
1125                         if (info) return info_damage(0, 0, dam);\r
1126 \r
1127                         if (cast)\r
1128                         {\r
1129                                 if (!get_aim_dir(&dir)) return NULL;\r
1130                                 fire_bolt(GF_ELEC, dir, dam);\r
1131                         }\r
1132                 }\r
1133                 break;\r
1134 \r
1135         case 15:\r
1136                 if (name) return _("聖なる御言葉", "Holy Word");\r
1137                 if (desc) return _("視界内の邪悪な存在に大きなダメージを与え、体力を回復し、毒、恐怖、朦朧状態、負傷から全快する。",\r
1138                         "Damages all evil monsters in sight, heals HP somewhat, and completely heals poison, fear, stun and cut status.");\r
1139     \r
1140                 {\r
1141                         int dam_sides = plev * 6;\r
1142                         int heal = 100;\r
1143 \r
1144                         if (info) return format(_("損:1d%d/回%d", "dam:d%d/h%d"), dam_sides, heal);\r
1145                         if (cast)\r
1146                         {\r
1147                                 dispel_evil(randint1(dam_sides));\r
1148                                 hp_player(heal);\r
1149                                 set_afraid(0);\r
1150                                 set_poisoned(0);\r
1151                                 set_stun(0);\r
1152                                 set_cut(0);\r
1153                         }\r
1154                 }\r
1155                 break;\r
1156 \r
1157         case 16:\r
1158                 if (name) return _("開かれた道", "Unbarring Ways");\r
1159                 if (desc) return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");\r
1160     \r
1161                 {\r
1162                         if (cast)\r
1163                         {\r
1164                                 if (!get_aim_dir(&dir)) return NULL;\r
1165 \r
1166                                 destroy_door(dir);\r
1167                         }\r
1168                 }\r
1169                 break;\r
1170 \r
1171         case 17:\r
1172                 if (name) return _("封魔", "Arrest");\r
1173                 if (desc) return _("邪悪なモンスターの動きを止める。", "Attempts to paralyze an evil monster.");\r
1174     \r
1175                 {\r
1176                         int power = plev * 2;\r
1177 \r
1178                         if (info) return info_power(power);\r
1179 \r
1180                         if (cast)\r
1181                         {\r
1182                                 if (!get_aim_dir(&dir)) return NULL;\r
1183                                 stasis_evil(dir);\r
1184                         }\r
1185                 }\r
1186                 break;\r
1187 \r
1188         case 18:\r
1189                 if (name) return _("聖なるオーラ", "Holy Aura");\r
1190                 if (desc) return _("一定時間、邪悪なモンスターを傷つける聖なるオーラを得る。",\r
1191                         "Gives aura of holy power which injures evil monsters which attacked you for a while.");\r
1192     \r
1193                 {\r
1194                         int base = 20;\r
1195 \r
1196                         if (info) return info_duration(base, base);\r
1197 \r
1198                         if (cast)\r
1199                         {\r
1200                                 set_tim_sh_holy(randint1(base) + base, FALSE);\r
1201                         }\r
1202                 }\r
1203                 break;\r
1204 \r
1205         case 19:\r
1206                 if (name) return _("アンデッド&悪魔退散", "Dispel Undead & Demons");\r
1207                 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与える。", "Damages all undead and demons in sight.");\r
1208     \r
1209                 {\r
1210                         int sides = plev * 4;\r
1211 \r
1212                         if (info) return info_damage(1, sides, 0);\r
1213 \r
1214                         if (cast)\r
1215                         {\r
1216                                 dispel_undead(randint1(sides));\r
1217                                 dispel_demons(randint1(sides));\r
1218                         }\r
1219                 }\r
1220                 break;\r
1221 \r
1222         case 20:\r
1223                 if (name) return _("邪悪退散", "Dispel Evil");\r
1224                 if (desc) return _("視界内の全ての邪悪なモンスターにダメージを与える。", "Damages all evil monsters in sight.");\r
1225     \r
1226                 {\r
1227                         int sides = plev * 4;\r
1228 \r
1229                         if (info) return info_damage(1, sides, 0);\r
1230 \r
1231                         if (cast)\r
1232                         {\r
1233                                 dispel_evil(randint1(sides));\r
1234                         }\r
1235                 }\r
1236                 break;\r
1237 \r
1238         case 21:\r
1239                 if (name) return _("聖なる刃", "Holy Blade");\r
1240                 if (desc) return _("通常の武器に滅邪の属性をつける。", "Makes current weapon especially deadly against evil monsters.");\r
1241     \r
1242                 {\r
1243                         if (cast)\r
1244                         {\r
1245                                 brand_weapon(13);\r
1246                         }\r
1247                 }\r
1248                 break;\r
1249 \r
1250         case 22:\r
1251                 if (name) return _("スターバースト", "Star Burst");\r
1252                 if (desc) return _("巨大な閃光の球を放つ。", "Fires a huge ball of powerful light.");\r
1253     \r
1254                 {\r
1255                         HIT_POINT dam = 100 + plev * 2;\r
1256                         int rad = 4;\r
1257 \r
1258                         if (info) return info_damage(0, 0, dam);\r
1259 \r
1260                         if (cast)\r
1261                         {\r
1262                                 if (!get_aim_dir(&dir)) return NULL;\r
1263 \r
1264                                 fire_ball(GF_LITE, dir, dam, rad);\r
1265                         }\r
1266                 }\r
1267                 break;\r
1268 \r
1269         case 23:\r
1270                 if (name) return _("天使召喚", "Summon Angel");\r
1271                 if (desc) return _("天使を1体召喚する。", "Summons an angel.");\r
1272     \r
1273                 {\r
1274                         if (cast)\r
1275                         {\r
1276                                 bool pet = !one_in_(3);\r
1277                                 u32b flg = 0L;\r
1278 \r
1279                                 if (pet) flg |= PM_FORCE_PET;\r
1280                                 else flg |= PM_NO_PET;\r
1281                                 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;\r
1282 \r
1283                                 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_ANGEL, flg))\r
1284                                 {\r
1285                                         if (pet)\r
1286                                         {\r
1287                                                 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));\r
1288                                         }\r
1289                                         else\r
1290                                         {\r
1291                                                 msg_print(_("「我は汝の下僕にあらず! 悪行者よ、悔い改めよ!」", "Mortal! Repent of thy impiousness."));\r
1292                                         }\r
1293                                 }\r
1294                         }\r
1295                 }\r
1296                 break;\r
1297 \r
1298         case 24:\r
1299                 if (name) return _("士気高揚", "Heroism");\r
1300                 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");\r
1301     \r
1302                 {\r
1303                         int base = 25;\r
1304 \r
1305                         if (info) return info_duration(base, base);\r
1306 \r
1307                         if (cast)\r
1308                         {\r
1309                                 set_hero(randint1(base) + base, FALSE);\r
1310                                 hp_player(10);\r
1311                                 set_afraid(0);\r
1312                         }\r
1313                 }\r
1314                 break;\r
1315 \r
1316         case 25:\r
1317                 if (name) return _("呪い退散", "Dispel Curse");\r
1318                 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");\r
1319     \r
1320                 {\r
1321                         if (cast)\r
1322                         {\r
1323                                 if (remove_all_curse())\r
1324                                 {\r
1325                                         msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));\r
1326                                 }\r
1327                         }\r
1328                 }\r
1329                 break;\r
1330 \r
1331         case 26:\r
1332                 if (name) return _("邪悪追放", "Banish Evil");\r
1333                 if (desc) return _("視界内の全ての邪悪なモンスターをテレポートさせる。抵抗されると無効。", \r
1334                         "Teleports all evil monsters in sight away unless resisted.");\r
1335     \r
1336                 {\r
1337                         int power = 100;\r
1338 \r
1339                         if (info) return info_power(power);\r
1340 \r
1341                         if (cast)\r
1342                         {\r
1343                                 if (banish_evil(power))\r
1344                                 {\r
1345                                         msg_print(_("神聖な力が邪悪を打ち払った!", "The holy power banishes evil!"));\r
1346                                 }\r
1347                         }\r
1348                 }\r
1349                 break;\r
1350 \r
1351         case 27:\r
1352                 if (name) return _("ハルマゲドン", "Armageddon");\r
1353                 if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroy everything in nearby area.");\r
1354     \r
1355                 {\r
1356                         int base = 12;\r
1357                         int sides = 4;\r
1358 \r
1359                         if (cast)\r
1360                         {\r
1361                                 destroy_area(p_ptr->y, p_ptr->x, base + randint1(sides), FALSE);\r
1362                         }\r
1363                 }\r
1364                 break;\r
1365 \r
1366         case 28:\r
1367                 if (name) return _("目には目を", "An Eye for an Eye");\r
1368                 if (desc) return _("一定時間、自分がダメージを受けたときに攻撃を行ったモンスターに対して同等のダメージを与える。", \r
1369                         "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
1370     \r
1371                 {\r
1372                         int base = 10;\r
1373 \r
1374                         if (info) return info_duration(base, base);\r
1375 \r
1376                         if (cast)\r
1377                         {\r
1378                                 set_tim_eyeeye(randint1(base) + base, FALSE);\r
1379                         }\r
1380                 }\r
1381                 break;\r
1382 \r
1383         case 29:\r
1384                 if (name) return _("神の怒り", "Wrath of the God");\r
1385                 if (desc) return _("ターゲットの周囲に分解の球を多数落とす。", "Drops many balls of disintegration near the target.");\r
1386     \r
1387                 {\r
1388                         HIT_POINT dam = plev * 3 + 25;\r
1389                         int rad = 2;\r
1390 \r
1391                         if (info) return info_multi_damage(dam);\r
1392 \r
1393                         if (cast)\r
1394                         {\r
1395                                 if (!cast_wrath_of_the_god(dam, rad)) return NULL;\r
1396                         }\r
1397                 }\r
1398                 break;\r
1399 \r
1400         case 30:\r
1401                 if (name) return _("神威", "Divine Intervention");\r
1402                 if (desc) return _("隣接するモンスターに聖なるダメージを与え、視界内のモンスターにダメージ、減速、朦朧、混乱、恐怖、眠りを与える。さらに体力を回復する。", \r
1403                         "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
1404     \r
1405                 {\r
1406                         int b_dam = plev * 11;\r
1407                         int d_dam = plev * 4;\r
1408                         int heal = 100;\r
1409                         int power = plev * 4;\r
1410 \r
1411                         if (info) return format(_("回%d/損%d+%d", "h%d/dm%d+%d"), heal, d_dam, b_dam/2);\r
1412                         if (cast)\r
1413                         {\r
1414                                 project(0, 1, p_ptr->y, p_ptr->x, b_dam, GF_HOLY_FIRE, PROJECT_KILL, -1);\r
1415                                 dispel_monsters(d_dam);\r
1416                                 slow_monsters(plev);\r
1417                                 stun_monsters(power);\r
1418                                 confuse_monsters(power);\r
1419                                 turn_monsters(power);\r
1420                                 stasis_monsters(power);\r
1421                                 hp_player(heal);\r
1422                         }\r
1423                 }\r
1424                 break;\r
1425 \r
1426         case 31:\r
1427                 if (name) return _("聖戦", "Crusade");\r
1428                 if (desc) return _("視界内の善良なモンスターをペットにしようとし、ならなかった場合及び善良でないモンスターを恐怖させる。さらに多数の加速された騎士を召喚し、ヒーロー、祝福、加速、対邪悪結界を得る。", \r
1429                         "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
1430     \r
1431                 {\r
1432                         if (cast)\r
1433                         {\r
1434                                 int base = 25;\r
1435                                 int sp_sides = 20 + plev;\r
1436                                 int sp_base = plev;\r
1437 \r
1438                                 int i;\r
1439                                 crusade();\r
1440                                 for (i = 0; i < 12; i++)\r
1441                                 {\r
1442                                         int attempt = 10;\r
1443                                         POSITION my = 0, mx = 0;\r
1444 \r
1445                                         while (attempt--)\r
1446                                         {\r
1447                                                 scatter(&my, &mx, p_ptr->y, p_ptr->x, 4, 0);\r
1448 \r
1449                                                 /* Require empty grids */\r
1450                                                 if (cave_empty_bold2(my, mx)) break;\r
1451                                         }\r
1452                                         if (attempt < 0) continue;\r
1453                                         summon_specific(-1, my, mx, plev, SUMMON_KNIGHTS, (PM_ALLOW_GROUP | PM_FORCE_PET | PM_HASTE));\r
1454                                 }\r
1455                                 set_hero(randint1(base) + base, FALSE);\r
1456                                 set_blessed(randint1(base) + base, FALSE);\r
1457                                 set_fast(randint1(sp_sides) + sp_base, FALSE);\r
1458                                 set_protevil(randint1(base) + base, FALSE);\r
1459                                 set_afraid(0);\r
1460                         }\r
1461                 }\r
1462                 break;\r
1463         }\r
1464 \r
1465         return "";\r
1466 }\r
1467 \r
1468 \r
1469 /*!\r
1470  * @brief 歌の各処理を行う\r
1471  * @param spell 歌ID\r
1472  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP)\r
1473  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。\r
1474  */\r
1475 static cptr do_music_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
1476 {\r
1477         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
1478         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
1479         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
1480         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
1481         bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;\r
1482         bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;\r
1483         bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;\r
1484         static const char s_dam[] = _("損傷:", "dam ");\r
1485 \r
1486         int dir;\r
1487         int plev = p_ptr->lev;\r
1488 \r
1489         switch (spell)\r
1490         {\r
1491         case 0:\r
1492                 if (name) return _("遅鈍の歌", "Song of Holding");\r
1493                 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");\r
1494     \r
1495                 /* Stop singing before start another */\r
1496                 if (cast || fail) stop_singing();\r
1497 \r
1498                 if (cast)\r
1499                 {\r
1500                         msg_print(_("ゆっくりとしたメロディを口ずさみ始めた...", "You start humming a slow, steady melody..."));\r
1501                         start_singing(spell, MUSIC_SLOW);\r
1502                 }\r
1503 \r
1504                 {\r
1505                         int power = plev;\r
1506 \r
1507                         if (info) return info_power(power);\r
1508 \r
1509                         if (cont)\r
1510                         {\r
1511                                 slow_monsters(plev);\r
1512                         }\r
1513                 }\r
1514                 break;\r
1515 \r
1516         case 1:\r
1517                 if (name) return _("祝福の歌", "Song of Blessing");\r
1518                 if (desc) return _("命中率とACのボーナスを得る。", "Gives bonus to hit and AC for a few turns.");\r
1519     \r
1520                 /* Stop singing before start another */\r
1521                 if (cast || fail) stop_singing();\r
1522 \r
1523                 if (cast)\r
1524                 {\r
1525                         msg_print(_("厳かなメロディを奏で始めた...", "The holy power of the Music of the Ainur enters you..."));\r
1526                         start_singing(spell, MUSIC_BLESS);\r
1527                 }\r
1528 \r
1529                 if (stop)\r
1530                 {\r
1531                         if (!p_ptr->blessed)\r
1532                         {\r
1533                                 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));\r
1534                         }\r
1535                 }\r
1536 \r
1537                 break;\r
1538 \r
1539         case 2:\r
1540                 if (name) return _("崩壊の音色", "Wrecking Note");\r
1541                 if (desc) return _("轟音のボルトを放つ。", "Fires a bolt of sound.");\r
1542     \r
1543                 /* Stop singing before start another */\r
1544                 if (cast || fail) stop_singing();\r
1545 \r
1546                 {\r
1547                         int dice = 4 + (plev - 1) / 5;\r
1548                         int sides = 4;\r
1549 \r
1550                         if (info) return info_damage(dice, sides, 0);\r
1551 \r
1552                         if (cast)\r
1553                         {\r
1554                                 if (!get_aim_dir(&dir)) return NULL;\r
1555 \r
1556                                 fire_bolt(GF_SOUND, dir, damroll(dice, sides));\r
1557                         }\r
1558                 }\r
1559                 break;\r
1560 \r
1561         case 3:\r
1562                 if (name) return _("朦朧の旋律", "Stun Pattern");\r
1563                 if (desc) return _("視界内の全てのモンスターを朦朧させる。抵抗されると無効。", "Attempts to stun all monsters in sight.");\r
1564     \r
1565                 /* Stop singing before start another */\r
1566                 if (cast || fail) stop_singing();\r
1567 \r
1568                 if (cast)\r
1569                 {\r
1570                         msg_print(_("眩惑させるメロディを奏で始めた...", "You weave a pattern of sounds to bewilder and daze..."));\r
1571                         start_singing(spell, MUSIC_STUN);\r
1572                 }\r
1573 \r
1574                 {\r
1575                         int dice = plev / 10;\r
1576                         int sides = 2;\r
1577 \r
1578                         if (info) return info_power_dice(dice, sides);\r
1579 \r
1580                         if (cont)\r
1581                         {\r
1582                                 stun_monsters(damroll(dice, sides));\r
1583                         }\r
1584                 }\r
1585 \r
1586                 break;\r
1587 \r
1588         case 4:\r
1589                 if (name) return _("生命の流れ", "Flow of Life");\r
1590                 if (desc) return _("体力を少し回復させる。", "Heals HP a little.");\r
1591     \r
1592                 /* Stop singing before start another */\r
1593                 if (cast || fail) stop_singing();\r
1594 \r
1595                 if (cast)\r
1596                 {\r
1597                         msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing a song of healing..."));\r
1598                         start_singing(spell, MUSIC_L_LIFE);\r
1599                 }\r
1600 \r
1601                 {\r
1602                         int dice = 2;\r
1603                         int sides = 6;\r
1604 \r
1605                         if (info) return info_heal(dice, sides, 0);\r
1606 \r
1607                         if (cont)\r
1608                         {\r
1609                                 hp_player(damroll(dice, sides));\r
1610                         }\r
1611                 }\r
1612 \r
1613                 break;\r
1614 \r
1615         case 5:\r
1616                 if (name) return _("太陽の歌", "Song of the Sun");\r
1617                 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");\r
1618     \r
1619                 /* Stop singing before start another */\r
1620                 if (cast || fail) stop_singing();\r
1621 \r
1622                 {\r
1623                         int dice = 2;\r
1624                         int sides = plev / 2;\r
1625                         int rad = plev / 10 + 1;\r
1626 \r
1627                         if (info) return info_damage(dice, sides, 0);\r
1628 \r
1629                         if (cast)\r
1630                         {\r
1631                                 msg_print(_("光り輝く歌が辺りを照らした。", "Your uplifting song brings brightness to dark places..."));\r
1632                                 lite_area(damroll(dice, sides), rad);\r
1633                         }\r
1634                 }\r
1635                 break;\r
1636 \r
1637         case 6:\r
1638                 if (name) return _("恐怖の歌", "Song of Fear");\r
1639                 if (desc) return _("視界内の全てのモンスターを恐怖させる。抵抗されると無効。", "Attempts to scare all monsters in sight.");\r
1640     \r
1641                 /* Stop singing before start another */\r
1642                 if (cast || fail) stop_singing();\r
1643 \r
1644                 if (cast)\r
1645                 {\r
1646                         msg_print(_("おどろおどろしいメロディを奏で始めた...", "You start weaving a fearful pattern..."));\r
1647                         start_singing(spell, MUSIC_FEAR);                       \r
1648                 }\r
1649 \r
1650                 {\r
1651                         int power = plev;\r
1652 \r
1653                         if (info) return info_power(power);\r
1654 \r
1655                         if (cont)\r
1656                         {\r
1657                                 project_hack(GF_TURN_ALL, power);\r
1658                         }\r
1659                 }\r
1660 \r
1661                 break;\r
1662 \r
1663         case 7:\r
1664                 if (name) return _("戦いの歌", "Heroic Ballad");\r
1665                 if (desc) return _("ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");\r
1666 \r
1667                 /* Stop singing before start another */\r
1668                 if (cast || fail) stop_singing();\r
1669 \r
1670                 if (cast)\r
1671                 {\r
1672                         msg_print(_("激しい戦いの歌を歌った...", "You start singing a song of intense fighting..."));\r
1673 \r
1674                         (void)hp_player(10);\r
1675                         (void)set_afraid(0);\r
1676 \r
1677                         /* Recalculate hitpoints */\r
1678                         p_ptr->update |= (PU_HP);\r
1679 \r
1680                         start_singing(spell, MUSIC_HERO);\r
1681                 }\r
1682 \r
1683                 if (stop)\r
1684                 {\r
1685                         if (!p_ptr->hero)\r
1686                         {\r
1687                                 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));\r
1688                                 /* Recalculate hitpoints */\r
1689                                 p_ptr->update |= (PU_HP);\r
1690                         }\r
1691                 }\r
1692 \r
1693                 break;\r
1694 \r
1695         case 8:\r
1696                 if (name) return _("霊的知覚", "Clairaudience");\r
1697                 if (desc) return _("近くの罠/扉/階段を感知する。レベル15で全てのモンスター、20で財宝とアイテムを感知できるようになる。レベル25で周辺の地形を感知し、40でその階全体を永久に照らし、ダンジョン内のすべてのアイテムを感知する。この効果は歌い続けることで順に起こる。", \r
1698                         "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
1699     \r
1700                 /* Stop singing before start another */\r
1701                 if (cast || fail) stop_singing();\r
1702 \r
1703                 if (cast)\r
1704                 {\r
1705                         msg_print(_("静かな音楽が感覚を研ぎ澄まさせた...", "Your quiet music sharpens your sense of hearing..."));\r
1706                         /* Hack -- Initialize the turn count */\r
1707                         SINGING_COUNT(p_ptr) = 0;\r
1708                         start_singing(spell, MUSIC_DETECT);\r
1709                 }\r
1710 \r
1711                 {\r
1712                         int rad = DETECT_RAD_DEFAULT;\r
1713 \r
1714                         if (info) return info_radius(rad);\r
1715 \r
1716                         if (cont)\r
1717                         {\r
1718                                 int count = SINGING_COUNT(p_ptr);\r
1719 \r
1720                                 if (count >= 19) wiz_lite(FALSE);\r
1721                                 if (count >= 11)\r
1722                                 {\r
1723                                         map_area(rad);\r
1724                                         if (plev > 39 && count < 19)\r
1725                                                 SINGING_COUNT(p_ptr) = count + 1;\r
1726                                 }\r
1727                                 if (count >= 6)\r
1728                                 {\r
1729                                         /* There are too many hidden treasure.  So... */\r
1730                                         /* detect_treasure(rad); */\r
1731                                         detect_objects_gold(rad);\r
1732                                         detect_objects_normal(rad);\r
1733 \r
1734                                         if (plev > 24 && count < 11)\r
1735                                                 SINGING_COUNT(p_ptr) = count + 1;\r
1736                                 }\r
1737                                 if (count >= 3)\r
1738                                 {\r
1739                                         detect_monsters_invis(rad);\r
1740                                         detect_monsters_normal(rad);\r
1741 \r
1742                                         if (plev > 19 && count < 6)\r
1743                                                 SINGING_COUNT(p_ptr) = count + 1;\r
1744                                 }\r
1745                                 detect_traps(rad, TRUE);\r
1746                                 detect_doors(rad);\r
1747                                 detect_stairs(rad);\r
1748 \r
1749                                 if (plev > 14 && count < 3)\r
1750                                         SINGING_COUNT(p_ptr) = count + 1;\r
1751                         }\r
1752                 }\r
1753 \r
1754                 break;\r
1755 \r
1756         case 9:\r
1757                 if (name) return _("魂の歌", "Soul Shriek");\r
1758                 if (desc) return _("視界内の全てのモンスターに対して精神攻撃を行う。", "Damages all monsters in sight with PSI damages.");\r
1759 \r
1760                 /* Stop singing before start another */\r
1761                 if (cast || fail) stop_singing();\r
1762 \r
1763                 if (cast)\r
1764                 {\r
1765                         msg_print(_("精神を捻じ曲げる歌を歌った...", "You start singing a song of soul in pain..."));\r
1766                         start_singing(spell, MUSIC_PSI);\r
1767                 }\r
1768 \r
1769                 {\r
1770                         int dice = 1;\r
1771                         int sides = plev * 3 / 2;\r
1772 \r
1773                         if (info) return info_damage(dice, sides, 0);\r
1774 \r
1775                         if (cont)\r
1776                         {\r
1777                                 project_hack(GF_PSI, damroll(dice, sides));\r
1778                         }\r
1779                 }\r
1780 \r
1781                 break;\r
1782 \r
1783         case 10:\r
1784                 if (name) return _("知識の歌", "Song of Lore");\r
1785                 if (desc) return _("自分のいるマスと隣りのマスに落ちているアイテムを鑑定する。", "Identifies all items which are in the adjacent squares.");\r
1786     \r
1787                 /* Stop singing before start another */\r
1788                 if (cast || fail) stop_singing();\r
1789 \r
1790                 if (cast)\r
1791                 {\r
1792                         msg_print(_("この世界の知識が流れ込んできた...", "You recall the rich lore of the world..."));\r
1793                         start_singing(spell, MUSIC_ID);\r
1794                 }\r
1795 \r
1796                 {\r
1797                         int rad = 1;\r
1798 \r
1799                         if (info) return info_radius(rad);\r
1800 \r
1801                         /*\r
1802                          * 歌の開始時にも効果発動:\r
1803                          * MP不足で鑑定が発動される前に歌が中断してしまうのを防止。\r
1804                          */\r
1805                         if (cont || cast)\r
1806                         {\r
1807                                 project(0, rad, p_ptr->y, p_ptr->x, 0, GF_IDENTIFY, PROJECT_ITEM, -1);\r
1808                         }\r
1809                 }\r
1810 \r
1811                 break;\r
1812 \r
1813         case 11:\r
1814                 if (name) return _("隠遁の歌", "Hiding Tune");\r
1815                 if (desc) return _("隠密行動能力を上昇させる。", "Gives improved stealth.");\r
1816 \r
1817                 /* Stop singing before start another */\r
1818                 if (cast || fail) stop_singing();\r
1819 \r
1820                 if (cast)\r
1821                 {\r
1822                         msg_print(_("あなたの姿が景色にとけこんでいった...", "Your song carries you beyond the sight of mortal eyes..."));\r
1823                         start_singing(spell, MUSIC_STEALTH);\r
1824                 }\r
1825 \r
1826                 if (stop)\r
1827                 {\r
1828                         if (!p_ptr->tim_stealth)\r
1829                         {\r
1830                                 msg_print(_("姿がはっきりと見えるようになった。", "You are no longer hided."));\r
1831                         }\r
1832                 }\r
1833 \r
1834                 break;\r
1835 \r
1836         case 12:\r
1837                 if (name) return _("幻影の旋律", "Illusion Pattern");\r
1838                 if (desc) return _("視界内の全てのモンスターを混乱させる。抵抗されると無効。", "Attempts to confuse all monsters in sight.");\r
1839     \r
1840                 /* Stop singing before start another */\r
1841                 if (cast || fail) stop_singing();\r
1842 \r
1843                 if (cast)\r
1844                 {\r
1845                         msg_print(_("辺り一面に幻影が現れた...", "You weave a pattern of sounds to beguile and confuse..."));\r
1846                         start_singing(spell, MUSIC_CONF);\r
1847                 }\r
1848 \r
1849                 {\r
1850                         int power = plev * 2;\r
1851 \r
1852                         if (info) return info_power(power);\r
1853 \r
1854                         if (cont)\r
1855                         {\r
1856                                 confuse_monsters(power);\r
1857                         }\r
1858                 }\r
1859 \r
1860                 break;\r
1861 \r
1862         case 13:\r
1863                 if (name) return _("破滅の叫び", "Doomcall");\r
1864                 if (desc) return _("視界内の全てのモンスターに対して轟音攻撃を行う。", "Damages all monsters in sight with booming sound.");\r
1865     \r
1866                 /* Stop singing before start another */\r
1867                 if (cast || fail) stop_singing();\r
1868 \r
1869                 if (cast)\r
1870                 {\r
1871                         msg_print(_("轟音が響いた...", "The fury of the Downfall of Numenor lashes out..."));\r
1872                         start_singing(spell, MUSIC_SOUND);\r
1873                 }\r
1874 \r
1875                 {\r
1876                         int dice = 10 + plev / 5;\r
1877                         int sides = 7;\r
1878 \r
1879                         if (info) return info_damage(dice, sides, 0);\r
1880 \r
1881                         if (cont)\r
1882                         {\r
1883                                 project_hack(GF_SOUND, damroll(dice, sides));\r
1884                         }\r
1885                 }\r
1886 \r
1887                 break;\r
1888 \r
1889         case 14:\r
1890                 if (name) return _("フィリエルの歌", "Firiel's Song");\r
1891                 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");\r
1892     \r
1893                 {\r
1894                         /* Stop singing before start another */\r
1895                         if (cast || fail) stop_singing();\r
1896 \r
1897                         if (cast)\r
1898                         {\r
1899                                 msg_print(_("生命と復活のテーマを奏で始めた...", "The themes of life and revival are woven into your song..."));\r
1900                                 animate_dead(0, p_ptr->y, p_ptr->x);\r
1901                         }\r
1902                 }\r
1903                 break;\r
1904 \r
1905         case 15:\r
1906                 if (name) return _("旅の仲間", "Fellowship Chant");\r
1907                 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");\r
1908 \r
1909                 /* Stop singing before start another */\r
1910                 if (cast || fail) stop_singing();\r
1911 \r
1912                 if (cast)\r
1913                 {\r
1914                         msg_print(_("安らかなメロディを奏で始めた...", "You weave a slow, soothing melody of imploration..."));\r
1915                         start_singing(spell, MUSIC_CHARM);\r
1916                 }\r
1917 \r
1918                 {\r
1919                         int dice = 10 + plev / 15;\r
1920                         int sides = 6;\r
1921 \r
1922                         if (info) return info_power_dice(dice, sides);\r
1923 \r
1924                         if (cont)\r
1925                         {\r
1926                                 charm_monsters(damroll(dice, sides));\r
1927                         }\r
1928                 }\r
1929 \r
1930                 break;\r
1931 \r
1932         case 16:\r
1933                 if (name) return _("分解音波", "Sound of disintegration");\r
1934                 if (desc) return _("壁を掘り進む。自分の足元のアイテムは蒸発する。", "Makes you be able to burrow into walls. Objects under your feet evaporate.");\r
1935 \r
1936                 /* Stop singing before start another */\r
1937                 if (cast || fail) stop_singing();\r
1938 \r
1939                 if (cast)\r
1940                 {\r
1941                         msg_print(_("粉砕するメロディを奏で始めた...", "You weave a violent pattern of sounds to break wall."));\r
1942                         start_singing(spell, MUSIC_WALL);\r
1943                 }\r
1944 \r
1945                 {\r
1946                         /*\r
1947                          * 歌の開始時にも効果発動:\r
1948                          * MP不足で効果が発動される前に歌が中断してしまうのを防止。\r
1949                          */\r
1950                         if (cont || cast)\r
1951                         {\r
1952                                 project(0, 0, p_ptr->y, p_ptr->x,\r
1953                                         0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1);\r
1954                         }\r
1955                 }\r
1956                 break;\r
1957 \r
1958         case 17:\r
1959                 if (name) return _("元素耐性", "Finrod's Resistance");\r
1960                 if (desc) return _("酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。", \r
1961                         "Gives resistance to fire, cold, electricity, acid and poison. These resistances can be added to which from equipment for more powerful resistances.");\r
1962     \r
1963                 /* Stop singing before start another */\r
1964                 if (cast || fail) stop_singing();\r
1965 \r
1966                 if (cast)\r
1967                 {\r
1968                         msg_print(_("元素の力に対する忍耐の歌を歌った。", "You sing a song of perseverance against powers..."));\r
1969                         start_singing(spell, MUSIC_RESIST);\r
1970                 }\r
1971 \r
1972                 if (stop)\r
1973                 {\r
1974                         if (!p_ptr->oppose_acid)\r
1975                         {\r
1976                                 msg_print(_("酸への耐性が薄れた気がする。", "You feel less resistant to acid."));\r
1977                         }\r
1978 \r
1979                         if (!p_ptr->oppose_elec)\r
1980                         {\r
1981                                 msg_print(_("電撃への耐性が薄れた気がする。", "You feel less resistant to elec."));\r
1982                         }\r
1983 \r
1984                         if (!p_ptr->oppose_fire)\r
1985                         {\r
1986                                 msg_print(_("火への耐性が薄れた気がする。", "You feel less resistant to fire."));\r
1987                         }\r
1988 \r
1989                         if (!p_ptr->oppose_cold)\r
1990                         {\r
1991                                 msg_print(_("冷気への耐性が薄れた気がする。", "You feel less resistant to cold."));\r
1992                         }\r
1993 \r
1994                         if (!p_ptr->oppose_pois)\r
1995                         {\r
1996                                 msg_print(_("毒への耐性が薄れた気がする。", "You feel less resistant to pois."));\r
1997                         }\r
1998                 }\r
1999 \r
2000                 break;\r
2001 \r
2002         case 18:\r
2003                 if (name) return _("ホビットのメロディ", "Hobbit Melodies");\r
2004                 if (desc) return _("加速する。", "Hastes you.");\r
2005 \r
2006                 /* Stop singing before start another */\r
2007                 if (cast || fail) stop_singing();\r
2008 \r
2009                 if (cast)\r
2010                 {\r
2011                         msg_print(_("軽快な歌を口ずさみ始めた...", "You start singing joyful pop song..."));\r
2012                         start_singing(spell, MUSIC_SPEED);\r
2013                 }\r
2014 \r
2015                 if (stop)\r
2016                 {\r
2017                         if (!p_ptr->fast)\r
2018                         {\r
2019                                 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));\r
2020                         }\r
2021                 }\r
2022 \r
2023                 break;\r
2024 \r
2025         case 19:\r
2026                 if (name) return _("歪んだ世界", "World Contortion");\r
2027                 if (desc) return _("近くのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all nearby monsters away unless resisted.");\r
2028     \r
2029                 {\r
2030                         int rad = plev / 15 + 1;\r
2031                         int power = plev * 3 + 1;\r
2032 \r
2033                         if (info) return info_radius(rad);\r
2034 \r
2035                         /* Stop singing before start another */\r
2036                         if (cast || fail) stop_singing();\r
2037 \r
2038                         if (cast)\r
2039                         {\r
2040                                 msg_print(_("歌が空間を歪めた...", "Reality whirls wildly as you sing a dizzying melody..."));\r
2041                                 project(0, rad, p_ptr->y, p_ptr->x, power, GF_AWAY_ALL, PROJECT_KILL, -1);\r
2042                         }\r
2043                 }\r
2044                 break;\r
2045 \r
2046         case 20:\r
2047                 if (name) return _("退散の歌", "Dispelling chant");\r
2048                 if (desc) return _("視界内の全てのモンスターにダメージを与える。邪悪なモンスターに特に大きなダメージを与える。", \r
2049                         "Damages all monsters in sight. Hurts evil monsters greatly.");\r
2050     \r
2051                 /* Stop singing before start another */\r
2052                 if (cast || fail) stop_singing();\r
2053 \r
2054                 if (cast)\r
2055                 {\r
2056                         msg_print(_("耐えられない不協和音が敵を責め立てた...", "You cry out in an ear-wracking voice..."));\r
2057                         start_singing(spell, MUSIC_DISPEL);\r
2058                 }\r
2059 \r
2060                 {\r
2061                         int m_sides = plev * 3;\r
2062                         int e_sides = plev * 3;\r
2063 \r
2064                         if (info) return format("%s1d%d+1d%d", s_dam, m_sides, e_sides);\r
2065 \r
2066                         if (cont)\r
2067                         {\r
2068                                 dispel_monsters(randint1(m_sides));\r
2069                                 dispel_evil(randint1(e_sides));\r
2070                         }\r
2071                 }\r
2072                 break;\r
2073 \r
2074         case 21:\r
2075                 if (name) return _("サルマンの甘言", "The Voice of Saruman");\r
2076                 if (desc) return _("視界内の全てのモンスターを減速させ、眠らせようとする。抵抗されると無効。", "Attempts to slow and sleep all monsters in sight.");\r
2077     \r
2078                 /* Stop singing before start another */\r
2079                 if (cast || fail) stop_singing();\r
2080 \r
2081                 if (cast)\r
2082                 {\r
2083                         msg_print(_("優しく、魅力的な歌を口ずさみ始めた...", "You start humming a gentle and attractive song..."));\r
2084                         start_singing(spell, MUSIC_SARUMAN);\r
2085                 }\r
2086 \r
2087                 {\r
2088                         int power = plev;\r
2089 \r
2090                         if (info) return info_power(power);\r
2091 \r
2092                         if (cont)\r
2093                         {\r
2094                                 slow_monsters(plev);\r
2095                                 sleep_monsters(plev);\r
2096                         }\r
2097                 }\r
2098 \r
2099                 break;\r
2100 \r
2101         case 22:\r
2102                 if (name) return _("嵐の音色", "Song of the Tempest");\r
2103                 if (desc) return _("轟音のビームを放つ。", "Fires a beam of sound.");\r
2104     \r
2105                 {\r
2106                         int dice = 15 + (plev - 1) / 2;\r
2107                         int sides = 10;\r
2108 \r
2109                         if (info) return info_damage(dice, sides, 0);\r
2110 \r
2111                         /* Stop singing before start another */\r
2112                         if (cast || fail) stop_singing();\r
2113 \r
2114                         if (cast)\r
2115                         {\r
2116                                 if (!get_aim_dir(&dir)) return NULL;\r
2117 \r
2118                                 fire_beam(GF_SOUND, dir, damroll(dice, sides));\r
2119                         }\r
2120                 }\r
2121                 break;\r
2122 \r
2123         case 23:\r
2124                 if (name) return _("もう一つの世界", "Ambarkanta");\r
2125                 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");\r
2126     \r
2127                 {\r
2128                         int base = 15;\r
2129                         int sides = 20;\r
2130 \r
2131                         if (info) return info_delay(base, sides);\r
2132 \r
2133                         /* Stop singing before start another */\r
2134                         if (cast || fail) stop_singing();\r
2135 \r
2136                         if (cast)\r
2137                         {\r
2138                                 msg_print(_("周囲が変化し始めた...", "You sing of the primeval shaping of Middle-earth..."));\r
2139                                 alter_reality();\r
2140                         }\r
2141                 }\r
2142                 break;\r
2143 \r
2144         case 24:\r
2145                 if (name) return _("破壊の旋律", "Wrecking Pattern");\r
2146                 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。", \r
2147                         "Shakes dungeon structure, and results in random swapping of floors and walls.");\r
2148 \r
2149                 /* Stop singing before start another */\r
2150                 if (cast || fail) stop_singing();\r
2151 \r
2152                 if (cast)\r
2153                 {\r
2154                         msg_print(_("破壊的な歌が響きわたった...", "You weave a pattern of sounds to contort and shatter..."));\r
2155                         start_singing(spell, MUSIC_QUAKE);\r
2156                 }\r
2157 \r
2158                 {\r
2159                         int rad = 10;\r
2160 \r
2161                         if (info) return info_radius(rad);\r
2162 \r
2163                         if (cont)\r
2164                         {\r
2165                                 earthquake(p_ptr->y, p_ptr->x, 10);\r
2166                         }\r
2167                 }\r
2168 \r
2169                 break;\r
2170 \r
2171 \r
2172         case 25:\r
2173                 if (name) return _("停滞の歌", "Stationary Shriek");\r
2174                 if (desc) return _("視界内の全てのモンスターを麻痺させようとする。抵抗されると無効。", "Attempts to freeze all monsters in sight.");\r
2175     \r
2176                 /* Stop singing before start another */\r
2177                 if (cast || fail) stop_singing();\r
2178 \r
2179                 if (cast)\r
2180                 {\r
2181                         msg_print(_("ゆっくりとしたメロディを奏で始めた...", "You weave a very slow pattern which is almost likely to stop..."));\r
2182                         start_singing(spell, MUSIC_STASIS);\r
2183                 }\r
2184 \r
2185                 {\r
2186                         int power = plev * 4;\r
2187 \r
2188                         if (info) return info_power(power);\r
2189 \r
2190                         if (cont)\r
2191                         {\r
2192                                 stasis_monsters(power);\r
2193                         }\r
2194                 }\r
2195 \r
2196                 break;\r
2197 \r
2198         case 26:\r
2199                 if (name) return _("守りの歌", "Endurance");\r
2200                 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。", \r
2201                         "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
2202     \r
2203                 {\r
2204                         /* Stop singing before start another */\r
2205                         if (cast || fail) stop_singing();\r
2206 \r
2207                         if (cast)\r
2208                         {\r
2209                                 msg_print(_("歌が神聖な場を作り出した...", "The holy power of the Music is creating sacred field..."));\r
2210                                 warding_glyph();\r
2211                         }\r
2212                 }\r
2213                 break;\r
2214 \r
2215         case 27:\r
2216                 if (name) return _("英雄の詩", "The Hero's Poem");\r
2217                 if (desc) return _("加速し、ヒーロー気分になり、視界内の全てのモンスターにダメージを与える。", \r
2218                         "Hastes you. Gives heroism. Damages all monsters in sight.");\r
2219     \r
2220                 /* Stop singing before start another */\r
2221                 if (cast || fail) stop_singing();\r
2222 \r
2223                 if (cast)\r
2224                 {\r
2225                         msg_print(_("英雄の歌を口ずさんだ...", "You chant a powerful, heroic call to arms..."));\r
2226                         (void)hp_player(10);\r
2227                         (void)set_afraid(0);\r
2228 \r
2229                         /* Recalculate hitpoints */\r
2230                         p_ptr->update |= (PU_HP);\r
2231 \r
2232                         start_singing(spell, MUSIC_SHERO);\r
2233                 }\r
2234 \r
2235                 if (stop)\r
2236                 {\r
2237                         if (!p_ptr->hero)\r
2238                         {\r
2239                                 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));\r
2240                                 /* Recalculate hitpoints */\r
2241                                 p_ptr->update |= (PU_HP);\r
2242                         }\r
2243 \r
2244                         if (!p_ptr->fast)\r
2245                         {\r
2246                                 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));\r
2247                         }\r
2248                 }\r
2249 \r
2250                 {\r
2251                         int dice = 1;\r
2252                         int sides = plev * 3;\r
2253 \r
2254                         if (info) return info_damage(dice, sides, 0);\r
2255 \r
2256                         if (cont)\r
2257                         {\r
2258                                 dispel_monsters(damroll(dice, sides));\r
2259                         }\r
2260                 }\r
2261                 break;\r
2262 \r
2263         case 28:\r
2264                 if (name) return _("ヤヴァンナの助け", "Relief of Yavanna");\r
2265                 if (desc) return _("強力な回復の歌で、負傷と朦朧状態も全快する。", "Powerful healing song. Also heals cut and stun completely.");\r
2266     \r
2267                 /* Stop singing before start another */\r
2268                 if (cast || fail) stop_singing();\r
2269 \r
2270                 if (cast)\r
2271                 {\r
2272                         msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing the song..."));\r
2273                         start_singing(spell, MUSIC_H_LIFE);\r
2274                 }\r
2275 \r
2276                 {\r
2277                         int dice = 15;\r
2278                         int sides = 10;\r
2279 \r
2280                         if (info) return info_heal(dice, sides, 0);\r
2281 \r
2282                         if (cont)\r
2283                         {\r
2284                                 hp_player(damroll(dice, sides));\r
2285                                 set_stun(0);\r
2286                                 set_cut(0);\r
2287                         }\r
2288                 }\r
2289 \r
2290                 break;\r
2291 \r
2292         case 29:\r
2293                 if (name) return _("再生の歌", "Goddess' rebirth");\r
2294                 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");\r
2295     \r
2296                 {\r
2297                         /* Stop singing before start another */\r
2298                         if (cast || fail) stop_singing();\r
2299 \r
2300                         if (cast)\r
2301                         {\r
2302                                 msg_print(_("暗黒の中に光と美をふりまいた。体が元の活力を取り戻した。",\r
2303                                                         "You strewed light and beauty in the dark as you sing. You feel refreshed."));\r
2304                                 (void)do_res_stat(A_STR);\r
2305                                 (void)do_res_stat(A_INT);\r
2306                                 (void)do_res_stat(A_WIS);\r
2307                                 (void)do_res_stat(A_DEX);\r
2308                                 (void)do_res_stat(A_CON);\r
2309                                 (void)do_res_stat(A_CHR);\r
2310                                 (void)restore_level();\r
2311                         }\r
2312                 }\r
2313                 break;\r
2314 \r
2315         case 30:\r
2316                 if (name) return _("サウロンの魔術", "Wizardry of Sauron");\r
2317                 if (desc) return _("非常に強力でごく小さい轟音の球を放つ。", "Fires an extremely powerful tiny ball of sound.");\r
2318     \r
2319                 {\r
2320                         int dice = 50 + plev;\r
2321                         int sides = 10;\r
2322                         int rad = 0;\r
2323 \r
2324                         if (info) return info_damage(dice, sides, 0);\r
2325 \r
2326                         /* Stop singing before start another */\r
2327                         if (cast || fail) stop_singing();\r
2328 \r
2329                         if (cast)\r
2330                         {\r
2331                                 if (!get_aim_dir(&dir)) return NULL;\r
2332 \r
2333                                 fire_ball(GF_SOUND, dir, damroll(dice, sides), rad);\r
2334                         }\r
2335                 }\r
2336                 break;\r
2337 \r
2338         case 31:\r
2339                 if (name) return _("フィンゴルフィンの挑戦", "Fingolfin's Challenge");\r
2340                 if (desc) return _("ダメージを受けなくなるバリアを張る。", \r
2341                         "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks.");\r
2342     \r
2343                 /* Stop singing before start another */\r
2344                 if (cast || fail) stop_singing();\r
2345 \r
2346                 if (cast)\r
2347                 {\r
2348                         msg_print(_("フィンゴルフィンの冥王への挑戦を歌った...",\r
2349                                                 "You recall the valor of Fingolfin's challenge to the Dark Lord..."));\r
2350 \r
2351                         /* Redraw map */\r
2352                         p_ptr->redraw |= (PR_MAP);\r
2353                 \r
2354                         /* Update monsters */\r
2355                         p_ptr->update |= (PU_MONSTERS);\r
2356                 \r
2357                         /* Window stuff */\r
2358                         p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);\r
2359 \r
2360                         start_singing(spell, MUSIC_INVULN);\r
2361                 }\r
2362 \r
2363                 if (stop)\r
2364                 {\r
2365                         if (!p_ptr->invuln)\r
2366                         {\r
2367                                 msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));\r
2368                                 /* Redraw map */\r
2369                                 p_ptr->redraw |= (PR_MAP);\r
2370 \r
2371                                 /* Update monsters */\r
2372                                 p_ptr->update |= (PU_MONSTERS);\r
2373 \r
2374                                 /* Window stuff */\r
2375                                 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);\r
2376                         }\r
2377                 }\r
2378 \r
2379                 break;\r
2380         }\r
2381 \r
2382         return "";\r
2383 }\r
2384 \r
2385 /*!\r
2386  * @brief 剣術の各処理を行う\r
2387  * @param spell 剣術ID\r
2388  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_CAST)\r
2389  * @return SPELL_NAME / SPELL_DESC 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。\r
2390  */\r
2391 static cptr do_hissatsu_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
2392 {\r
2393         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
2394         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
2395         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
2396 \r
2397         int dir;\r
2398         int plev = p_ptr->lev;\r
2399 \r
2400         switch (spell)\r
2401         {\r
2402         case 0:\r
2403                 if (name) return _("飛飯綱", "Tobi-Izuna");\r
2404                 if (desc) return _("2マス離れたところにいるモンスターを攻撃する。", "Attacks a two squares distant monster.");\r
2405     \r
2406                 if (cast)\r
2407                 {\r
2408                         project_length = 2;\r
2409                         if (!get_aim_dir(&dir)) return NULL;\r
2410 \r
2411                         project_hook(GF_ATTACK, dir, HISSATSU_2, PROJECT_STOP | PROJECT_KILL);\r
2412                 }\r
2413                 break;\r
2414 \r
2415         case 1:\r
2416                 if (name) return _("五月雨斬り", "3-Way Attack");\r
2417                 if (desc) return _("3方向に対して攻撃する。", "Attacks in 3 directions in one time.");\r
2418     \r
2419                 if (cast)\r
2420                 {\r
2421                         int cdir;\r
2422                         int y, x;\r
2423 \r
2424                         if (!get_rep_dir2(&dir)) return NULL;\r
2425                         if (dir == 5) return NULL;\r
2426 \r
2427                         for (cdir = 0;cdir < 8; cdir++)\r
2428                         {\r
2429                                 if (cdd[cdir] == dir) break;\r
2430                         }\r
2431 \r
2432                         if (cdir == 8) return NULL;\r
2433 \r
2434                         y = p_ptr->y + ddy_cdd[cdir];\r
2435                         x = p_ptr->x + ddx_cdd[cdir];\r
2436                         if (cave[y][x].m_idx)\r
2437                                 py_attack(y, x, 0);\r
2438                         else\r
2439                                 msg_print(_("攻撃は空を切った。", "You attack the empty air."));\r
2440                         \r
2441                         y = p_ptr->y + ddy_cdd[(cdir + 7) % 8];\r
2442                         x = p_ptr->x + ddx_cdd[(cdir + 7) % 8];\r
2443                         if (cave[y][x].m_idx)\r
2444                                 py_attack(y, x, 0);\r
2445                         else\r
2446                                 msg_print(_("攻撃は空を切った。", "You attack the empty air."));\r
2447                         \r
2448                         y = p_ptr->y + ddy_cdd[(cdir + 1) % 8];\r
2449                         x = p_ptr->x + ddx_cdd[(cdir + 1) % 8];\r
2450                         if (cave[y][x].m_idx)\r
2451                                 py_attack(y, x, 0);\r
2452                         else\r
2453                                 msg_print(_("攻撃は空を切った。", "You attack the empty air."));\r
2454                 }\r
2455                 break;\r
2456 \r
2457         case 2:\r
2458                 if (name) return _("ブーメラン", "Boomerang");\r
2459                 if (desc) return _("武器を手元に戻ってくるように投げる。戻ってこないこともある。", \r
2460                         "Throws current weapon. And it'll return to your hand unless failed.");\r
2461     \r
2462                 if (cast)\r
2463                 {\r
2464                         if (!do_cmd_throw(1, TRUE, -1)) return NULL;\r
2465                 }\r
2466                 break;\r
2467 \r
2468         case 3:\r
2469                 if (name) return _("焔霊", "Burning Strike");\r
2470                 if (desc) return _("火炎耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to fire.");\r
2471     \r
2472                 if (cast)\r
2473                 {\r
2474                         int y, x;\r
2475 \r
2476                         if (!get_rep_dir2(&dir)) return NULL;\r
2477                         if (dir == 5) return NULL;\r
2478 \r
2479                         y = p_ptr->y + ddy[dir];\r
2480                         x = p_ptr->x + ddx[dir];\r
2481 \r
2482                         if (cave[y][x].m_idx)\r
2483                                 py_attack(y, x, HISSATSU_FIRE);\r
2484                         else\r
2485                         {\r
2486                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
2487                                 return NULL;\r
2488                         }\r
2489                 }\r
2490                 break;\r
2491 \r
2492         case 4:\r
2493                 if (name) return _("殺気感知", "Detect Ferocity");\r
2494                 if (desc) return _("近くの思考することができるモンスターを感知する。", "Detects all monsters except mindless in your vicinity.");\r
2495     \r
2496                 if (cast)\r
2497                 {\r
2498                         detect_monsters_mind(DETECT_RAD_DEFAULT);\r
2499                 }\r
2500                 break;\r
2501 \r
2502         case 5:\r
2503                 if (name) return _("みね打ち", "Strike to Stun");\r
2504                 if (desc) return _("相手にダメージを与えないが、朦朧とさせる。", "Attempts to stun a monster in the adjacent.");\r
2505     \r
2506                 if (cast)\r
2507                 {\r
2508                         int y, x;\r
2509 \r
2510                         if (!get_rep_dir2(&dir)) return NULL;\r
2511                         if (dir == 5) return NULL;\r
2512 \r
2513                         y = p_ptr->y + ddy[dir];\r
2514                         x = p_ptr->x + ddx[dir];\r
2515 \r
2516                         if (cave[y][x].m_idx)\r
2517                                 py_attack(y, x, HISSATSU_MINEUCHI);\r
2518                         else\r
2519                         {\r
2520                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
2521                                 return NULL;\r
2522                         }\r
2523                 }\r
2524                 break;\r
2525 \r
2526         case 6:\r
2527                 if (name) return _("カウンター", "Counter");\r
2528                 if (desc) return _("相手に攻撃されたときに反撃する。反撃するたびにMPを消費。", \r
2529                         "Prepares to counterattack. When attack by a monster, strikes back using SP each time.");\r
2530     \r
2531                 if (cast)\r
2532                 {\r
2533                         if (p_ptr->riding)\r
2534                         {\r
2535                                 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));\r
2536                                 return NULL;\r
2537                         }\r
2538                         msg_print(_("相手の攻撃に対して身構えた。", "You prepare to counter blow."));\r
2539                         p_ptr->counter = TRUE;\r
2540                 }\r
2541                 break;\r
2542 \r
2543         case 7:\r
2544                 if (name) return _("払い抜け", "Harainuke");\r
2545                 if (desc) return _("攻撃した後、反対側に抜ける。", \r
2546                         "Attacks monster with your weapons normally, then move through counter side of the monster.");\r
2547     \r
2548                 if (cast)\r
2549                 {\r
2550                         POSITION y, x;\r
2551 \r
2552                         if (p_ptr->riding)\r
2553                         {\r
2554                                 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));\r
2555                                 return NULL;\r
2556                         }\r
2557         \r
2558                         if (!get_rep_dir2(&dir)) return NULL;\r
2559         \r
2560                         if (dir == 5) return NULL;\r
2561                         y = p_ptr->y + ddy[dir];\r
2562                         x = p_ptr->x + ddx[dir];\r
2563         \r
2564                         if (!cave[y][x].m_idx)\r
2565                         {\r
2566                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
2567                                 return NULL;\r
2568                         }\r
2569         \r
2570                         py_attack(y, x, 0);\r
2571         \r
2572                         if (!player_can_enter(cave[y][x].feat, 0) || is_trap(cave[y][x].feat))\r
2573                                 break;\r
2574         \r
2575                         y += ddy[dir];\r
2576                         x += ddx[dir];\r
2577         \r
2578                         if (player_can_enter(cave[y][x].feat, 0) && !is_trap(cave[y][x].feat) && !cave[y][x].m_idx)\r
2579                         {\r
2580                                 msg_print(NULL);\r
2581         \r
2582                                 /* Move the player */\r
2583                                 (void)move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);\r
2584                         }\r
2585                 }\r
2586                 break;\r
2587 \r
2588         case 8:\r
2589                 if (name) return _("サーペンツタン", "Serpent's Tongue");\r
2590                 if (desc) return _("毒耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to poison.");\r
2591     \r
2592                 if (cast)\r
2593                 {\r
2594                         int y, x;\r
2595 \r
2596                         if (!get_rep_dir2(&dir)) return NULL;\r
2597                         if (dir == 5) return NULL;\r
2598 \r
2599                         y = p_ptr->y + ddy[dir];\r
2600                         x = p_ptr->x + ddx[dir];\r
2601 \r
2602                         if (cave[y][x].m_idx)\r
2603                                 py_attack(y, x, HISSATSU_POISON);\r
2604                         else\r
2605                         {\r
2606                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
2607                                 return NULL;\r
2608                         }\r
2609                 }\r
2610                 break;\r
2611 \r
2612         case 9:\r
2613                 if (name) return _("斬魔剣弐の太刀", "Zammaken");\r
2614                 if (desc) return _("生命のない邪悪なモンスターに大ダメージを与えるが、他のモンスターには全く効果がない。", \r
2615                         "Attacks an evil unliving monster with great damage. No effect to other  monsters.");\r
2616     \r
2617                 if (cast)\r
2618                 {\r
2619                         int y, x;\r
2620 \r
2621                         if (!get_rep_dir2(&dir)) return NULL;\r
2622                         if (dir == 5) return NULL;\r
2623 \r
2624                         y = p_ptr->y + ddy[dir];\r
2625                         x = p_ptr->x + ddx[dir];\r
2626 \r
2627                         if (cave[y][x].m_idx)\r
2628                                 py_attack(y, x, HISSATSU_ZANMA);\r
2629                         else\r
2630                         {\r
2631                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
2632                                 return NULL;\r
2633                         }\r
2634                 }\r
2635                 break;\r
2636 \r
2637         case 10:\r
2638                 if (name) return _("裂風剣", "Wind Blast");\r
2639                 if (desc) return _("攻撃した相手を後方へ吹き飛ばす。", "Attacks an adjacent monster, and blow it away.");\r
2640     \r
2641                 if (cast)\r
2642                 {\r
2643                         int y, x;\r
2644 \r
2645                         if (!get_rep_dir2(&dir)) return NULL;\r
2646                         if (dir == 5) return NULL;\r
2647 \r
2648                         y = p_ptr->y + ddy[dir];\r
2649                         x = p_ptr->x + ddx[dir];\r
2650 \r
2651                         if (cave[y][x].m_idx)\r
2652                                 py_attack(y, x, 0);\r
2653                         else\r
2654                         {\r
2655                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
2656                                 return NULL;\r
2657                         }\r
2658                         if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)\r
2659                         {\r
2660                                 return "";\r
2661                         }\r
2662                         if (cave[y][x].m_idx)\r
2663                         {\r
2664                                 int i;\r
2665                                 POSITION ty = y, tx = x;\r
2666                                 POSITION oy = y, ox = x;\r
2667                                 MONSTER_IDX m_idx = cave[y][x].m_idx;\r
2668                                 monster_type *m_ptr = &m_list[m_idx];\r
2669                                 char m_name[80];\r
2670         \r
2671                                 monster_desc(m_name, m_ptr, 0);\r
2672         \r
2673                                 for (i = 0; i < 5; i++)\r
2674                                 {\r
2675                                         y += ddy[dir];\r
2676                                         x += ddx[dir];\r
2677                                         if (cave_empty_bold(y, x))\r
2678                                         {\r
2679                                                 ty = y;\r
2680                                                 tx = x;\r
2681                                         }\r
2682                                         else break;\r
2683                                 }\r
2684                                 if ((ty != oy) || (tx != ox))\r
2685                                 {\r
2686                                         msg_format(_("%sを吹き飛ばした!", "You blow %s away!"), m_name);\r
2687                                         cave[oy][ox].m_idx = 0;\r
2688                                         cave[ty][tx].m_idx = m_idx;\r
2689                                         m_ptr->fy = ty;\r
2690                                         m_ptr->fx = tx;\r
2691         \r
2692                                         update_mon(m_idx, TRUE);\r
2693                                         lite_spot(oy, ox);\r
2694                                         lite_spot(ty, tx);\r
2695         \r
2696                                         if (r_info[m_ptr->r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))\r
2697                                                 p_ptr->update |= (PU_MON_LITE);\r
2698                                 }\r
2699                         }\r
2700                 }\r
2701                 break;\r
2702 \r
2703         case 11:\r
2704                 if (name) return _("刀匠の目利き", "Judge");\r
2705                 if (desc) return _("武器・防具を1つ識別する。レベル45以上で武器・防具の能力を完全に知ることができる。", \r
2706                         "Identifies a weapon or armor. Or *identifies* these at level 45.");\r
2707     \r
2708                 if (cast)\r
2709                 {\r
2710                         if (plev > 44)\r
2711                         {\r
2712                                 if (!identify_fully(TRUE)) return NULL;\r
2713                         }\r
2714                         else\r
2715                         {\r
2716                                 if (!ident_spell(TRUE)) return NULL;\r
2717                         }\r
2718                 }\r
2719                 break;\r
2720 \r
2721         case 12:\r
2722                 if (name) return _("破岩斬", "Rock Smash");\r
2723                 if (desc) return _("岩を壊し、岩石系のモンスターに大ダメージを与える。", "Breaks rock. Or greatly damage a monster made by rocks.");\r
2724     \r
2725                 if (cast)\r
2726                 {\r
2727                         int y, x;\r
2728 \r
2729                         if (!get_rep_dir2(&dir)) return NULL;\r
2730                         if (dir == 5) return NULL;\r
2731 \r
2732                         y = p_ptr->y + ddy[dir];\r
2733                         x = p_ptr->x + ddx[dir];\r
2734 \r
2735                         if (cave[y][x].m_idx)\r
2736                                 py_attack(y, x, HISSATSU_HAGAN);\r
2737         \r
2738                         if (!cave_have_flag_bold(y, x, FF_HURT_ROCK)) break;\r
2739         \r
2740                         /* Destroy the feature */\r
2741                         cave_alter_feat(y, x, FF_HURT_ROCK);\r
2742         \r
2743                         /* Update some things */\r
2744                         p_ptr->update |= (PU_FLOW);\r
2745                 }\r
2746                 break;\r
2747 \r
2748         case 13:\r
2749                 if (name) return _("乱れ雪月花", "Midare-Setsugekka");\r
2750                 if (desc) return _("攻撃回数が増え、冷気耐性のないモンスターに大ダメージを与える。", \r
2751                         "Attacks a monster with increased number of attacks and more damage unless it has resistance to cold.");\r
2752     \r
2753                 if (cast)\r
2754                 {\r
2755                         int y, x;\r
2756 \r
2757                         if (!get_rep_dir2(&dir)) return NULL;\r
2758                         if (dir == 5) return NULL;\r
2759 \r
2760                         y = p_ptr->y + ddy[dir];\r
2761                         x = p_ptr->x + ddx[dir];\r
2762 \r
2763                         if (cave[y][x].m_idx)\r
2764                                 py_attack(y, x, HISSATSU_COLD);\r
2765                         else\r
2766                         {\r
2767                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
2768                                 return NULL;\r
2769                         }\r
2770                 }\r
2771                 break;\r
2772 \r
2773         case 14:\r
2774                 if (name) return _("急所突き", "Spot Aiming");\r
2775                 if (desc) return _("モンスターを一撃で倒す攻撃を繰り出す。失敗すると1点しかダメージを与えられない。", \r
2776                         "Attempts to kill a monster instantly. If failed cause only 1HP of damage.");\r
2777     \r
2778                 if (cast)\r
2779                 {\r
2780                         int y, x;\r
2781 \r
2782                         if (!get_rep_dir2(&dir)) return NULL;\r
2783                         if (dir == 5) return NULL;\r
2784 \r
2785                         y = p_ptr->y + ddy[dir];\r
2786                         x = p_ptr->x + ddx[dir];\r
2787 \r
2788                         if (cave[y][x].m_idx)\r
2789                                 py_attack(y, x, HISSATSU_KYUSHO);\r
2790                         else\r
2791                         {\r
2792                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
2793                                 return NULL;\r
2794                         }\r
2795                 }\r
2796                 break;\r
2797 \r
2798         case 15:\r
2799                 if (name) return _("魔神斬り", "Majingiri");\r
2800                 if (desc) return _("会心の一撃で攻撃する。攻撃がかわされやすい。", \r
2801                         "Attempts to attack with critical hit. But this attack is easy to evade for a monster.");\r
2802     \r
2803                 if (cast)\r
2804                 {\r
2805                         int y, x;\r
2806 \r
2807                         if (!get_rep_dir2(&dir)) return NULL;\r
2808                         if (dir == 5) return NULL;\r
2809 \r
2810                         y = p_ptr->y + ddy[dir];\r
2811                         x = p_ptr->x + ddx[dir];\r
2812 \r
2813                         if (cave[y][x].m_idx)\r
2814                                 py_attack(y, x, HISSATSU_MAJIN);\r
2815                         else\r
2816                         {\r
2817                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
2818                                 return NULL;\r
2819                         }\r
2820                 }\r
2821                 break;\r
2822 \r
2823         case 16:\r
2824                 if (name) return _("捨て身", "Desperate Attack");\r
2825                 if (desc) return _("強力な攻撃を繰り出す。次のターンまでの間、食らうダメージが増える。", \r
2826                         "Attacks with all of your power. But all damages you take will be doubled for one turn.");\r
2827     \r
2828                 if (cast)\r
2829                 {\r
2830                         int y, x;\r
2831 \r
2832                         if (!get_rep_dir2(&dir)) return NULL;\r
2833                         if (dir == 5) return NULL;\r
2834 \r
2835                         y = p_ptr->y + ddy[dir];\r
2836                         x = p_ptr->x + ddx[dir];\r
2837 \r
2838                         if (cave[y][x].m_idx)\r
2839                                 py_attack(y, x, HISSATSU_SUTEMI);\r
2840                         else\r
2841                         {\r
2842                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
2843                                 return NULL;\r
2844                         }\r
2845                         p_ptr->sutemi = TRUE;\r
2846                 }\r
2847                 break;\r
2848 \r
2849         case 17:\r
2850                 if (name) return _("雷撃鷲爪斬", "Lightning Eagle");\r
2851                 if (desc) return _("電撃耐性のないモンスターに非常に大きいダメージを与える。", \r
2852                         "Attacks a monster with more damage unless it has resistance to electricity.");\r
2853     \r
2854                 if (cast)\r
2855                 {\r
2856                         int y, x;\r
2857 \r
2858                         if (!get_rep_dir2(&dir)) return NULL;\r
2859                         if (dir == 5) return NULL;\r
2860 \r
2861                         y = p_ptr->y + ddy[dir];\r
2862                         x = p_ptr->x + ddx[dir];\r
2863 \r
2864                         if (cave[y][x].m_idx)\r
2865                                 py_attack(y, x, HISSATSU_ELEC);\r
2866                         else\r
2867                         {\r
2868                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
2869                                 return NULL;\r
2870                         }\r
2871                 }\r
2872                 break;\r
2873 \r
2874         case 18:\r
2875                 if (name) return _("入身", "Rush Attack");\r
2876                 if (desc) return _("素早く相手に近寄り攻撃する。", "Steps close to a monster and attacks at a time.");\r
2877     \r
2878                 if (cast)\r
2879                 {\r
2880                         if (!rush_attack(NULL)) return NULL;\r
2881                 }\r
2882                 break;\r
2883 \r
2884         case 19:\r
2885                 if (name) return _("赤流渦", "Bloody Maelstrom");\r
2886                 if (desc) return _("自分自身も傷を作りつつ、その傷が深いほど大きい威力で全方向の敵を攻撃できる。生きていないモンスターには効果がない。", \r
2887                         "Attacks all adjacent monsters with power corresponding to your cut status. Then increases your cut status. No effect to unliving monsters.");\r
2888     \r
2889                 if (cast)\r
2890                 {\r
2891                         int y = 0, x = 0;\r
2892 \r
2893                         cave_type       *c_ptr;\r
2894                         monster_type    *m_ptr;\r
2895         \r
2896                         if (p_ptr->cut < 300)\r
2897                                 set_cut(p_ptr->cut + 300);\r
2898                         else\r
2899                                 set_cut(p_ptr->cut * 2);\r
2900         \r
2901                         for (dir = 0; dir < 8; dir++)\r
2902                         {\r
2903                                 y = p_ptr->y + ddy_ddd[dir];\r
2904                                 x = p_ptr->x + ddx_ddd[dir];\r
2905                                 c_ptr = &cave[y][x];\r
2906         \r
2907                                 /* Get the monster */\r
2908                                 m_ptr = &m_list[c_ptr->m_idx];\r
2909         \r
2910                                 /* Hack -- attack monsters */\r
2911                                 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))\r
2912                                 {\r
2913                                         if (!monster_living(&r_info[m_ptr->r_idx]))\r
2914                                         {\r
2915                                                 char m_name[80];\r
2916         \r
2917                                                 monster_desc(m_name, m_ptr, 0);\r
2918                                                 msg_format(_("%sには効果がない!", "%s is unharmed!"), m_name);\r
2919                                         }\r
2920                                         else py_attack(y, x, HISSATSU_SEKIRYUKA);\r
2921                                 }\r
2922                         }\r
2923                 }\r
2924                 break;\r
2925 \r
2926         case 20:\r
2927                 if (name) return _("激震撃", "Earthquake Blow");\r
2928                 if (desc) return _("地震を起こす。", "Shakes dungeon structure, and results in random swapping of floors and walls.");\r
2929     \r
2930                 if (cast)\r
2931                 {\r
2932                         int y,x;\r
2933 \r
2934                         if (!get_rep_dir2(&dir)) return NULL;\r
2935                         if (dir == 5) return NULL;\r
2936 \r
2937                         y = p_ptr->y + ddy[dir];\r
2938                         x = p_ptr->x + ddx[dir];\r
2939 \r
2940                         if (cave[y][x].m_idx)\r
2941                                 py_attack(y, x, HISSATSU_QUAKE);\r
2942                         else\r
2943                                 earthquake(p_ptr->y, p_ptr->x, 10);\r
2944                 }\r
2945                 break;\r
2946 \r
2947         case 21:\r
2948                 if (name) return _("地走り", "Crack");\r
2949                 if (desc) return _("衝撃波のビームを放つ。", "Fires a beam of shock wave.");\r
2950     \r
2951                 if (cast)\r
2952                 {\r
2953                         int total_damage = 0, basedam, i;\r
2954                         u32b flgs[TR_FLAG_SIZE];\r
2955                         object_type *o_ptr;\r
2956                         if (!get_aim_dir(&dir)) return NULL;\r
2957                         msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));\r
2958                         for (i = 0; i < 2; i++)\r
2959                         {\r
2960                                 int damage;\r
2961         \r
2962                                 if (!buki_motteruka(INVEN_RARM+i)) break;\r
2963                                 o_ptr = &inventory[INVEN_RARM+i];\r
2964                                 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;\r
2965                                 damage = o_ptr->to_d * 100;\r
2966                                 object_flags(o_ptr, flgs);\r
2967                                 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))\r
2968                                 {\r
2969                                         /* vorpal blade */\r
2970                                         basedam *= 5;\r
2971                                         basedam /= 3;\r
2972                                 }\r
2973                                 else if (have_flag(flgs, TR_VORPAL))\r
2974                                 {\r
2975                                         /* vorpal flag only */\r
2976                                         basedam *= 11;\r
2977                                         basedam /= 9;\r
2978                                 }\r
2979                                 damage += basedam;\r
2980                                 damage *= p_ptr->num_blow[i];\r
2981                                 total_damage += damage / 200;\r
2982                                 if (i) total_damage = total_damage*7/10;\r
2983                         }\r
2984                         fire_beam(GF_FORCE, dir, total_damage);\r
2985                 }\r
2986                 break;\r
2987 \r
2988         case 22:\r
2989                 if (name) return _("気迫の雄叫び", "War Cry");\r
2990                 if (desc) return _("視界内の全モンスターに対して轟音の攻撃を行う。さらに、近くにいるモンスターを怒らせる。", \r
2991                         "Damages all monsters in sight with sound. Aggravate nearby monsters.");\r
2992     \r
2993                 if (cast)\r
2994                 {\r
2995                         msg_print(_("雄叫びをあげた!", "You roar out!"));\r
2996                         project_hack(GF_SOUND, randint1(plev * 3));\r
2997                         aggravate_monsters(0);\r
2998                 }\r
2999                 break;\r
3000 \r
3001         case 23:\r
3002                 if (name) return _("無双三段", "Musou-Sandan");\r
3003                 if (desc) return _("強力な3段攻撃を繰り出す。", "Attacks with powerful 3 strikes.");\r
3004     \r
3005                 if (cast)\r
3006                 {\r
3007                         int i;\r
3008 \r
3009                         if (!get_rep_dir2(&dir)) return NULL;\r
3010                         if (dir == 5) return NULL;\r
3011 \r
3012                         for (i = 0; i < 3; i++)\r
3013                         {\r
3014                                 POSITION y, x;\r
3015                                 POSITION ny, nx;\r
3016                                 MONSTER_IDX m_idx;\r
3017                                 cave_type *c_ptr;\r
3018                                 monster_type *m_ptr;\r
3019         \r
3020                                 y = p_ptr->y + ddy[dir];\r
3021                                 x = p_ptr->x + ddx[dir];\r
3022                                 c_ptr = &cave[y][x];\r
3023         \r
3024                                 if (c_ptr->m_idx)\r
3025                                         py_attack(y, x, HISSATSU_3DAN);\r
3026                                 else\r
3027                                 {\r
3028                                         msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
3029                                         return NULL;\r
3030                                 }\r
3031         \r
3032                                 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)\r
3033                                 {\r
3034                                         return "";\r
3035                                 }\r
3036         \r
3037                                 /* Monster is dead? */\r
3038                                 if (!c_ptr->m_idx) break;\r
3039         \r
3040                                 ny = y + ddy[dir];\r
3041                                 nx = x + ddx[dir];\r
3042                                 m_idx = c_ptr->m_idx;\r
3043                                 m_ptr = &m_list[m_idx];\r
3044         \r
3045                                 /* Monster cannot move back? */\r
3046                                 if (!monster_can_enter(ny, nx, &r_info[m_ptr->r_idx], 0))\r
3047                                 {\r
3048                                         /* -more- */\r
3049                                         if (i < 2) msg_print(NULL);\r
3050                                         continue;\r
3051                                 }\r
3052         \r
3053                                 c_ptr->m_idx = 0;\r
3054                                 cave[ny][nx].m_idx = m_idx;\r
3055                                 m_ptr->fy = ny;\r
3056                                 m_ptr->fx = nx;\r
3057         \r
3058                                 update_mon(m_idx, TRUE);\r
3059         \r
3060                                 /* Redraw the old spot */\r
3061                                 lite_spot(y, x);\r
3062         \r
3063                                 /* Redraw the new spot */\r
3064                                 lite_spot(ny, nx);\r
3065         \r
3066                                 /* Player can move forward? */\r
3067                                 if (player_can_enter(c_ptr->feat, 0))\r
3068                                 {\r
3069                                         /* Move the player */\r
3070                                         if (!move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP)) break;\r
3071                                 }\r
3072                                 else\r
3073                                 {\r
3074                                         break;\r
3075                                 }\r
3076 \r
3077                                 /* -more- */\r
3078                                 if (i < 2) msg_print(NULL);\r
3079                         }\r
3080                 }\r
3081                 break;\r
3082 \r
3083         case 24:\r
3084                 if (name) return _("吸血鬼の牙", "Vampire's Fang");\r
3085                 if (desc) return _("攻撃した相手の体力を吸いとり、自分の体力を回復させる。生命を持たないモンスターには通じない。", \r
3086                         "Attacks with vampiric strikes which absorbs HP from a monster and gives them to you. No effect to unliving monsters.");\r
3087     \r
3088                 if (cast)\r
3089                 {\r
3090                         int y, x;\r
3091 \r
3092                         if (!get_rep_dir2(&dir)) return NULL;\r
3093                         if (dir == 5) return NULL;\r
3094 \r
3095                         y = p_ptr->y + ddy[dir];\r
3096                         x = p_ptr->x + ddx[dir];\r
3097 \r
3098                         if (cave[y][x].m_idx)\r
3099                                 py_attack(y, x, HISSATSU_DRAIN);\r
3100                         else\r
3101                         {\r
3102                                         msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
3103                                 return NULL;\r
3104                         }\r
3105                 }\r
3106                 break;\r
3107 \r
3108         case 25:\r
3109                 if (name) return _("幻惑", "Moon Dazzling");\r
3110                 if (desc) return _("視界内の起きている全モンスターに朦朧、混乱、眠りを与えようとする。", "Attempts to stun, confuse and sleep all waking monsters.");\r
3111     \r
3112                 if (cast)\r
3113                 {\r
3114                         msg_print(_("武器を不規則に揺らした...", "You irregularly wave your weapon..."));\r
3115                         project_hack(GF_ENGETSU, plev * 4);\r
3116                         project_hack(GF_ENGETSU, plev * 4);\r
3117                         project_hack(GF_ENGETSU, plev * 4);\r
3118                 }\r
3119                 break;\r
3120 \r
3121         case 26:\r
3122                 if (name) return _("百人斬り", "Hundred Slaughter");\r
3123                 if (desc) return _("連続して入身でモンスターを攻撃する。攻撃するたびにMPを消費。MPがなくなるか、モンスターを倒せなかったら百人斬りは終了する。", \r
3124                         "Performs a series of rush attacks. The series continues while killing each monster in a time and SP remains.");\r
3125     \r
3126                 if (cast)\r
3127                 {\r
3128                         const int mana_cost_per_monster = 8;\r
3129                         bool is_new = TRUE;\r
3130                         bool mdeath;\r
3131 \r
3132                         do\r
3133                         {\r
3134                                 if (!rush_attack(&mdeath)) break;\r
3135                                 if (is_new)\r
3136                                 {\r
3137                                         /* Reserve needed mana point */\r
3138                                         p_ptr->csp -= technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;\r
3139                                         is_new = FALSE;\r
3140                                 }\r
3141                                 else\r
3142                                         p_ptr->csp -= mana_cost_per_monster;\r
3143 \r
3144                                 if (!mdeath) break;\r
3145                                 command_dir = 0;\r
3146 \r
3147                                 p_ptr->redraw |= PR_MANA;\r
3148                                 handle_stuff();\r
3149                         }\r
3150                         while (p_ptr->csp > mana_cost_per_monster);\r
3151 \r
3152                         if (is_new) return NULL;\r
3153         \r
3154                         /* Restore reserved mana */\r
3155                         p_ptr->csp += technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;\r
3156                 }\r
3157                 break;\r
3158 \r
3159         case 27:\r
3160                 if (name) return _("天翔龍閃", "Dragonic Flash");\r
3161                 if (desc) return _("視界内の場所を指定して、その場所と自分の間にいる全モンスターを攻撃し、その場所に移動する。", \r
3162                         "Runs toward given location while attacking all monsters on the path.");\r
3163     \r
3164                 if (cast)\r
3165                 {\r
3166                         POSITION y, x;\r
3167 \r
3168                         if (!tgt_pt(&x, &y)) return NULL;\r
3169 \r
3170                         if (!cave_player_teleportable_bold(y, x, 0L) ||\r
3171                             (distance(y, x, p_ptr->y, p_ptr->x) > MAX_SIGHT / 2) ||\r
3172                             !projectable(p_ptr->y, p_ptr->x, y, x))\r
3173                         {\r
3174                                 msg_print(_("失敗!", "You cannot move to that place!"));\r
3175                                 break;\r
3176                         }\r
3177                         if (p_ptr->anti_tele)\r
3178                         {\r
3179                                 msg_print(_("不思議な力がテレポートを防いだ!", "A mysterious force prevents you from teleporting!"));\r
3180                                 break;\r
3181                         }\r
3182                         project(0, 0, y, x, HISSATSU_ISSEN, GF_ATTACK, PROJECT_BEAM | PROJECT_KILL, -1);\r
3183                         teleport_player_to(y, x, 0L);\r
3184                 }\r
3185                 break;\r
3186 \r
3187         case 28:\r
3188                 if (name) return _("二重の剣撃", "Twin Slash");\r
3189                 if (desc) return _("1ターンで2度攻撃を行う。", "double attacks at a time.");\r
3190     \r
3191                 if (cast)\r
3192                 {\r
3193                         int x, y;\r
3194         \r
3195                         if (!get_rep_dir(&dir, FALSE)) return NULL;\r
3196 \r
3197                         y = p_ptr->y + ddy[dir];\r
3198                         x = p_ptr->x + ddx[dir];\r
3199 \r
3200                         if (cave[y][x].m_idx)\r
3201                         {\r
3202                                 py_attack(y, x, 0);\r
3203                                 if (cave[y][x].m_idx)\r
3204                                 {\r
3205                                         handle_stuff();\r
3206                                         py_attack(y, x, 0);\r
3207                                 }\r
3208                         }\r
3209                         else\r
3210                         {\r
3211                                 msg_print(_("その方向にはモンスターはいません。", "You don't see any monster in this direction"));\r
3212                                 return NULL;\r
3213                         }\r
3214                 }\r
3215                 break;\r
3216 \r
3217         case 29:\r
3218                 if (name) return _("虎伏絶刀勢", "Kofuku-Zettousei");\r
3219                 if (desc) return _("強力な攻撃を行い、近くの場所にも効果が及ぶ。", "Performs a powerful attack which even effect nearby monsters.");\r
3220     \r
3221                 if (cast)\r
3222                 {\r
3223                         int total_damage = 0, basedam, i;\r
3224                         int y, x;\r
3225                         u32b flgs[TR_FLAG_SIZE];\r
3226                         object_type *o_ptr;\r
3227         \r
3228                         if (!get_rep_dir2(&dir)) return NULL;\r
3229                         if (dir == 5) return NULL;\r
3230 \r
3231                         y = p_ptr->y + ddy[dir];\r
3232                         x = p_ptr->x + ddx[dir];\r
3233 \r
3234                         if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)\r
3235                         {\r
3236                                 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));\r
3237                                 return "";\r
3238                         }\r
3239                         msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));\r
3240                         for (i = 0; i < 2; i++)\r
3241                         {\r
3242                                 int damage;\r
3243                                 if (!buki_motteruka(INVEN_RARM+i)) break;\r
3244                                 o_ptr = &inventory[INVEN_RARM+i];\r
3245                                 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;\r
3246                                 damage = o_ptr->to_d * 100;\r
3247                                 object_flags(o_ptr, flgs);\r
3248                                 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))\r
3249                                 {\r
3250                                         /* vorpal blade */\r
3251                                         basedam *= 5;\r
3252                                         basedam /= 3;\r
3253                                 }\r
3254                                 else if (have_flag(flgs, TR_VORPAL))\r
3255                                 {\r
3256                                         /* vorpal flag only */\r
3257                                         basedam *= 11;\r
3258                                         basedam /= 9;\r
3259                                 }\r
3260                                 damage += basedam;\r
3261                                 damage += p_ptr->to_d[i] * 100;\r
3262                                 damage *= p_ptr->num_blow[i];\r
3263                                 total_damage += (damage / 100);\r
3264                         }\r
3265                         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
3266                 }\r
3267                 break;\r
3268 \r
3269         case 30:\r
3270                 if (name) return _("慶雲鬼忍剣", "Keiun-Kininken");\r
3271                 if (desc) return _("自分もダメージをくらうが、相手に非常に大きなダメージを与える。アンデッドには特に効果がある。", \r
3272                         "Attacks a monster with extremely powerful damage. But you also takes some damages. Hurts a undead monster greatly.");\r
3273     \r
3274                 if (cast)\r
3275                 {\r
3276                         int y, x;\r
3277 \r
3278                         if (!get_rep_dir2(&dir)) return NULL;\r
3279                         if (dir == 5) return NULL;\r
3280 \r
3281                         y = p_ptr->y + ddy[dir];\r
3282                         x = p_ptr->x + ddx[dir];\r
3283 \r
3284                         if (cave[y][x].m_idx)\r
3285                                 py_attack(y, x, HISSATSU_UNDEAD);\r
3286                         else\r
3287                         {\r
3288                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
3289                                 return NULL;\r
3290                         }\r
3291                         take_hit(DAMAGE_NOESCAPE, 100 + randint1(100), _("慶雲鬼忍剣を使った衝撃", "exhaustion on using Keiun-Kininken"), -1);\r
3292                 }\r
3293                 break;\r
3294 \r
3295         case 31:\r
3296                 if (name) return _("切腹", "Harakiri");\r
3297                 if (desc) return _("「武士道とは、死ぬことと見つけたり。」", "'Busido is found in death'");\r
3298 \r
3299                 if (cast)\r
3300                 {\r
3301                         int i;\r
3302                         if (!get_check(_("本当に自殺しますか?", "Do you really want to commit suicide? "))) return NULL;\r
3303                                 /* Special Verification for suicide */\r
3304                         prt(_("確認のため '@' を押して下さい。", "Please verify SUICIDE by typing the '@' sign: "), 0, 0);\r
3305         \r
3306                         flush();\r
3307                         i = inkey();\r
3308                         prt("", 0, 0);\r
3309                         if (i != '@') return NULL;\r
3310                         if (p_ptr->total_winner)\r
3311                         {\r
3312                                 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);\r
3313                                 p_ptr->total_winner = TRUE;\r
3314                         }\r
3315                         else\r
3316                         {\r
3317                                 msg_print(_("武士道とは、死ぬことと見つけたり。", "Meaning of Bushi-do is found in the death."));\r
3318                                 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);\r
3319                         }\r
3320                 }\r
3321                 break;\r
3322         }\r
3323 \r
3324         return "";\r
3325 }\r
3326 \r
3327 /*!\r
3328  * @brief 呪術領域の武器呪縛の対象にできる武器かどうかを返す。 / An "item_tester_hook" for offer\r
3329  * @param o_ptr オブジェクト構造体の参照ポインタ\r
3330  * @return 呪縛可能な武器ならばTRUEを返す\r
3331  */\r
3332 static bool item_tester_hook_weapon_except_bow(object_type *o_ptr)\r
3333 {\r
3334         switch (o_ptr->tval)\r
3335         {\r
3336                 case TV_SWORD:\r
3337                 case TV_HAFTED:\r
3338                 case TV_POLEARM:\r
3339                 case TV_DIGGING:\r
3340                 {\r
3341                         return (TRUE);\r
3342                 }\r
3343         }\r
3344 \r
3345         return (FALSE);\r
3346 }\r
3347 \r
3348 /*!\r
3349  * @brief 呪術領域の各処理に使える呪われた装備かどうかを返す。 / An "item_tester_hook" for offer\r
3350  * @param o_ptr オブジェクト構造体の参照ポインタ\r
3351  * @return 使える装備ならばTRUEを返す\r
3352  */\r
3353 static bool item_tester_hook_cursed(object_type *o_ptr)\r
3354 {\r
3355         return (bool)(object_is_cursed(o_ptr));\r
3356 }\r
3357 \r
3358 /*!\r
3359  * @brief 呪術領域魔法の各処理を行う\r
3360  * @param spell 魔法ID\r
3361  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_CONT / SPELL_STOP)\r
3362  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。\r
3363  */\r
3364 static cptr do_hex_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
3365 {\r
3366         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
3367         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
3368         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
3369         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
3370         bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;\r
3371         bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;\r
3372 \r
3373         bool add = TRUE;\r
3374 \r
3375         PLAYER_LEVEL plev = p_ptr->lev;\r
3376         HIT_POINT power;\r
3377 \r
3378         switch (spell)\r
3379         {\r
3380         /*** 1st book (0-7) ***/\r
3381         case 0:\r
3382                 if (name) return _("邪なる祝福", "Evily blessing");\r
3383                 if (desc) return _("祝福により攻撃精度と防御力が上がる。", "Attempts to increase +to_hit of a weapon and AC");\r
3384                 if (cast)\r
3385                 {\r
3386                         if (!p_ptr->blessed)\r
3387                         {\r
3388                                 msg_print(_("高潔な気分になった!", "You feel righteous!"));\r
3389                         }\r
3390                 }\r
3391                 if (stop)\r
3392                 {\r
3393                         if (!p_ptr->blessed)\r
3394                         {\r
3395                                 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));\r
3396                         }\r
3397                 }\r
3398                 break;\r
3399 \r
3400         case 1:\r
3401                 if (name) return _("軽傷の治癒", "Cure light wounds");\r
3402                 if (desc) return _("HPや傷を少し回復させる。", "Heals cut and HP a little.");\r
3403                 if (info) return info_heal(1, 10, 0);\r
3404                 if (cast)\r
3405                 {\r
3406                         msg_print(_("気分が良くなってくる。", "You feel better and better."));\r
3407                 }\r
3408                 if (cast || cont)\r
3409                 {\r
3410                         hp_player(damroll(1, 10));\r
3411                         set_cut(p_ptr->cut - 10);\r
3412                 }\r
3413                 break;\r
3414 \r
3415         case 2:\r
3416                 if (name) return _("悪魔のオーラ", "Demonic aura");\r
3417                 if (desc) return _("炎のオーラを身にまとい、回復速度が速くなる。", "Gives fire aura and regeneration.");\r
3418                 if (cast)\r
3419                 {\r
3420                         msg_print(_("体が炎のオーラで覆われた。", "You have enveloped by fiery aura!"));\r
3421                 }\r
3422                 if (stop)\r
3423                 {\r
3424                         msg_print(_("炎のオーラが消え去った。", "Fiery aura disappeared."));\r
3425                 }\r
3426                 break;\r
3427 \r
3428         case 3:\r
3429                 if (name) return _("悪臭霧", "Stinking mist");\r
3430                 if (desc) return _("視界内のモンスターに微弱量の毒のダメージを与える。", "Deals few damages of poison to all monsters in your sight.");\r
3431                 power = plev / 2 + 5;\r
3432                 if (info) return info_damage(1, power, 0);\r
3433                 if (cast || cont)\r
3434                 {\r
3435                         project_hack(GF_POIS, randint1(power));\r
3436                 }\r
3437                 break;\r
3438 \r
3439         case 4:\r
3440                 if (name) return _("腕力強化", "Extra might");\r
3441                 if (desc) return _("術者の腕力を上昇させる。", "Attempts to increase your strength.");\r
3442                 if (cast)\r
3443                 {\r
3444                         msg_print(_("何だか力が湧いて来る。", "You feel you get stronger."));\r
3445                 }\r
3446                 break;\r
3447 \r
3448         case 5:\r
3449                 if (name) return _("武器呪縛", "Curse weapon");\r
3450                 if (desc) return _("装備している武器を呪う。", "Curses your weapon.");\r
3451                 if (cast)\r
3452                 {\r
3453                         OBJECT_IDX item;\r
3454                         cptr q, s;\r
3455                         char o_name[MAX_NLEN];\r
3456                         object_type *o_ptr;\r
3457                         u32b f[TR_FLAG_SIZE];\r
3458 \r
3459                         item_tester_hook = item_tester_hook_weapon_except_bow;\r
3460                         q = _("どれを呪いますか?", "Which weapon do you curse?");\r
3461                         s = _("武器を装備していない。", "You wield no weapons.");\r
3462 \r
3463                         if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;\r
3464 \r
3465                         o_ptr = &inventory[item];\r
3466                         object_desc(o_name, o_ptr, OD_NAME_ONLY);\r
3467                         object_flags(o_ptr, f);\r
3468 \r
3469                         if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;\r
3470 \r
3471                         if (!one_in_(3) &&\r
3472                                 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))\r
3473                         {\r
3474                                 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);\r
3475                                 if (one_in_(3))\r
3476                                 {\r
3477                                         if (o_ptr->to_d > 0)\r
3478                                         {\r
3479                                                 o_ptr->to_d -= randint1(3) % 2;\r
3480                                                 if (o_ptr->to_d < 0) o_ptr->to_d = 0;\r
3481                                         }\r
3482                                         if (o_ptr->to_h > 0)\r
3483                                         {\r
3484                                                 o_ptr->to_h -= randint1(3) % 2;\r
3485                                                 if (o_ptr->to_h < 0) o_ptr->to_h = 0;\r
3486                                         }\r
3487                                         if (o_ptr->to_a > 0)\r
3488                                         {\r
3489                                                 o_ptr->to_a -= randint1(3) % 2;\r
3490                                                 if (o_ptr->to_a < 0) o_ptr->to_a = 0;\r
3491                                         }\r
3492                                         msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);\r
3493                                 }\r
3494                         }\r
3495                         else\r
3496                         {\r
3497                                 int curse_rank = 0;\r
3498                                 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);\r
3499                                 o_ptr->curse_flags |= (TRC_CURSED);\r
3500 \r
3501                                 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))\r
3502                                 {\r
3503 \r
3504                                         if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);\r
3505                                         if (one_in_(666))\r
3506                                         {\r
3507                                                 o_ptr->curse_flags |= (TRC_TY_CURSE);\r
3508                                                 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);\r
3509 \r
3510                                                 add_flag(o_ptr->art_flags, TR_AGGRAVATE);\r
3511                                                 add_flag(o_ptr->art_flags, TR_VORPAL);\r
3512                                                 add_flag(o_ptr->art_flags, TR_VAMPIRIC);\r
3513                                                 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));\r
3514                                                 curse_rank = 2;\r
3515                                         }\r
3516                                 }\r
3517 \r
3518                                 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);\r
3519                         }\r
3520 \r
3521                         p_ptr->update |= (PU_BONUS);\r
3522                         add = FALSE;\r
3523                 }\r
3524                 break;\r
3525 \r
3526         case 6:\r
3527                 if (name) return _("邪悪感知", "Evil detection");\r
3528                 if (desc) return _("周囲の邪悪なモンスターを感知する。", "Detects evil monsters.");\r
3529                 if (info) return info_range(MAX_SIGHT);\r
3530                 if (cast)\r
3531                 {\r
3532                         msg_print(_("邪悪な生物の存在を感じ取ろうとした。", "You attend to the presence of evil creatures."));\r
3533                 }\r
3534                 break;\r
3535 \r
3536         case 7:\r
3537                 if (name) return _("我慢", "Patience");\r
3538                 if (desc) return _("数ターン攻撃を耐えた後、受けたダメージを地獄の業火として周囲に放出する。", \r
3539                         "Bursts hell fire strongly after patients any damage while few turns.");\r
3540                 power = MIN(200, (HEX_REVENGE_POWER(p_ptr) * 2));\r
3541                 if (info) return info_damage(0, 0, power);\r
3542                 if (cast)\r
3543                 {\r
3544                         int a = 3 - (p_ptr->pspeed - 100) / 10;\r
3545                         MAGIC_NUM2 r = 3 + randint1(3) + MAX(0, MIN(3, a));\r
3546 \r
3547                         if (HEX_REVENGE_TURN(p_ptr) > 0)\r
3548                         {\r
3549                                 msg_print(_("すでに我慢をしている。", "You are already patienting."));\r
3550                                 return NULL;\r
3551                         }\r
3552 \r
3553                         HEX_REVENGE_TYPE(p_ptr) = 1;\r
3554                         HEX_REVENGE_TURN(p_ptr) = r;\r
3555                         HEX_REVENGE_POWER(p_ptr) = 0;\r
3556                         msg_print(_("じっと耐えることにした。", "You decide to patient all damages."));\r
3557                         add = FALSE;\r
3558                 }\r
3559                 if (cont)\r
3560                 {\r
3561                         int rad = 2 + (power / 50);\r
3562 \r
3563                         HEX_REVENGE_TURN(p_ptr)--;\r
3564 \r
3565                         if ((HEX_REVENGE_TURN(p_ptr) <= 0) || (power >= 200))\r
3566                         {\r
3567                                 msg_print(_("我慢が解かれた!", "Time for end of patioence!"));\r
3568                                 if (power)\r
3569                                 {\r
3570                                         project(0, rad, p_ptr->y, p_ptr->x, power, GF_HELL_FIRE,\r
3571                                                 (PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);\r
3572                                 }\r
3573                                 if (p_ptr->wizard)\r
3574                                 {\r
3575                                         msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);\r
3576                                 }\r
3577 \r
3578                                 /* Reset */\r
3579                                 HEX_REVENGE_TYPE(p_ptr) = 0;\r
3580                                 HEX_REVENGE_TURN(p_ptr) = 0;\r
3581                                 HEX_REVENGE_POWER(p_ptr) = 0;\r
3582                         }\r
3583                 }\r
3584                 break;\r
3585 \r
3586         /*** 2nd book (8-15) ***/\r
3587         case 8:\r
3588                 if (name) return _("氷の鎧", "Ice armor");\r
3589                 if (desc) return _("氷のオーラを身にまとい、防御力が上昇する。", "Gives fire aura and bonus to AC.");\r
3590                 if (cast)\r
3591                 {\r
3592                         msg_print(_("体が氷の鎧で覆われた。", "You have enveloped by ice armor!"));\r
3593                 }\r
3594                 if (stop)\r
3595                 {\r
3596                         msg_print(_("氷の鎧が消え去った。", "Ice armor disappeared."));\r
3597                 }\r
3598                 break;\r
3599 \r
3600         case 9:\r
3601                 if (name) return _("重傷の治癒", "Cure serious wounds");\r
3602                 if (desc) return _("体力や傷を多少回復させる。", "Heals cut and HP more.");\r
3603                 if (info) return info_heal(2, 10, 0);\r
3604                 if (cast)\r
3605                 {\r
3606                         msg_print(_("気分が良くなってくる。", "You feel better and better."));\r
3607                 }\r
3608                 if (cast || cont)\r
3609                 {\r
3610                         hp_player(damroll(2, 10));\r
3611                         set_cut((p_ptr->cut / 2) - 10);\r
3612                 }\r
3613                 break;\r
3614 \r
3615         case 10:\r
3616                 if (name) return _("薬品吸入", "Inhail potion");\r
3617                 if (desc) return _("呪文詠唱を中止することなく、薬の効果を得ることができる。", "Quaffs a potion without canceling of casting a spell.");\r
3618                 if (cast)\r
3619                 {\r
3620                         CASTING_HEX_FLAGS(p_ptr) |= (1L << HEX_INHAIL);\r
3621                         do_cmd_quaff_potion();\r
3622                         CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_INHAIL);\r
3623                         add = FALSE;\r
3624                 }\r
3625                 break;\r
3626 \r
3627         case 11:\r
3628                 if (name) return _("衰弱の霧", "Hypodynamic mist");\r
3629                 if (desc) return _("視界内のモンスターに微弱量の衰弱属性のダメージを与える。", \r
3630                         "Deals few damages of hypodynamia to all monsters in your sight.");\r
3631                 power = (plev / 2) + 5;\r
3632                 if (info) return info_damage(1, power, 0);\r
3633                 if (cast || cont)\r
3634                 {\r
3635                         project_hack(GF_HYPODYNAMIA, randint1(power));\r
3636                 }\r
3637                 break;\r
3638 \r
3639         case 12:\r
3640                 if (name) return _("魔剣化", "Swords to runeswords");\r
3641                 if (desc) return _("武器の攻撃力を上げる。切れ味を得、呪いに応じて与えるダメージが上昇し、善良なモンスターに対するダメージが2倍になる。", \r
3642                         "Gives vorpal ability to your weapon. Increases damages by your weapon acccording to curse of your weapon.");\r
3643                 if (cast)\r
3644                 {\r
3645 #ifdef JP\r
3646                         msg_print("あなたの武器が黒く輝いた。");\r
3647 #else\r
3648                         if (!empty_hands(FALSE))\r
3649                                 msg_print("Your weapons glow bright black.");\r
3650                         else\r
3651                                 msg_print("Your weapon glows bright black.");\r
3652 #endif\r
3653                 }\r
3654                 if (stop)\r
3655                 {\r
3656 #ifdef JP\r
3657                         msg_print("武器の輝きが消え去った。");\r
3658 #else\r
3659                         msg_format("Brightness of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");\r
3660 #endif\r
3661                 }\r
3662                 break;\r
3663 \r
3664         case 13:\r
3665                 if (name) return _("混乱の手", "Touch of confusion");\r
3666                 if (desc) return _("攻撃した際モンスターを混乱させる。", "Confuses a monster when you attack.");\r
3667                 if (cast)\r
3668                 {\r
3669                         msg_print(_("あなたの手が赤く輝き始めた。", "Your hands glow bright red."));\r
3670                 }\r
3671                 if (stop)\r
3672                 {\r
3673                         msg_print(_("手の輝きがなくなった。", "Brightness on your hands disappeard."));\r
3674                 }\r
3675                 break;\r
3676 \r
3677         case 14:\r
3678                 if (name) return _("肉体強化", "Building up");\r
3679                 if (desc) return _("術者の腕力、器用さ、耐久力を上昇させる。攻撃回数の上限を 1 増加させる。", \r
3680                         "Attempts to increases your strength, dexterity and constitusion.");\r
3681                 if (cast)\r
3682                 {\r
3683                         msg_print(_("身体が強くなった気がした。", "You feel your body is developed more now."));\r
3684                 }\r
3685                 break;\r
3686 \r
3687         case 15:\r
3688                 if (name) return _("反テレポート結界", "Anti teleport barrier");\r
3689                 if (desc) return _("視界内のモンスターのテレポートを阻害するバリアを張る。", "Obstructs all teleportations by monsters in your sight.");\r
3690                 power = plev * 3 / 2;\r
3691                 if (info) return info_power(power);\r
3692                 if (cast)\r
3693                 {\r
3694                         msg_print(_("テレポートを防ぐ呪いをかけた。", "You feel anyone can not teleport except you."));\r
3695                 }\r
3696                 break;\r
3697 \r
3698         /*** 3rd book (16-23) ***/\r
3699         case 16:\r
3700                 if (name) return _("衝撃のクローク", "Cloak of shock");\r
3701                 if (desc) return _("電気のオーラを身にまとい、動きが速くなる。", "Gives lightning aura and a bonus to speed.");\r
3702                 if (cast)\r
3703                 {\r
3704                         msg_print(_("体が稲妻のオーラで覆われた。", "You have enveloped by electrical aura!"));\r
3705                 }\r
3706                 if (stop)\r
3707                 {\r
3708                         msg_print(_("稲妻のオーラが消え去った。", "Electrical aura disappeared."));\r
3709                 }\r
3710                 break;\r
3711 \r
3712         case 17:\r
3713                 if (name) return _("致命傷の治癒", "Cure critical wounds");\r
3714                 if (desc) return _("体力や傷を回復させる。", "Heals cut and HP greatry.");\r
3715                 if (info) return info_heal(4, 10, 0);\r
3716                 if (cast)\r
3717                 {\r
3718                         msg_print(_("気分が良くなってくる。", "You feel better and better."));\r
3719                 }\r
3720                 if (cast || cont)\r
3721                 {\r
3722                         hp_player(damroll(4, 10));\r
3723                         set_stun(0);\r
3724                         set_cut(0);\r
3725                         set_poisoned(0);\r
3726                 }\r
3727                 break;\r
3728 \r
3729         case 18:\r
3730                 if (name) return _("呪力封入", "Recharging");\r
3731                 if (desc) return _("魔法の道具に魔力を再充填する。", "Recharges a magic device.");\r
3732                 power = plev * 2;\r
3733                 if (info) return info_power(power);\r
3734                 if (cast)\r
3735                 {\r
3736                         if (!recharge(power)) return NULL;\r
3737                         add = FALSE;\r
3738                 }\r
3739                 break;\r
3740 \r
3741         case 19:\r
3742                 if (name) return _("死者復活", "Animate Dead");\r
3743                 if (desc) return _("死体を蘇らせてペットにする。", "Raises corpses and skeletons from dead.");\r
3744                 if (cast)\r
3745                 {\r
3746                         msg_print(_("死者への呼びかけを始めた。", "You start to call deads.!"));\r
3747                 }\r
3748                 if (cast || cont)\r
3749                 {\r
3750                         animate_dead(0, p_ptr->y, p_ptr->x);\r
3751                 }\r
3752                 break;\r
3753 \r
3754         case 20:\r
3755                 if (name) return _("防具呪縛", "Curse armor");\r
3756                 if (desc) return _("装備している防具に呪いをかける。", "Curse a piece of armour that you wielding.");\r
3757                 if (cast)\r
3758                 {\r
3759                         OBJECT_IDX item;\r
3760                         cptr q, s;\r
3761                         char o_name[MAX_NLEN];\r
3762                         object_type *o_ptr;\r
3763                         u32b f[TR_FLAG_SIZE];\r
3764 \r
3765                         item_tester_hook = object_is_armour;\r
3766                         q = _("どれを呪いますか?", "Which piece of armour do you curse?");\r
3767                         s = _("防具を装備していない。", "You wield no piece of armours.");\r
3768 \r
3769                         if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;\r
3770 \r
3771                         o_ptr = &inventory[item];\r
3772                         object_desc(o_name, o_ptr, OD_NAME_ONLY);\r
3773                         object_flags(o_ptr, f);\r
3774 \r
3775                         if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;\r
3776 \r
3777                         if (!one_in_(3) &&\r
3778                                 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))\r
3779                         {\r
3780                                 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);\r
3781                                 if (one_in_(3))\r
3782                                 {\r
3783                                         if (o_ptr->to_d > 0)\r
3784                                         {\r
3785                                                 o_ptr->to_d -= randint1(3) % 2;\r
3786                                                 if (o_ptr->to_d < 0) o_ptr->to_d = 0;\r
3787                                         }\r
3788                                         if (o_ptr->to_h > 0)\r
3789                                         {\r
3790                                                 o_ptr->to_h -= randint1(3) % 2;\r
3791                                                 if (o_ptr->to_h < 0) o_ptr->to_h = 0;\r
3792                                         }\r
3793                                         if (o_ptr->to_a > 0)\r
3794                                         {\r
3795                                                 o_ptr->to_a -= randint1(3) % 2;\r
3796                                                 if (o_ptr->to_a < 0) o_ptr->to_a = 0;\r
3797                                         }\r
3798                                         msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);\r
3799                                 }\r
3800                         }\r
3801                         else\r
3802                         {\r
3803                                 int curse_rank = 0;\r
3804                                 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);\r
3805                                 o_ptr->curse_flags |= (TRC_CURSED);\r
3806 \r
3807                                 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))\r
3808                                 {\r
3809 \r
3810                                         if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);\r
3811                                         if (one_in_(666))\r
3812                                         {\r
3813                                                 o_ptr->curse_flags |= (TRC_TY_CURSE);\r
3814                                                 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);\r
3815 \r
3816                                                 add_flag(o_ptr->art_flags, TR_AGGRAVATE);\r
3817                                                 add_flag(o_ptr->art_flags, TR_RES_POIS);\r
3818                                                 add_flag(o_ptr->art_flags, TR_RES_DARK);\r
3819                                                 add_flag(o_ptr->art_flags, TR_RES_NETHER);\r
3820                                                 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));\r
3821                                                 curse_rank = 2;\r
3822                                         }\r
3823                                 }\r
3824 \r
3825                                 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);\r
3826                         }\r
3827 \r
3828                         p_ptr->update |= (PU_BONUS);\r
3829                         add = FALSE;\r
3830                 }\r
3831                 break;\r
3832 \r
3833         case 21:\r
3834                 if (name) return _("影のクローク", "Cloak of shadow");\r
3835                 if (desc) return _("影のオーラを身にまとい、敵に影のダメージを与える。", "Gives aura of shadow.");\r
3836                 if (cast)\r
3837                 {\r
3838                         object_type *o_ptr = &inventory[INVEN_OUTER];\r
3839 \r
3840                         if (!o_ptr->k_idx)\r
3841                         {\r
3842                                 msg_print(_("クロークを身につけていない!", "You don't ware any cloak."));\r
3843                                 return NULL;\r
3844                         }\r
3845                         else if (!object_is_cursed(o_ptr))\r
3846                         {\r
3847                                 msg_print(_("クロークは呪われていない!", "Your cloak is not cursed."));\r
3848                                 return NULL;\r
3849                         }\r
3850                         else\r
3851                         {\r
3852                                 msg_print(_("影のオーラを身にまとった。", "You have enveloped by shadow aura!"));\r
3853                         }\r
3854                 }\r
3855                 if (cont)\r
3856                 {\r
3857                         object_type *o_ptr = &inventory[INVEN_OUTER];\r
3858 \r
3859                         if ((!o_ptr->k_idx) || (!object_is_cursed(o_ptr)))\r
3860                         {\r
3861                                 do_spell(REALM_HEX, spell, SPELL_STOP);\r
3862                                 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << spell);\r
3863                                 CASTING_HEX_NUM(p_ptr)--;\r
3864                                 if (!SINGING_SONG_ID(p_ptr)) set_action(ACTION_NONE);\r
3865                         }\r
3866                 }\r
3867                 if (stop)\r
3868                 {\r
3869                         msg_print(_("影のオーラが消え去った。", "Shadow aura disappeared."));\r
3870                 }\r
3871                 break;\r
3872 \r
3873         case 22:\r
3874                 if (name) return _("苦痛を魔力に", "Pains to mana");\r
3875                 if (desc) return _("視界内のモンスターに精神ダメージ与え、魔力を吸い取る。", "Deals psychic damages to all monsters in sight, and drains some mana.");\r
3876                 power = plev * 3 / 2;\r
3877                 if (info) return info_damage(1, power, 0);\r
3878                 if (cast || cont)\r
3879                 {\r
3880                         project_hack(GF_PSI_DRAIN, randint1(power));\r
3881                 }\r
3882                 break;\r
3883 \r
3884         case 23:\r
3885                 if (name) return _("目には目を", "Eye for an eye");\r
3886                 if (desc) return _("打撃や魔法で受けたダメージを、攻撃元のモンスターにも与える。", "Returns same damage which you got to the monster which damaged you.");\r
3887                 if (cast)\r
3888                 {\r
3889                         msg_print(_("復讐したい欲望にかられた。", "You wish strongly you want to revenge anything."));\r
3890                 }\r
3891                 break;\r
3892 \r
3893         /*** 4th book (24-31) ***/\r
3894         case 24:\r
3895                 if (name) return _("反増殖結界", "Anti multiply barrier");\r
3896                 if (desc) return _("その階の増殖するモンスターの増殖を阻止する。", "Obstructs all multiplying by monsters in entire floor.");\r
3897                 if (cast)\r
3898                 {\r
3899                         msg_print(_("増殖を阻止する呪いをかけた。", "You feel anyone can not already multiply."));\r
3900                 }\r
3901                 break;\r
3902 \r
3903         case 25:\r
3904                 if (name) return _("全復活", "Restoration");\r
3905                 if (desc) return _("経験値を徐々に復活し、減少した能力値を回復させる。", "Restores experience and status.");\r
3906                 if (cast)\r
3907                 {\r
3908                         msg_print(_("体が元の活力を取り戻し始めた。", "You feel your lost status starting to return."));\r
3909                 }\r
3910                 if (cast || cont)\r
3911                 {\r
3912                         bool flag = FALSE;\r
3913                         int d = (p_ptr->max_exp - p_ptr->exp);\r
3914                         int r = (p_ptr->exp / 20);\r
3915                         int i;\r
3916 \r
3917                         if (d > 0)\r
3918                         {\r
3919                                 if (d < r)\r
3920                                         p_ptr->exp = p_ptr->max_exp;\r
3921                                 else\r
3922                                         p_ptr->exp += r;\r
3923 \r
3924                                 /* Check the experience */\r
3925                                 check_experience();\r
3926 \r
3927                                 flag = TRUE;\r
3928                         }\r
3929                         for (i = A_STR; i < 6; i ++)\r
3930                         {\r
3931                                 if (p_ptr->stat_cur[i] < p_ptr->stat_max[i])\r
3932                                 {\r
3933                                         if (p_ptr->stat_cur[i] < 18)\r
3934                                                 p_ptr->stat_cur[i]++;\r
3935                                         else\r
3936                                                 p_ptr->stat_cur[i] += 10;\r
3937 \r
3938                                         if (p_ptr->stat_cur[i] > p_ptr->stat_max[i])\r
3939                                                 p_ptr->stat_cur[i] = p_ptr->stat_max[i];\r
3940 \r
3941                                         /* Recalculate bonuses */\r
3942                                         p_ptr->update |= (PU_BONUS);\r
3943 \r
3944                                         flag = TRUE;\r
3945                                 }\r
3946                         }\r
3947 \r
3948                         if (!flag)\r
3949                         {\r
3950                                 msg_format(_("%sの呪文の詠唱をやめた。", "Finish casting '%^s'."), do_spell(REALM_HEX, HEX_RESTORE, SPELL_NAME));\r
3951                                 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_RESTORE);\r
3952                                 if (cont) CASTING_HEX_NUM(p_ptr)--;\r
3953                                 if (CASTING_HEX_NUM(p_ptr)) p_ptr->action = ACTION_NONE;\r
3954 \r
3955                                 /* Redraw status */\r
3956                                 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);\r
3957                                 p_ptr->redraw |= (PR_EXTRA);\r
3958 \r
3959                                 return "";\r
3960                         }\r
3961                 }\r
3962                 break;\r
3963 \r
3964         case 26:\r
3965                 if (name) return _("呪力吸収", "Drain curse power");\r
3966                 if (desc) return _("呪われた武器の呪いを吸収して魔力を回復する。", "Drains curse on your weapon and heals SP a little.");\r
3967                 if (cast)\r
3968                 {\r
3969                         OBJECT_IDX item;\r
3970                         cptr s, q;\r
3971                         u32b f[TR_FLAG_SIZE];\r
3972                         object_type *o_ptr;\r
3973 \r
3974                         item_tester_hook = item_tester_hook_cursed;\r
3975                         q = _("どの装備品から吸収しますか?", "Which cursed equipment do you drain mana from?");\r
3976                         s = _("呪われたアイテムを装備していない。", "You have no cursed equipment.");\r
3977 \r
3978                         if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;\r
3979 \r
3980                         o_ptr = &inventory[item];\r
3981                         object_flags(o_ptr, f);\r
3982 \r
3983                         p_ptr->csp += (p_ptr->lev / 5) + randint1(p_ptr->lev / 5);\r
3984                         if (have_flag(f, TR_TY_CURSE) || (o_ptr->curse_flags & TRC_TY_CURSE)) p_ptr->csp += randint1(5);\r
3985                         if (p_ptr->csp > p_ptr->msp) p_ptr->csp = p_ptr->msp;\r
3986 \r
3987                         if (o_ptr->curse_flags & TRC_PERMA_CURSE)\r
3988                         {\r
3989                                 /* Nothing */\r
3990                         }\r
3991                         else if (o_ptr->curse_flags & TRC_HEAVY_CURSE)\r
3992                         {\r
3993                                 if (one_in_(7))\r
3994                                 {\r
3995                                         msg_print(_("呪いを全て吸い取った。", "Heavy curse vanished away."));\r
3996                                         o_ptr->curse_flags = 0L;\r
3997                                 }\r
3998                         }\r
3999                         else if ((o_ptr->curse_flags & (TRC_CURSED)) && one_in_(3))\r
4000                         {\r
4001                                 msg_print(_("呪いを全て吸い取った。", "Curse vanished away."));\r
4002                                 o_ptr->curse_flags = 0L;\r
4003                         }\r
4004 \r
4005                         add = FALSE;\r
4006                 }\r
4007                 break;\r
4008 \r
4009         case 27:\r
4010                 if (name) return _("吸血の刃", "Swords to vampires");\r
4011                 if (desc) return _("吸血属性で攻撃する。", "Gives vampiric ability to your weapon.");\r
4012                 if (cast)\r
4013                 {\r
4014 #ifdef JP\r
4015                         msg_print("あなたの武器が血を欲している。");\r
4016 #else\r
4017                         if (!empty_hands(FALSE))\r
4018                                 msg_print("Your weapons want more blood now.");\r
4019                         else\r
4020                                 msg_print("Your weapon wants more blood now.");\r
4021 #endif\r
4022                 }\r
4023                 if (stop)\r
4024                 {\r
4025 #ifdef JP\r
4026                         msg_print("武器の渇望が消え去った。");\r
4027 #else\r
4028                         msg_format("Thirsty of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");\r
4029 #endif\r
4030                 }\r
4031                 break;\r
4032 \r
4033         case 28:\r
4034                 if (name) return _("朦朧の言葉", "Word of stun");\r
4035                 if (desc) return _("視界内のモンスターを朦朧とさせる。", "Stuns all monsters in your sight.");\r
4036                 power = plev * 4;\r
4037                 if (info) return info_power(power);\r
4038                 if (cast || cont)\r
4039                 {\r
4040                         stun_monsters(power);\r
4041                 }\r
4042                 break;\r
4043 \r
4044         case 29:\r
4045                 if (name) return _("影移動", "Moving into shadow");\r
4046                 if (desc) return _("モンスターの隣のマスに瞬間移動する。", "Teleports you close to a monster.");\r
4047                 if (cast)\r
4048                 {\r
4049                         int i, dir;\r
4050                         POSITION y, x;\r
4051                         bool flag;\r
4052 \r
4053                         for (i = 0; i < 3; i++)\r
4054                         {\r
4055                                 if (!tgt_pt(&x, &y)) return FALSE;\r
4056 \r
4057                                 flag = FALSE;\r
4058 \r
4059                                 for (dir = 0; dir < 8; dir++)\r
4060                                 {\r
4061                                         int dy = y + ddy_ddd[dir];\r
4062                                         int dx = x + ddx_ddd[dir];\r
4063                                         if (dir == 5) continue;\r
4064                                         if(cave[dy][dx].m_idx) flag = TRUE;\r
4065                                 }\r
4066 \r
4067                                 if (!cave_empty_bold(y, x) || (cave[y][x].info & CAVE_ICKY) ||\r
4068                                         (distance(y, x, p_ptr->y, p_ptr->x) > plev + 2))\r
4069                                 {\r
4070                                         msg_print(_("そこには移動できない。", "Can not teleport to there."));\r
4071                                         continue;\r
4072                                 }\r
4073                                 break;\r
4074                         }\r
4075 \r
4076                         if (flag && randint0(plev * plev / 2))\r
4077                         {\r
4078                                 teleport_player_to(y, x, 0L);\r
4079                         }\r
4080                         else\r
4081                         {\r
4082                                 msg_print(_("おっと!", "Oops!"));\r
4083                                 teleport_player(30, 0L);\r
4084                         }\r
4085 \r
4086                         add = FALSE;\r
4087                 }\r
4088                 break;\r
4089 \r
4090         case 30:\r
4091                 if (name) return _("反魔法結界", "Anti magic barrier");\r
4092                 if (desc) return _("視界内のモンスターの魔法を阻害するバリアを張る。", "Obstructs all magic spell of monsters in your sight.");\r
4093                 power = plev * 3 / 2;\r
4094                 if (info) return info_power(power);\r
4095                 if (cast)\r
4096                 {\r
4097                         msg_print(_("魔法を防ぐ呪いをかけた。", "You feel anyone can not cast spells except you."));\r
4098                 }\r
4099                 break;\r
4100 \r
4101         case 31:\r
4102                 if (name) return _("復讐の宣告", "Revenge sentence");\r
4103                 if (desc) return _("数ターン後にそれまで受けたダメージに応じた威力の地獄の劫火の弾を放つ。", \r
4104                         "Fires  a ball of hell fire to try revenging after few turns.");\r
4105                 power = HEX_REVENGE_POWER(p_ptr);\r
4106                 if (info) return info_damage(0, 0, power);\r
4107                 if (cast)\r
4108                 {\r
4109                         MAGIC_NUM2 r;\r
4110                         int a = 3 - (p_ptr->pspeed - 100) / 10;\r
4111                         r = 1 + randint1(2) + MAX(0, MIN(3, a));\r
4112 \r
4113                         if (HEX_REVENGE_TURN(p_ptr) > 0)\r
4114                         {\r
4115                                 msg_print(_("すでに復讐は宣告済みだ。", "You already pronounced your revenge."));\r
4116                                 return NULL;\r
4117                         }\r
4118 \r
4119                         HEX_REVENGE_TYPE(p_ptr) = 2;\r
4120                         HEX_REVENGE_TURN(p_ptr) = r;\r
4121                         msg_format(_("あなたは復讐を宣告した。あと %d ターン。", "You pronounce your revenge. %d turns left."), r);\r
4122                         add = FALSE;\r
4123                 }\r
4124                 if (cont)\r
4125                 {\r
4126                         HEX_REVENGE_TURN(p_ptr)--;\r
4127 \r
4128                         if (HEX_REVENGE_TURN(p_ptr) <= 0)\r
4129                         {\r
4130                                 int dir;\r
4131 \r
4132                                 if (power)\r
4133                                 {\r
4134                                         command_dir = 0;\r
4135 \r
4136                                         do\r
4137                                         {\r
4138                                                 msg_print(_("復讐の時だ!", "Time to revenge!"));\r
4139                                         }\r
4140                                         while (!get_aim_dir(&dir));\r
4141 \r
4142                                         fire_ball(GF_HELL_FIRE, dir, power, 1);\r
4143 \r
4144                                         if (p_ptr->wizard)\r
4145                                         {\r
4146                                                 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);\r
4147                                         }\r
4148                                 }\r
4149                                 else\r
4150                                 {\r
4151                                         msg_print(_("復讐する気が失せた。", "You are not a mood to revenge."));\r
4152                                 }\r
4153                                 HEX_REVENGE_POWER(p_ptr) = 0;\r
4154                         }\r
4155                 }\r
4156                 break;\r
4157         }\r
4158 \r
4159         /* start casting */\r
4160         if ((cast) && (add))\r
4161         {\r
4162                 /* add spell */\r
4163                 CASTING_HEX_FLAGS(p_ptr) |= 1L << (spell);\r
4164                 CASTING_HEX_NUM(p_ptr)++;\r
4165 \r
4166                 if (p_ptr->action != ACTION_SPELL) set_action(ACTION_SPELL);\r
4167         }\r
4168 \r
4169         /* Redraw status */\r
4170         if (!info)\r
4171         {\r
4172                 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);\r
4173                 p_ptr->redraw |= (PR_EXTRA | PR_HP | PR_MANA);\r
4174         }\r
4175 \r
4176         return "";\r
4177 }\r
4178 \r
4179 \r
4180 /*!\r
4181  * @brief 魔法処理のメインルーチン\r
4182  * @param realm 魔法領域のID\r
4183  * @param spell 各領域の魔法ID\r
4184  * @param mode 求める処理\r
4185  * @return 各領域魔法に各種テキストを求めた場合は文字列参照ポインタ、そうでない場合はNULLポインタを返す。\r
4186  */\r
4187 cptr do_spell(REALM_IDX realm, SPELL_IDX spell, BIT_FLAGS mode)\r
4188 {\r
4189         switch (realm)\r
4190         {\r
4191         case REALM_LIFE:     return do_life_spell(spell, mode);\r
4192         case REALM_SORCERY:  return do_sorcery_spell(spell, mode);\r
4193         case REALM_NATURE:   return do_nature_spell(spell, mode);\r
4194         case REALM_CHAOS:    return do_chaos_spell(spell, mode);\r
4195         case REALM_DEATH:    return do_death_spell(spell, mode);\r
4196         case REALM_TRUMP:    return do_trump_spell(spell, mode);\r
4197         case REALM_ARCANE:   return do_arcane_spell(spell, mode);\r
4198         case REALM_CRAFT:    return do_craft_spell(spell, mode);\r
4199         case REALM_DAEMON:   return do_daemon_spell(spell, mode);\r
4200         case REALM_CRUSADE:  return do_crusade_spell(spell, mode);\r
4201         case REALM_MUSIC:    return do_music_spell(spell, mode);\r
4202         case REALM_HISSATSU: return do_hissatsu_spell(spell, mode);\r
4203         case REALM_HEX:      return do_hex_spell(spell, mode);\r
4204         }\r
4205 \r
4206         return NULL;\r
4207 }\r