OSDN Git Service

[Refactor] #37353 破邪領域処理を cmd-spell.c から realm-crusade.c/h へ分離。
[hengbandforosx/hengbandosx.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-crusade.h"\r
17 #include "realm-daemon.h"\r
18 #include "realm-death.h"\r
19 #include "realm-life.h"\r
20 #include "realm-nature.h"\r
21 #include "realm-sorcery.h"\r
22 #include "realm-trump.h"\r
23 \r
24 /*!\r
25  * @brief\r
26  * 魔法の効果を「キャプション:ダイス+定数値」のフォーマットで出力する / Generate dice info string such as "foo 2d10"\r
27  * @param str キャプション\r
28  * @param dice ダイス数\r
29  * @param sides ダイス目\r
30  * @param base 固定値\r
31  * @return フォーマットに従い整形された文字列\r
32  */\r
33 cptr info_string_dice(cptr str, int dice, int sides, int base)\r
34 {\r
35         /* Fix value */\r
36         if (!dice)\r
37                 return format("%s%d", str, base);\r
38 \r
39         /* Dice only */\r
40         else if (!base)\r
41                 return format("%s%dd%d", str, dice, sides);\r
42 \r
43         /* Dice plus base value */\r
44         else\r
45                 return format("%s%dd%d%+d", str, dice, sides, base);\r
46 }\r
47 \r
48 \r
49 /*!\r
50  * @brief 魔法によるダメージを出力する / Generate damage-dice info string such as "dam 2d10"\r
51  * @param dice ダイス数\r
52  * @param sides ダイス目\r
53  * @param base 固定値\r
54  * @return フォーマットに従い整形された文字列\r
55  */\r
56 cptr info_damage(int dice, int sides, int base)\r
57 {\r
58         return info_string_dice(_("損傷:", "dam "), dice, sides, base);\r
59 }\r
60 \r
61 /*!\r
62  * @brief 魔法の効果時間を出力する / Generate duration info string such as "dur 20+1d20"\r
63  * @param base 固定値\r
64  * @param sides ダイス目\r
65  * @return フォーマットに従い整形された文字列\r
66  */\r
67 cptr info_duration(int base, int sides)\r
68 {\r
69         return format(_("期間:%d+1d%d", "dur %d+1d%d"), base, sides);\r
70 }\r
71 \r
72 /*!\r
73  * @brief 魔法の効果範囲を出力する / Generate range info string such as "range 5"\r
74  * @param range 効果範囲\r
75  * @return フォーマットに従い整形された文字列\r
76  */\r
77 cptr info_range(POSITION range)\r
78 {\r
79         return format(_("範囲:%d", "range %d"), range);\r
80 }\r
81 \r
82 /*!\r
83  * @brief 魔法による回復量を出力する / Generate heal info string such as "heal 2d8"\r
84  * @param dice ダイス数\r
85  * @param sides ダイス目\r
86  * @param base 固定値\r
87  * @return フォーマットに従い整形された文字列\r
88  */\r
89 cptr info_heal(int dice, int sides, int base)\r
90 {\r
91         return info_string_dice(_("回復:", "heal "), dice, sides, base);\r
92 }\r
93 \r
94 /*!\r
95  * @brief 魔法効果発動までの遅延ターンを出力する / Generate delay info string such as "delay 15+1d15"\r
96  * @param base 固定値\r
97  * @param sides ダイス目\r
98  * @return フォーマットに従い整形された文字列\r
99  */\r
100 cptr info_delay(int base, int sides)\r
101 {\r
102         return format(_("遅延:%d+1d%d", "delay %d+1d%d"), base, sides);\r
103 }\r
104 \r
105 \r
106 /*!\r
107  * @brief 魔法によるダメージを出力する(固定値&複数回処理) / Generate multiple-damage info string such as "dam 25 each"\r
108  * @param dam 固定値\r
109  * @return フォーマットに従い整形された文字列\r
110  */\r
111 cptr info_multi_damage(HIT_POINT dam)\r
112 {\r
113         return format(_("損傷:各%d", "dam %d each"), dam);\r
114 }\r
115 \r
116 \r
117 /*!\r
118  * @brief 魔法によるダメージを出力する(ダイスのみ&複数回処理) / Generate multiple-damage-dice info string such as "dam 5d2 each"\r
119  * @param dice ダイス数\r
120  * @param sides ダイス目\r
121  * @return フォーマットに従い整形された文字列\r
122  */\r
123 cptr info_multi_damage_dice(int dice, int sides)\r
124 {\r
125         return format(_("損傷:各%dd%d", "dam %dd%d each"), dice, sides);\r
126 }\r
127 \r
128 /*!\r
129  * @brief 魔法による一般的な効力値を出力する(固定値) / Generate power info string such as "power 100"\r
130  * @param power 固定値\r
131  * @return フォーマットに従い整形された文字列\r
132  */\r
133 cptr info_power(int power)\r
134 {\r
135         return format(_("効力:%d", "power %d"), power);\r
136 }\r
137 \r
138 \r
139 /*!\r
140  * @brief 魔法による一般的な効力値を出力する(ダイス値) / Generate power info string such as "power 100"\r
141  * @param dice ダイス数\r
142  * @param sides ダイス目\r
143  * @return フォーマットに従い整形された文字列\r
144  */\r
145 /*\r
146  * Generate power info string such as "power 1d100"\r
147  */\r
148 cptr info_power_dice(int dice, int sides)\r
149 {\r
150         return format(_("効力:%dd%d", "power %dd%d"), dice, sides);\r
151 }\r
152 \r
153 \r
154 /*!\r
155  * @brief 魔法の効果半径を出力する / Generate radius info string such as "rad 100"\r
156  * @param rad 効果半径\r
157  * @return フォーマットに従い整形された文字列\r
158  */\r
159 cptr info_radius(int rad)\r
160 {\r
161         return format(_("半径:%d", "rad %d"), rad);\r
162 }\r
163 \r
164 \r
165 /*!\r
166  * @brief 魔法効果の限界重量を出力する / Generate weight info string such as "max wgt 15"\r
167  * @param weight 最大重量\r
168  * @return フォーマットに従い整形された文字列\r
169  */\r
170 cptr info_weight(int weight)\r
171 {\r
172 #ifdef JP\r
173         return format("最大重量:%d.%dkg", lbtokg1(weight), lbtokg2(weight));\r
174 #else\r
175         return format("max wgt %d", weight/10);\r
176 #endif\r
177 }\r
178 \r
179 \r
180 /*!\r
181  * @brief 歌の開始を処理する / Start singing if the player is a Bard \r
182  * @param spell 領域魔法としてのID\r
183  * @param song 魔法効果のID\r
184  * @return なし\r
185  */\r
186 static void start_singing(SPELL_IDX spell, MAGIC_NUM1 song)\r
187 {\r
188         /* Remember the song index */\r
189         SINGING_SONG_EFFECT(p_ptr) = (MAGIC_NUM1)song;\r
190 \r
191         /* Remember the index of the spell which activated the song */\r
192         SINGING_SONG_ID(p_ptr) = (MAGIC_NUM2)spell;\r
193 \r
194 \r
195         /* Now the player is singing */\r
196         set_action(ACTION_SING);\r
197 \r
198 \r
199         /* Recalculate bonuses */\r
200         p_ptr->update |= (PU_BONUS);\r
201 \r
202         /* Redraw status bar */\r
203         p_ptr->redraw |= (PR_STATUS);\r
204 }\r
205 \r
206 /*!\r
207  * @brief 歌の停止を処理する / Stop singing if the player is a Bard \r
208  * @return なし\r
209  */\r
210 void stop_singing(void)\r
211 {\r
212         if (p_ptr->pclass != CLASS_BARD) return;\r
213 \r
214         /* Are there interupted song? */\r
215         if (INTERUPTING_SONG_EFFECT(p_ptr))\r
216         {\r
217                 /* Forget interupted song */\r
218                 INTERUPTING_SONG_EFFECT(p_ptr) = MUSIC_NONE;\r
219                 return;\r
220         }\r
221 \r
222         /* The player is singing? */\r
223         if (!SINGING_SONG_EFFECT(p_ptr)) return;\r
224 \r
225         /* Hack -- if called from set_action(), avoid recursive loop */\r
226         if (p_ptr->action == ACTION_SING) set_action(ACTION_NONE);\r
227 \r
228         /* Message text of each song or etc. */\r
229         do_spell(REALM_MUSIC, SINGING_SONG_ID(p_ptr), SPELL_STOP);\r
230 \r
231         SINGING_SONG_EFFECT(p_ptr) = MUSIC_NONE;\r
232         SINGING_SONG_ID(p_ptr) = 0;\r
233 \r
234         /* Recalculate bonuses */\r
235         p_ptr->update |= (PU_BONUS);\r
236 \r
237         /* Redraw status bar */\r
238         p_ptr->redraw |= (PR_STATUS);\r
239 }\r
240 \r
241 /*!\r
242  * @brief 歌の各処理を行う\r
243  * @param spell 歌ID\r
244  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP)\r
245  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。\r
246  */\r
247 static cptr do_music_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
248 {\r
249         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
250         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
251         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
252         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
253         bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;\r
254         bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;\r
255         bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;\r
256         static const char s_dam[] = _("損傷:", "dam ");\r
257 \r
258         int dir;\r
259         int plev = p_ptr->lev;\r
260 \r
261         switch (spell)\r
262         {\r
263         case 0:\r
264                 if (name) return _("遅鈍の歌", "Song of Holding");\r
265                 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");\r
266     \r
267                 /* Stop singing before start another */\r
268                 if (cast || fail) stop_singing();\r
269 \r
270                 if (cast)\r
271                 {\r
272                         msg_print(_("ゆっくりとしたメロディを口ずさみ始めた...", "You start humming a slow, steady melody..."));\r
273                         start_singing(spell, MUSIC_SLOW);\r
274                 }\r
275 \r
276                 {\r
277                         int power = plev;\r
278 \r
279                         if (info) return info_power(power);\r
280 \r
281                         if (cont)\r
282                         {\r
283                                 slow_monsters(plev);\r
284                         }\r
285                 }\r
286                 break;\r
287 \r
288         case 1:\r
289                 if (name) return _("祝福の歌", "Song of Blessing");\r
290                 if (desc) return _("命中率とACのボーナスを得る。", "Gives bonus to hit and AC for a few turns.");\r
291     \r
292                 /* Stop singing before start another */\r
293                 if (cast || fail) stop_singing();\r
294 \r
295                 if (cast)\r
296                 {\r
297                         msg_print(_("厳かなメロディを奏で始めた...", "The holy power of the Music of the Ainur enters you..."));\r
298                         start_singing(spell, MUSIC_BLESS);\r
299                 }\r
300 \r
301                 if (stop)\r
302                 {\r
303                         if (!p_ptr->blessed)\r
304                         {\r
305                                 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));\r
306                         }\r
307                 }\r
308 \r
309                 break;\r
310 \r
311         case 2:\r
312                 if (name) return _("崩壊の音色", "Wrecking Note");\r
313                 if (desc) return _("轟音のボルトを放つ。", "Fires a bolt of sound.");\r
314     \r
315                 /* Stop singing before start another */\r
316                 if (cast || fail) stop_singing();\r
317 \r
318                 {\r
319                         int dice = 4 + (plev - 1) / 5;\r
320                         int sides = 4;\r
321 \r
322                         if (info) return info_damage(dice, sides, 0);\r
323 \r
324                         if (cast)\r
325                         {\r
326                                 if (!get_aim_dir(&dir)) return NULL;\r
327 \r
328                                 fire_bolt(GF_SOUND, dir, damroll(dice, sides));\r
329                         }\r
330                 }\r
331                 break;\r
332 \r
333         case 3:\r
334                 if (name) return _("朦朧の旋律", "Stun Pattern");\r
335                 if (desc) return _("視界内の全てのモンスターを朦朧させる。抵抗されると無効。", "Attempts to stun all monsters in sight.");\r
336     \r
337                 /* Stop singing before start another */\r
338                 if (cast || fail) stop_singing();\r
339 \r
340                 if (cast)\r
341                 {\r
342                         msg_print(_("眩惑させるメロディを奏で始めた...", "You weave a pattern of sounds to bewilder and daze..."));\r
343                         start_singing(spell, MUSIC_STUN);\r
344                 }\r
345 \r
346                 {\r
347                         int dice = plev / 10;\r
348                         int sides = 2;\r
349 \r
350                         if (info) return info_power_dice(dice, sides);\r
351 \r
352                         if (cont)\r
353                         {\r
354                                 stun_monsters(damroll(dice, sides));\r
355                         }\r
356                 }\r
357 \r
358                 break;\r
359 \r
360         case 4:\r
361                 if (name) return _("生命の流れ", "Flow of Life");\r
362                 if (desc) return _("体力を少し回復させる。", "Heals HP a little.");\r
363     \r
364                 /* Stop singing before start another */\r
365                 if (cast || fail) stop_singing();\r
366 \r
367                 if (cast)\r
368                 {\r
369                         msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing a song of healing..."));\r
370                         start_singing(spell, MUSIC_L_LIFE);\r
371                 }\r
372 \r
373                 {\r
374                         int dice = 2;\r
375                         int sides = 6;\r
376 \r
377                         if (info) return info_heal(dice, sides, 0);\r
378 \r
379                         if (cont)\r
380                         {\r
381                                 hp_player(damroll(dice, sides));\r
382                         }\r
383                 }\r
384 \r
385                 break;\r
386 \r
387         case 5:\r
388                 if (name) return _("太陽の歌", "Song of the Sun");\r
389                 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");\r
390     \r
391                 /* Stop singing before start another */\r
392                 if (cast || fail) stop_singing();\r
393 \r
394                 {\r
395                         int dice = 2;\r
396                         int sides = plev / 2;\r
397                         int rad = plev / 10 + 1;\r
398 \r
399                         if (info) return info_damage(dice, sides, 0);\r
400 \r
401                         if (cast)\r
402                         {\r
403                                 msg_print(_("光り輝く歌が辺りを照らした。", "Your uplifting song brings brightness to dark places..."));\r
404                                 lite_area(damroll(dice, sides), rad);\r
405                         }\r
406                 }\r
407                 break;\r
408 \r
409         case 6:\r
410                 if (name) return _("恐怖の歌", "Song of Fear");\r
411                 if (desc) return _("視界内の全てのモンスターを恐怖させる。抵抗されると無効。", "Attempts to scare all monsters in sight.");\r
412     \r
413                 /* Stop singing before start another */\r
414                 if (cast || fail) stop_singing();\r
415 \r
416                 if (cast)\r
417                 {\r
418                         msg_print(_("おどろおどろしいメロディを奏で始めた...", "You start weaving a fearful pattern..."));\r
419                         start_singing(spell, MUSIC_FEAR);                       \r
420                 }\r
421 \r
422                 {\r
423                         int power = plev;\r
424 \r
425                         if (info) return info_power(power);\r
426 \r
427                         if (cont)\r
428                         {\r
429                                 project_hack(GF_TURN_ALL, power);\r
430                         }\r
431                 }\r
432 \r
433                 break;\r
434 \r
435         case 7:\r
436                 if (name) return _("戦いの歌", "Heroic Ballad");\r
437                 if (desc) return _("ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");\r
438 \r
439                 /* Stop singing before start another */\r
440                 if (cast || fail) stop_singing();\r
441 \r
442                 if (cast)\r
443                 {\r
444                         msg_print(_("激しい戦いの歌を歌った...", "You start singing a song of intense fighting..."));\r
445 \r
446                         (void)hp_player(10);\r
447                         (void)set_afraid(0);\r
448 \r
449                         /* Recalculate hitpoints */\r
450                         p_ptr->update |= (PU_HP);\r
451 \r
452                         start_singing(spell, MUSIC_HERO);\r
453                 }\r
454 \r
455                 if (stop)\r
456                 {\r
457                         if (!p_ptr->hero)\r
458                         {\r
459                                 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));\r
460                                 /* Recalculate hitpoints */\r
461                                 p_ptr->update |= (PU_HP);\r
462                         }\r
463                 }\r
464 \r
465                 break;\r
466 \r
467         case 8:\r
468                 if (name) return _("霊的知覚", "Clairaudience");\r
469                 if (desc) return _("近くの罠/扉/階段を感知する。レベル15で全てのモンスター、20で財宝とアイテムを感知できるようになる。レベル25で周辺の地形を感知し、40でその階全体を永久に照らし、ダンジョン内のすべてのアイテムを感知する。この効果は歌い続けることで順に起こる。", \r
470                         "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
471     \r
472                 /* Stop singing before start another */\r
473                 if (cast || fail) stop_singing();\r
474 \r
475                 if (cast)\r
476                 {\r
477                         msg_print(_("静かな音楽が感覚を研ぎ澄まさせた...", "Your quiet music sharpens your sense of hearing..."));\r
478                         /* Hack -- Initialize the turn count */\r
479                         SINGING_COUNT(p_ptr) = 0;\r
480                         start_singing(spell, MUSIC_DETECT);\r
481                 }\r
482 \r
483                 {\r
484                         int rad = DETECT_RAD_DEFAULT;\r
485 \r
486                         if (info) return info_radius(rad);\r
487 \r
488                         if (cont)\r
489                         {\r
490                                 int count = SINGING_COUNT(p_ptr);\r
491 \r
492                                 if (count >= 19) wiz_lite(FALSE);\r
493                                 if (count >= 11)\r
494                                 {\r
495                                         map_area(rad);\r
496                                         if (plev > 39 && count < 19)\r
497                                                 SINGING_COUNT(p_ptr) = count + 1;\r
498                                 }\r
499                                 if (count >= 6)\r
500                                 {\r
501                                         /* There are too many hidden treasure.  So... */\r
502                                         /* detect_treasure(rad); */\r
503                                         detect_objects_gold(rad);\r
504                                         detect_objects_normal(rad);\r
505 \r
506                                         if (plev > 24 && count < 11)\r
507                                                 SINGING_COUNT(p_ptr) = count + 1;\r
508                                 }\r
509                                 if (count >= 3)\r
510                                 {\r
511                                         detect_monsters_invis(rad);\r
512                                         detect_monsters_normal(rad);\r
513 \r
514                                         if (plev > 19 && count < 6)\r
515                                                 SINGING_COUNT(p_ptr) = count + 1;\r
516                                 }\r
517                                 detect_traps(rad, TRUE);\r
518                                 detect_doors(rad);\r
519                                 detect_stairs(rad);\r
520 \r
521                                 if (plev > 14 && count < 3)\r
522                                         SINGING_COUNT(p_ptr) = count + 1;\r
523                         }\r
524                 }\r
525 \r
526                 break;\r
527 \r
528         case 9:\r
529                 if (name) return _("魂の歌", "Soul Shriek");\r
530                 if (desc) return _("視界内の全てのモンスターに対して精神攻撃を行う。", "Damages all monsters in sight with PSI damages.");\r
531 \r
532                 /* Stop singing before start another */\r
533                 if (cast || fail) stop_singing();\r
534 \r
535                 if (cast)\r
536                 {\r
537                         msg_print(_("精神を捻じ曲げる歌を歌った...", "You start singing a song of soul in pain..."));\r
538                         start_singing(spell, MUSIC_PSI);\r
539                 }\r
540 \r
541                 {\r
542                         int dice = 1;\r
543                         int sides = plev * 3 / 2;\r
544 \r
545                         if (info) return info_damage(dice, sides, 0);\r
546 \r
547                         if (cont)\r
548                         {\r
549                                 project_hack(GF_PSI, damroll(dice, sides));\r
550                         }\r
551                 }\r
552 \r
553                 break;\r
554 \r
555         case 10:\r
556                 if (name) return _("知識の歌", "Song of Lore");\r
557                 if (desc) return _("自分のいるマスと隣りのマスに落ちているアイテムを鑑定する。", "Identifies all items which are in the adjacent squares.");\r
558     \r
559                 /* Stop singing before start another */\r
560                 if (cast || fail) stop_singing();\r
561 \r
562                 if (cast)\r
563                 {\r
564                         msg_print(_("この世界の知識が流れ込んできた...", "You recall the rich lore of the world..."));\r
565                         start_singing(spell, MUSIC_ID);\r
566                 }\r
567 \r
568                 {\r
569                         int rad = 1;\r
570 \r
571                         if (info) return info_radius(rad);\r
572 \r
573                         /*\r
574                          * 歌の開始時にも効果発動:\r
575                          * MP不足で鑑定が発動される前に歌が中断してしまうのを防止。\r
576                          */\r
577                         if (cont || cast)\r
578                         {\r
579                                 project(0, rad, p_ptr->y, p_ptr->x, 0, GF_IDENTIFY, PROJECT_ITEM, -1);\r
580                         }\r
581                 }\r
582 \r
583                 break;\r
584 \r
585         case 11:\r
586                 if (name) return _("隠遁の歌", "Hiding Tune");\r
587                 if (desc) return _("隠密行動能力を上昇させる。", "Gives improved stealth.");\r
588 \r
589                 /* Stop singing before start another */\r
590                 if (cast || fail) stop_singing();\r
591 \r
592                 if (cast)\r
593                 {\r
594                         msg_print(_("あなたの姿が景色にとけこんでいった...", "Your song carries you beyond the sight of mortal eyes..."));\r
595                         start_singing(spell, MUSIC_STEALTH);\r
596                 }\r
597 \r
598                 if (stop)\r
599                 {\r
600                         if (!p_ptr->tim_stealth)\r
601                         {\r
602                                 msg_print(_("姿がはっきりと見えるようになった。", "You are no longer hided."));\r
603                         }\r
604                 }\r
605 \r
606                 break;\r
607 \r
608         case 12:\r
609                 if (name) return _("幻影の旋律", "Illusion Pattern");\r
610                 if (desc) return _("視界内の全てのモンスターを混乱させる。抵抗されると無効。", "Attempts to confuse all monsters in sight.");\r
611     \r
612                 /* Stop singing before start another */\r
613                 if (cast || fail) stop_singing();\r
614 \r
615                 if (cast)\r
616                 {\r
617                         msg_print(_("辺り一面に幻影が現れた...", "You weave a pattern of sounds to beguile and confuse..."));\r
618                         start_singing(spell, MUSIC_CONF);\r
619                 }\r
620 \r
621                 {\r
622                         int power = plev * 2;\r
623 \r
624                         if (info) return info_power(power);\r
625 \r
626                         if (cont)\r
627                         {\r
628                                 confuse_monsters(power);\r
629                         }\r
630                 }\r
631 \r
632                 break;\r
633 \r
634         case 13:\r
635                 if (name) return _("破滅の叫び", "Doomcall");\r
636                 if (desc) return _("視界内の全てのモンスターに対して轟音攻撃を行う。", "Damages all monsters in sight with booming sound.");\r
637     \r
638                 /* Stop singing before start another */\r
639                 if (cast || fail) stop_singing();\r
640 \r
641                 if (cast)\r
642                 {\r
643                         msg_print(_("轟音が響いた...", "The fury of the Downfall of Numenor lashes out..."));\r
644                         start_singing(spell, MUSIC_SOUND);\r
645                 }\r
646 \r
647                 {\r
648                         int dice = 10 + plev / 5;\r
649                         int sides = 7;\r
650 \r
651                         if (info) return info_damage(dice, sides, 0);\r
652 \r
653                         if (cont)\r
654                         {\r
655                                 project_hack(GF_SOUND, damroll(dice, sides));\r
656                         }\r
657                 }\r
658 \r
659                 break;\r
660 \r
661         case 14:\r
662                 if (name) return _("フィリエルの歌", "Firiel's Song");\r
663                 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");\r
664     \r
665                 {\r
666                         /* Stop singing before start another */\r
667                         if (cast || fail) stop_singing();\r
668 \r
669                         if (cast)\r
670                         {\r
671                                 msg_print(_("生命と復活のテーマを奏で始めた...", "The themes of life and revival are woven into your song..."));\r
672                                 animate_dead(0, p_ptr->y, p_ptr->x);\r
673                         }\r
674                 }\r
675                 break;\r
676 \r
677         case 15:\r
678                 if (name) return _("旅の仲間", "Fellowship Chant");\r
679                 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");\r
680 \r
681                 /* Stop singing before start another */\r
682                 if (cast || fail) stop_singing();\r
683 \r
684                 if (cast)\r
685                 {\r
686                         msg_print(_("安らかなメロディを奏で始めた...", "You weave a slow, soothing melody of imploration..."));\r
687                         start_singing(spell, MUSIC_CHARM);\r
688                 }\r
689 \r
690                 {\r
691                         int dice = 10 + plev / 15;\r
692                         int sides = 6;\r
693 \r
694                         if (info) return info_power_dice(dice, sides);\r
695 \r
696                         if (cont)\r
697                         {\r
698                                 charm_monsters(damroll(dice, sides));\r
699                         }\r
700                 }\r
701 \r
702                 break;\r
703 \r
704         case 16:\r
705                 if (name) return _("分解音波", "Sound of disintegration");\r
706                 if (desc) return _("壁を掘り進む。自分の足元のアイテムは蒸発する。", "Makes you be able to burrow into walls. Objects under your feet evaporate.");\r
707 \r
708                 /* Stop singing before start another */\r
709                 if (cast || fail) stop_singing();\r
710 \r
711                 if (cast)\r
712                 {\r
713                         msg_print(_("粉砕するメロディを奏で始めた...", "You weave a violent pattern of sounds to break wall."));\r
714                         start_singing(spell, MUSIC_WALL);\r
715                 }\r
716 \r
717                 {\r
718                         /*\r
719                          * 歌の開始時にも効果発動:\r
720                          * MP不足で効果が発動される前に歌が中断してしまうのを防止。\r
721                          */\r
722                         if (cont || cast)\r
723                         {\r
724                                 project(0, 0, p_ptr->y, p_ptr->x,\r
725                                         0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1);\r
726                         }\r
727                 }\r
728                 break;\r
729 \r
730         case 17:\r
731                 if (name) return _("元素耐性", "Finrod's Resistance");\r
732                 if (desc) return _("酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。", \r
733                         "Gives resistance to fire, cold, electricity, acid and poison. These resistances can be added to which from equipment for more powerful resistances.");\r
734     \r
735                 /* Stop singing before start another */\r
736                 if (cast || fail) stop_singing();\r
737 \r
738                 if (cast)\r
739                 {\r
740                         msg_print(_("元素の力に対する忍耐の歌を歌った。", "You sing a song of perseverance against powers..."));\r
741                         start_singing(spell, MUSIC_RESIST);\r
742                 }\r
743 \r
744                 if (stop)\r
745                 {\r
746                         if (!p_ptr->oppose_acid)\r
747                         {\r
748                                 msg_print(_("酸への耐性が薄れた気がする。", "You feel less resistant to acid."));\r
749                         }\r
750 \r
751                         if (!p_ptr->oppose_elec)\r
752                         {\r
753                                 msg_print(_("電撃への耐性が薄れた気がする。", "You feel less resistant to elec."));\r
754                         }\r
755 \r
756                         if (!p_ptr->oppose_fire)\r
757                         {\r
758                                 msg_print(_("火への耐性が薄れた気がする。", "You feel less resistant to fire."));\r
759                         }\r
760 \r
761                         if (!p_ptr->oppose_cold)\r
762                         {\r
763                                 msg_print(_("冷気への耐性が薄れた気がする。", "You feel less resistant to cold."));\r
764                         }\r
765 \r
766                         if (!p_ptr->oppose_pois)\r
767                         {\r
768                                 msg_print(_("毒への耐性が薄れた気がする。", "You feel less resistant to pois."));\r
769                         }\r
770                 }\r
771 \r
772                 break;\r
773 \r
774         case 18:\r
775                 if (name) return _("ホビットのメロディ", "Hobbit Melodies");\r
776                 if (desc) return _("加速する。", "Hastes you.");\r
777 \r
778                 /* Stop singing before start another */\r
779                 if (cast || fail) stop_singing();\r
780 \r
781                 if (cast)\r
782                 {\r
783                         msg_print(_("軽快な歌を口ずさみ始めた...", "You start singing joyful pop song..."));\r
784                         start_singing(spell, MUSIC_SPEED);\r
785                 }\r
786 \r
787                 if (stop)\r
788                 {\r
789                         if (!p_ptr->fast)\r
790                         {\r
791                                 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));\r
792                         }\r
793                 }\r
794 \r
795                 break;\r
796 \r
797         case 19:\r
798                 if (name) return _("歪んだ世界", "World Contortion");\r
799                 if (desc) return _("近くのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all nearby monsters away unless resisted.");\r
800     \r
801                 {\r
802                         int rad = plev / 15 + 1;\r
803                         int power = plev * 3 + 1;\r
804 \r
805                         if (info) return info_radius(rad);\r
806 \r
807                         /* Stop singing before start another */\r
808                         if (cast || fail) stop_singing();\r
809 \r
810                         if (cast)\r
811                         {\r
812                                 msg_print(_("歌が空間を歪めた...", "Reality whirls wildly as you sing a dizzying melody..."));\r
813                                 project(0, rad, p_ptr->y, p_ptr->x, power, GF_AWAY_ALL, PROJECT_KILL, -1);\r
814                         }\r
815                 }\r
816                 break;\r
817 \r
818         case 20:\r
819                 if (name) return _("退散の歌", "Dispelling chant");\r
820                 if (desc) return _("視界内の全てのモンスターにダメージを与える。邪悪なモンスターに特に大きなダメージを与える。", \r
821                         "Damages all monsters in sight. Hurts evil monsters greatly.");\r
822     \r
823                 /* Stop singing before start another */\r
824                 if (cast || fail) stop_singing();\r
825 \r
826                 if (cast)\r
827                 {\r
828                         msg_print(_("耐えられない不協和音が敵を責め立てた...", "You cry out in an ear-wracking voice..."));\r
829                         start_singing(spell, MUSIC_DISPEL);\r
830                 }\r
831 \r
832                 {\r
833                         int m_sides = plev * 3;\r
834                         int e_sides = plev * 3;\r
835 \r
836                         if (info) return format("%s1d%d+1d%d", s_dam, m_sides, e_sides);\r
837 \r
838                         if (cont)\r
839                         {\r
840                                 dispel_monsters(randint1(m_sides));\r
841                                 dispel_evil(randint1(e_sides));\r
842                         }\r
843                 }\r
844                 break;\r
845 \r
846         case 21:\r
847                 if (name) return _("サルマンの甘言", "The Voice of Saruman");\r
848                 if (desc) return _("視界内の全てのモンスターを減速させ、眠らせようとする。抵抗されると無効。", "Attempts to slow and sleep all monsters in sight.");\r
849     \r
850                 /* Stop singing before start another */\r
851                 if (cast || fail) stop_singing();\r
852 \r
853                 if (cast)\r
854                 {\r
855                         msg_print(_("優しく、魅力的な歌を口ずさみ始めた...", "You start humming a gentle and attractive song..."));\r
856                         start_singing(spell, MUSIC_SARUMAN);\r
857                 }\r
858 \r
859                 {\r
860                         int power = plev;\r
861 \r
862                         if (info) return info_power(power);\r
863 \r
864                         if (cont)\r
865                         {\r
866                                 slow_monsters(plev);\r
867                                 sleep_monsters(plev);\r
868                         }\r
869                 }\r
870 \r
871                 break;\r
872 \r
873         case 22:\r
874                 if (name) return _("嵐の音色", "Song of the Tempest");\r
875                 if (desc) return _("轟音のビームを放つ。", "Fires a beam of sound.");\r
876     \r
877                 {\r
878                         int dice = 15 + (plev - 1) / 2;\r
879                         int sides = 10;\r
880 \r
881                         if (info) return info_damage(dice, sides, 0);\r
882 \r
883                         /* Stop singing before start another */\r
884                         if (cast || fail) stop_singing();\r
885 \r
886                         if (cast)\r
887                         {\r
888                                 if (!get_aim_dir(&dir)) return NULL;\r
889 \r
890                                 fire_beam(GF_SOUND, dir, damroll(dice, sides));\r
891                         }\r
892                 }\r
893                 break;\r
894 \r
895         case 23:\r
896                 if (name) return _("もう一つの世界", "Ambarkanta");\r
897                 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");\r
898     \r
899                 {\r
900                         int base = 15;\r
901                         int sides = 20;\r
902 \r
903                         if (info) return info_delay(base, sides);\r
904 \r
905                         /* Stop singing before start another */\r
906                         if (cast || fail) stop_singing();\r
907 \r
908                         if (cast)\r
909                         {\r
910                                 msg_print(_("周囲が変化し始めた...", "You sing of the primeval shaping of Middle-earth..."));\r
911                                 alter_reality();\r
912                         }\r
913                 }\r
914                 break;\r
915 \r
916         case 24:\r
917                 if (name) return _("破壊の旋律", "Wrecking Pattern");\r
918                 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。", \r
919                         "Shakes dungeon structure, and results in random swapping of floors and walls.");\r
920 \r
921                 /* Stop singing before start another */\r
922                 if (cast || fail) stop_singing();\r
923 \r
924                 if (cast)\r
925                 {\r
926                         msg_print(_("破壊的な歌が響きわたった...", "You weave a pattern of sounds to contort and shatter..."));\r
927                         start_singing(spell, MUSIC_QUAKE);\r
928                 }\r
929 \r
930                 {\r
931                         int rad = 10;\r
932 \r
933                         if (info) return info_radius(rad);\r
934 \r
935                         if (cont)\r
936                         {\r
937                                 earthquake(p_ptr->y, p_ptr->x, 10);\r
938                         }\r
939                 }\r
940 \r
941                 break;\r
942 \r
943 \r
944         case 25:\r
945                 if (name) return _("停滞の歌", "Stationary Shriek");\r
946                 if (desc) return _("視界内の全てのモンスターを麻痺させようとする。抵抗されると無効。", "Attempts to freeze all monsters in sight.");\r
947     \r
948                 /* Stop singing before start another */\r
949                 if (cast || fail) stop_singing();\r
950 \r
951                 if (cast)\r
952                 {\r
953                         msg_print(_("ゆっくりとしたメロディを奏で始めた...", "You weave a very slow pattern which is almost likely to stop..."));\r
954                         start_singing(spell, MUSIC_STASIS);\r
955                 }\r
956 \r
957                 {\r
958                         int power = plev * 4;\r
959 \r
960                         if (info) return info_power(power);\r
961 \r
962                         if (cont)\r
963                         {\r
964                                 stasis_monsters(power);\r
965                         }\r
966                 }\r
967 \r
968                 break;\r
969 \r
970         case 26:\r
971                 if (name) return _("守りの歌", "Endurance");\r
972                 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。", \r
973                         "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
974     \r
975                 {\r
976                         /* Stop singing before start another */\r
977                         if (cast || fail) stop_singing();\r
978 \r
979                         if (cast)\r
980                         {\r
981                                 msg_print(_("歌が神聖な場を作り出した...", "The holy power of the Music is creating sacred field..."));\r
982                                 warding_glyph();\r
983                         }\r
984                 }\r
985                 break;\r
986 \r
987         case 27:\r
988                 if (name) return _("英雄の詩", "The Hero's Poem");\r
989                 if (desc) return _("加速し、ヒーロー気分になり、視界内の全てのモンスターにダメージを与える。", \r
990                         "Hastes you. Gives heroism. Damages all monsters in sight.");\r
991     \r
992                 /* Stop singing before start another */\r
993                 if (cast || fail) stop_singing();\r
994 \r
995                 if (cast)\r
996                 {\r
997                         msg_print(_("英雄の歌を口ずさんだ...", "You chant a powerful, heroic call to arms..."));\r
998                         (void)hp_player(10);\r
999                         (void)set_afraid(0);\r
1000 \r
1001                         /* Recalculate hitpoints */\r
1002                         p_ptr->update |= (PU_HP);\r
1003 \r
1004                         start_singing(spell, MUSIC_SHERO);\r
1005                 }\r
1006 \r
1007                 if (stop)\r
1008                 {\r
1009                         if (!p_ptr->hero)\r
1010                         {\r
1011                                 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));\r
1012                                 /* Recalculate hitpoints */\r
1013                                 p_ptr->update |= (PU_HP);\r
1014                         }\r
1015 \r
1016                         if (!p_ptr->fast)\r
1017                         {\r
1018                                 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));\r
1019                         }\r
1020                 }\r
1021 \r
1022                 {\r
1023                         int dice = 1;\r
1024                         int sides = plev * 3;\r
1025 \r
1026                         if (info) return info_damage(dice, sides, 0);\r
1027 \r
1028                         if (cont)\r
1029                         {\r
1030                                 dispel_monsters(damroll(dice, sides));\r
1031                         }\r
1032                 }\r
1033                 break;\r
1034 \r
1035         case 28:\r
1036                 if (name) return _("ヤヴァンナの助け", "Relief of Yavanna");\r
1037                 if (desc) return _("強力な回復の歌で、負傷と朦朧状態も全快する。", "Powerful healing song. Also heals cut and stun completely.");\r
1038     \r
1039                 /* Stop singing before start another */\r
1040                 if (cast || fail) stop_singing();\r
1041 \r
1042                 if (cast)\r
1043                 {\r
1044                         msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing the song..."));\r
1045                         start_singing(spell, MUSIC_H_LIFE);\r
1046                 }\r
1047 \r
1048                 {\r
1049                         int dice = 15;\r
1050                         int sides = 10;\r
1051 \r
1052                         if (info) return info_heal(dice, sides, 0);\r
1053 \r
1054                         if (cont)\r
1055                         {\r
1056                                 hp_player(damroll(dice, sides));\r
1057                                 set_stun(0);\r
1058                                 set_cut(0);\r
1059                         }\r
1060                 }\r
1061 \r
1062                 break;\r
1063 \r
1064         case 29:\r
1065                 if (name) return _("再生の歌", "Goddess' rebirth");\r
1066                 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");\r
1067     \r
1068                 {\r
1069                         /* Stop singing before start another */\r
1070                         if (cast || fail) stop_singing();\r
1071 \r
1072                         if (cast)\r
1073                         {\r
1074                                 msg_print(_("暗黒の中に光と美をふりまいた。体が元の活力を取り戻した。",\r
1075                                                         "You strewed light and beauty in the dark as you sing. You feel refreshed."));\r
1076                                 (void)do_res_stat(A_STR);\r
1077                                 (void)do_res_stat(A_INT);\r
1078                                 (void)do_res_stat(A_WIS);\r
1079                                 (void)do_res_stat(A_DEX);\r
1080                                 (void)do_res_stat(A_CON);\r
1081                                 (void)do_res_stat(A_CHR);\r
1082                                 (void)restore_level();\r
1083                         }\r
1084                 }\r
1085                 break;\r
1086 \r
1087         case 30:\r
1088                 if (name) return _("サウロンの魔術", "Wizardry of Sauron");\r
1089                 if (desc) return _("非常に強力でごく小さい轟音の球を放つ。", "Fires an extremely powerful tiny ball of sound.");\r
1090     \r
1091                 {\r
1092                         int dice = 50 + plev;\r
1093                         int sides = 10;\r
1094                         int rad = 0;\r
1095 \r
1096                         if (info) return info_damage(dice, sides, 0);\r
1097 \r
1098                         /* Stop singing before start another */\r
1099                         if (cast || fail) stop_singing();\r
1100 \r
1101                         if (cast)\r
1102                         {\r
1103                                 if (!get_aim_dir(&dir)) return NULL;\r
1104 \r
1105                                 fire_ball(GF_SOUND, dir, damroll(dice, sides), rad);\r
1106                         }\r
1107                 }\r
1108                 break;\r
1109 \r
1110         case 31:\r
1111                 if (name) return _("フィンゴルフィンの挑戦", "Fingolfin's Challenge");\r
1112                 if (desc) return _("ダメージを受けなくなるバリアを張る。", \r
1113                         "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks.");\r
1114     \r
1115                 /* Stop singing before start another */\r
1116                 if (cast || fail) stop_singing();\r
1117 \r
1118                 if (cast)\r
1119                 {\r
1120                         msg_print(_("フィンゴルフィンの冥王への挑戦を歌った...",\r
1121                                                 "You recall the valor of Fingolfin's challenge to the Dark Lord..."));\r
1122 \r
1123                         /* Redraw map */\r
1124                         p_ptr->redraw |= (PR_MAP);\r
1125                 \r
1126                         /* Update monsters */\r
1127                         p_ptr->update |= (PU_MONSTERS);\r
1128                 \r
1129                         /* Window stuff */\r
1130                         p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);\r
1131 \r
1132                         start_singing(spell, MUSIC_INVULN);\r
1133                 }\r
1134 \r
1135                 if (stop)\r
1136                 {\r
1137                         if (!p_ptr->invuln)\r
1138                         {\r
1139                                 msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));\r
1140                                 /* Redraw map */\r
1141                                 p_ptr->redraw |= (PR_MAP);\r
1142 \r
1143                                 /* Update monsters */\r
1144                                 p_ptr->update |= (PU_MONSTERS);\r
1145 \r
1146                                 /* Window stuff */\r
1147                                 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);\r
1148                         }\r
1149                 }\r
1150 \r
1151                 break;\r
1152         }\r
1153 \r
1154         return "";\r
1155 }\r
1156 \r
1157 /*!\r
1158  * @brief 剣術の各処理を行う\r
1159  * @param spell 剣術ID\r
1160  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_CAST)\r
1161  * @return SPELL_NAME / SPELL_DESC 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。\r
1162  */\r
1163 static cptr do_hissatsu_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
1164 {\r
1165         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
1166         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
1167         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
1168 \r
1169         int dir;\r
1170         int plev = p_ptr->lev;\r
1171 \r
1172         switch (spell)\r
1173         {\r
1174         case 0:\r
1175                 if (name) return _("飛飯綱", "Tobi-Izuna");\r
1176                 if (desc) return _("2マス離れたところにいるモンスターを攻撃する。", "Attacks a two squares distant monster.");\r
1177     \r
1178                 if (cast)\r
1179                 {\r
1180                         project_length = 2;\r
1181                         if (!get_aim_dir(&dir)) return NULL;\r
1182 \r
1183                         project_hook(GF_ATTACK, dir, HISSATSU_2, PROJECT_STOP | PROJECT_KILL);\r
1184                 }\r
1185                 break;\r
1186 \r
1187         case 1:\r
1188                 if (name) return _("五月雨斬り", "3-Way Attack");\r
1189                 if (desc) return _("3方向に対して攻撃する。", "Attacks in 3 directions in one time.");\r
1190     \r
1191                 if (cast)\r
1192                 {\r
1193                         int cdir;\r
1194                         int y, x;\r
1195 \r
1196                         if (!get_rep_dir2(&dir)) return NULL;\r
1197                         if (dir == 5) return NULL;\r
1198 \r
1199                         for (cdir = 0;cdir < 8; cdir++)\r
1200                         {\r
1201                                 if (cdd[cdir] == dir) break;\r
1202                         }\r
1203 \r
1204                         if (cdir == 8) return NULL;\r
1205 \r
1206                         y = p_ptr->y + ddy_cdd[cdir];\r
1207                         x = p_ptr->x + ddx_cdd[cdir];\r
1208                         if (cave[y][x].m_idx)\r
1209                                 py_attack(y, x, 0);\r
1210                         else\r
1211                                 msg_print(_("攻撃は空を切った。", "You attack the empty air."));\r
1212                         \r
1213                         y = p_ptr->y + ddy_cdd[(cdir + 7) % 8];\r
1214                         x = p_ptr->x + ddx_cdd[(cdir + 7) % 8];\r
1215                         if (cave[y][x].m_idx)\r
1216                                 py_attack(y, x, 0);\r
1217                         else\r
1218                                 msg_print(_("攻撃は空を切った。", "You attack the empty air."));\r
1219                         \r
1220                         y = p_ptr->y + ddy_cdd[(cdir + 1) % 8];\r
1221                         x = p_ptr->x + ddx_cdd[(cdir + 1) % 8];\r
1222                         if (cave[y][x].m_idx)\r
1223                                 py_attack(y, x, 0);\r
1224                         else\r
1225                                 msg_print(_("攻撃は空を切った。", "You attack the empty air."));\r
1226                 }\r
1227                 break;\r
1228 \r
1229         case 2:\r
1230                 if (name) return _("ブーメラン", "Boomerang");\r
1231                 if (desc) return _("武器を手元に戻ってくるように投げる。戻ってこないこともある。", \r
1232                         "Throws current weapon. And it'll return to your hand unless failed.");\r
1233     \r
1234                 if (cast)\r
1235                 {\r
1236                         if (!do_cmd_throw(1, TRUE, -1)) return NULL;\r
1237                 }\r
1238                 break;\r
1239 \r
1240         case 3:\r
1241                 if (name) return _("焔霊", "Burning Strike");\r
1242                 if (desc) return _("火炎耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to fire.");\r
1243     \r
1244                 if (cast)\r
1245                 {\r
1246                         int y, x;\r
1247 \r
1248                         if (!get_rep_dir2(&dir)) return NULL;\r
1249                         if (dir == 5) return NULL;\r
1250 \r
1251                         y = p_ptr->y + ddy[dir];\r
1252                         x = p_ptr->x + ddx[dir];\r
1253 \r
1254                         if (cave[y][x].m_idx)\r
1255                                 py_attack(y, x, HISSATSU_FIRE);\r
1256                         else\r
1257                         {\r
1258                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
1259                                 return NULL;\r
1260                         }\r
1261                 }\r
1262                 break;\r
1263 \r
1264         case 4:\r
1265                 if (name) return _("殺気感知", "Detect Ferocity");\r
1266                 if (desc) return _("近くの思考することができるモンスターを感知する。", "Detects all monsters except mindless in your vicinity.");\r
1267     \r
1268                 if (cast)\r
1269                 {\r
1270                         detect_monsters_mind(DETECT_RAD_DEFAULT);\r
1271                 }\r
1272                 break;\r
1273 \r
1274         case 5:\r
1275                 if (name) return _("みね打ち", "Strike to Stun");\r
1276                 if (desc) return _("相手にダメージを与えないが、朦朧とさせる。", "Attempts to stun a monster in the adjacent.");\r
1277     \r
1278                 if (cast)\r
1279                 {\r
1280                         int y, x;\r
1281 \r
1282                         if (!get_rep_dir2(&dir)) return NULL;\r
1283                         if (dir == 5) return NULL;\r
1284 \r
1285                         y = p_ptr->y + ddy[dir];\r
1286                         x = p_ptr->x + ddx[dir];\r
1287 \r
1288                         if (cave[y][x].m_idx)\r
1289                                 py_attack(y, x, HISSATSU_MINEUCHI);\r
1290                         else\r
1291                         {\r
1292                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
1293                                 return NULL;\r
1294                         }\r
1295                 }\r
1296                 break;\r
1297 \r
1298         case 6:\r
1299                 if (name) return _("カウンター", "Counter");\r
1300                 if (desc) return _("相手に攻撃されたときに反撃する。反撃するたびにMPを消費。", \r
1301                         "Prepares to counterattack. When attack by a monster, strikes back using SP each time.");\r
1302     \r
1303                 if (cast)\r
1304                 {\r
1305                         if (p_ptr->riding)\r
1306                         {\r
1307                                 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));\r
1308                                 return NULL;\r
1309                         }\r
1310                         msg_print(_("相手の攻撃に対して身構えた。", "You prepare to counter blow."));\r
1311                         p_ptr->counter = TRUE;\r
1312                 }\r
1313                 break;\r
1314 \r
1315         case 7:\r
1316                 if (name) return _("払い抜け", "Harainuke");\r
1317                 if (desc) return _("攻撃した後、反対側に抜ける。", \r
1318                         "Attacks monster with your weapons normally, then move through counter side of the monster.");\r
1319     \r
1320                 if (cast)\r
1321                 {\r
1322                         POSITION y, x;\r
1323 \r
1324                         if (p_ptr->riding)\r
1325                         {\r
1326                                 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));\r
1327                                 return NULL;\r
1328                         }\r
1329         \r
1330                         if (!get_rep_dir2(&dir)) return NULL;\r
1331         \r
1332                         if (dir == 5) return NULL;\r
1333                         y = p_ptr->y + ddy[dir];\r
1334                         x = p_ptr->x + ddx[dir];\r
1335         \r
1336                         if (!cave[y][x].m_idx)\r
1337                         {\r
1338                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
1339                                 return NULL;\r
1340                         }\r
1341         \r
1342                         py_attack(y, x, 0);\r
1343         \r
1344                         if (!player_can_enter(cave[y][x].feat, 0) || is_trap(cave[y][x].feat))\r
1345                                 break;\r
1346         \r
1347                         y += ddy[dir];\r
1348                         x += ddx[dir];\r
1349         \r
1350                         if (player_can_enter(cave[y][x].feat, 0) && !is_trap(cave[y][x].feat) && !cave[y][x].m_idx)\r
1351                         {\r
1352                                 msg_print(NULL);\r
1353         \r
1354                                 /* Move the player */\r
1355                                 (void)move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);\r
1356                         }\r
1357                 }\r
1358                 break;\r
1359 \r
1360         case 8:\r
1361                 if (name) return _("サーペンツタン", "Serpent's Tongue");\r
1362                 if (desc) return _("毒耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to poison.");\r
1363     \r
1364                 if (cast)\r
1365                 {\r
1366                         int y, x;\r
1367 \r
1368                         if (!get_rep_dir2(&dir)) return NULL;\r
1369                         if (dir == 5) return NULL;\r
1370 \r
1371                         y = p_ptr->y + ddy[dir];\r
1372                         x = p_ptr->x + ddx[dir];\r
1373 \r
1374                         if (cave[y][x].m_idx)\r
1375                                 py_attack(y, x, HISSATSU_POISON);\r
1376                         else\r
1377                         {\r
1378                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
1379                                 return NULL;\r
1380                         }\r
1381                 }\r
1382                 break;\r
1383 \r
1384         case 9:\r
1385                 if (name) return _("斬魔剣弐の太刀", "Zammaken");\r
1386                 if (desc) return _("生命のない邪悪なモンスターに大ダメージを与えるが、他のモンスターには全く効果がない。", \r
1387                         "Attacks an evil unliving monster with great damage. No effect to other  monsters.");\r
1388     \r
1389                 if (cast)\r
1390                 {\r
1391                         int y, x;\r
1392 \r
1393                         if (!get_rep_dir2(&dir)) return NULL;\r
1394                         if (dir == 5) return NULL;\r
1395 \r
1396                         y = p_ptr->y + ddy[dir];\r
1397                         x = p_ptr->x + ddx[dir];\r
1398 \r
1399                         if (cave[y][x].m_idx)\r
1400                                 py_attack(y, x, HISSATSU_ZANMA);\r
1401                         else\r
1402                         {\r
1403                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
1404                                 return NULL;\r
1405                         }\r
1406                 }\r
1407                 break;\r
1408 \r
1409         case 10:\r
1410                 if (name) return _("裂風剣", "Wind Blast");\r
1411                 if (desc) return _("攻撃した相手を後方へ吹き飛ばす。", "Attacks an adjacent monster, and blow it away.");\r
1412     \r
1413                 if (cast)\r
1414                 {\r
1415                         int y, x;\r
1416 \r
1417                         if (!get_rep_dir2(&dir)) return NULL;\r
1418                         if (dir == 5) return NULL;\r
1419 \r
1420                         y = p_ptr->y + ddy[dir];\r
1421                         x = p_ptr->x + ddx[dir];\r
1422 \r
1423                         if (cave[y][x].m_idx)\r
1424                                 py_attack(y, x, 0);\r
1425                         else\r
1426                         {\r
1427                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
1428                                 return NULL;\r
1429                         }\r
1430                         if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)\r
1431                         {\r
1432                                 return "";\r
1433                         }\r
1434                         if (cave[y][x].m_idx)\r
1435                         {\r
1436                                 int i;\r
1437                                 POSITION ty = y, tx = x;\r
1438                                 POSITION oy = y, ox = x;\r
1439                                 MONSTER_IDX m_idx = cave[y][x].m_idx;\r
1440                                 monster_type *m_ptr = &m_list[m_idx];\r
1441                                 char m_name[80];\r
1442         \r
1443                                 monster_desc(m_name, m_ptr, 0);\r
1444         \r
1445                                 for (i = 0; i < 5; i++)\r
1446                                 {\r
1447                                         y += ddy[dir];\r
1448                                         x += ddx[dir];\r
1449                                         if (cave_empty_bold(y, x))\r
1450                                         {\r
1451                                                 ty = y;\r
1452                                                 tx = x;\r
1453                                         }\r
1454                                         else break;\r
1455                                 }\r
1456                                 if ((ty != oy) || (tx != ox))\r
1457                                 {\r
1458                                         msg_format(_("%sを吹き飛ばした!", "You blow %s away!"), m_name);\r
1459                                         cave[oy][ox].m_idx = 0;\r
1460                                         cave[ty][tx].m_idx = m_idx;\r
1461                                         m_ptr->fy = ty;\r
1462                                         m_ptr->fx = tx;\r
1463         \r
1464                                         update_mon(m_idx, TRUE);\r
1465                                         lite_spot(oy, ox);\r
1466                                         lite_spot(ty, tx);\r
1467         \r
1468                                         if (r_info[m_ptr->r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))\r
1469                                                 p_ptr->update |= (PU_MON_LITE);\r
1470                                 }\r
1471                         }\r
1472                 }\r
1473                 break;\r
1474 \r
1475         case 11:\r
1476                 if (name) return _("刀匠の目利き", "Judge");\r
1477                 if (desc) return _("武器・防具を1つ識別する。レベル45以上で武器・防具の能力を完全に知ることができる。", \r
1478                         "Identifies a weapon or armor. Or *identifies* these at level 45.");\r
1479     \r
1480                 if (cast)\r
1481                 {\r
1482                         if (plev > 44)\r
1483                         {\r
1484                                 if (!identify_fully(TRUE)) return NULL;\r
1485                         }\r
1486                         else\r
1487                         {\r
1488                                 if (!ident_spell(TRUE)) return NULL;\r
1489                         }\r
1490                 }\r
1491                 break;\r
1492 \r
1493         case 12:\r
1494                 if (name) return _("破岩斬", "Rock Smash");\r
1495                 if (desc) return _("岩を壊し、岩石系のモンスターに大ダメージを与える。", "Breaks rock. Or greatly damage a monster made by rocks.");\r
1496     \r
1497                 if (cast)\r
1498                 {\r
1499                         int y, x;\r
1500 \r
1501                         if (!get_rep_dir2(&dir)) return NULL;\r
1502                         if (dir == 5) return NULL;\r
1503 \r
1504                         y = p_ptr->y + ddy[dir];\r
1505                         x = p_ptr->x + ddx[dir];\r
1506 \r
1507                         if (cave[y][x].m_idx)\r
1508                                 py_attack(y, x, HISSATSU_HAGAN);\r
1509         \r
1510                         if (!cave_have_flag_bold(y, x, FF_HURT_ROCK)) break;\r
1511         \r
1512                         /* Destroy the feature */\r
1513                         cave_alter_feat(y, x, FF_HURT_ROCK);\r
1514         \r
1515                         /* Update some things */\r
1516                         p_ptr->update |= (PU_FLOW);\r
1517                 }\r
1518                 break;\r
1519 \r
1520         case 13:\r
1521                 if (name) return _("乱れ雪月花", "Midare-Setsugekka");\r
1522                 if (desc) return _("攻撃回数が増え、冷気耐性のないモンスターに大ダメージを与える。", \r
1523                         "Attacks a monster with increased number of attacks and more damage unless it has resistance to cold.");\r
1524     \r
1525                 if (cast)\r
1526                 {\r
1527                         int y, x;\r
1528 \r
1529                         if (!get_rep_dir2(&dir)) return NULL;\r
1530                         if (dir == 5) return NULL;\r
1531 \r
1532                         y = p_ptr->y + ddy[dir];\r
1533                         x = p_ptr->x + ddx[dir];\r
1534 \r
1535                         if (cave[y][x].m_idx)\r
1536                                 py_attack(y, x, HISSATSU_COLD);\r
1537                         else\r
1538                         {\r
1539                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
1540                                 return NULL;\r
1541                         }\r
1542                 }\r
1543                 break;\r
1544 \r
1545         case 14:\r
1546                 if (name) return _("急所突き", "Spot Aiming");\r
1547                 if (desc) return _("モンスターを一撃で倒す攻撃を繰り出す。失敗すると1点しかダメージを与えられない。", \r
1548                         "Attempts to kill a monster instantly. If failed cause only 1HP of damage.");\r
1549     \r
1550                 if (cast)\r
1551                 {\r
1552                         int y, x;\r
1553 \r
1554                         if (!get_rep_dir2(&dir)) return NULL;\r
1555                         if (dir == 5) return NULL;\r
1556 \r
1557                         y = p_ptr->y + ddy[dir];\r
1558                         x = p_ptr->x + ddx[dir];\r
1559 \r
1560                         if (cave[y][x].m_idx)\r
1561                                 py_attack(y, x, HISSATSU_KYUSHO);\r
1562                         else\r
1563                         {\r
1564                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
1565                                 return NULL;\r
1566                         }\r
1567                 }\r
1568                 break;\r
1569 \r
1570         case 15:\r
1571                 if (name) return _("魔神斬り", "Majingiri");\r
1572                 if (desc) return _("会心の一撃で攻撃する。攻撃がかわされやすい。", \r
1573                         "Attempts to attack with critical hit. But this attack is easy to evade for a monster.");\r
1574     \r
1575                 if (cast)\r
1576                 {\r
1577                         int y, x;\r
1578 \r
1579                         if (!get_rep_dir2(&dir)) return NULL;\r
1580                         if (dir == 5) return NULL;\r
1581 \r
1582                         y = p_ptr->y + ddy[dir];\r
1583                         x = p_ptr->x + ddx[dir];\r
1584 \r
1585                         if (cave[y][x].m_idx)\r
1586                                 py_attack(y, x, HISSATSU_MAJIN);\r
1587                         else\r
1588                         {\r
1589                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
1590                                 return NULL;\r
1591                         }\r
1592                 }\r
1593                 break;\r
1594 \r
1595         case 16:\r
1596                 if (name) return _("捨て身", "Desperate Attack");\r
1597                 if (desc) return _("強力な攻撃を繰り出す。次のターンまでの間、食らうダメージが増える。", \r
1598                         "Attacks with all of your power. But all damages you take will be doubled for one turn.");\r
1599     \r
1600                 if (cast)\r
1601                 {\r
1602                         int y, x;\r
1603 \r
1604                         if (!get_rep_dir2(&dir)) return NULL;\r
1605                         if (dir == 5) return NULL;\r
1606 \r
1607                         y = p_ptr->y + ddy[dir];\r
1608                         x = p_ptr->x + ddx[dir];\r
1609 \r
1610                         if (cave[y][x].m_idx)\r
1611                                 py_attack(y, x, HISSATSU_SUTEMI);\r
1612                         else\r
1613                         {\r
1614                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
1615                                 return NULL;\r
1616                         }\r
1617                         p_ptr->sutemi = TRUE;\r
1618                 }\r
1619                 break;\r
1620 \r
1621         case 17:\r
1622                 if (name) return _("雷撃鷲爪斬", "Lightning Eagle");\r
1623                 if (desc) return _("電撃耐性のないモンスターに非常に大きいダメージを与える。", \r
1624                         "Attacks a monster with more damage unless it has resistance to electricity.");\r
1625     \r
1626                 if (cast)\r
1627                 {\r
1628                         int y, x;\r
1629 \r
1630                         if (!get_rep_dir2(&dir)) return NULL;\r
1631                         if (dir == 5) return NULL;\r
1632 \r
1633                         y = p_ptr->y + ddy[dir];\r
1634                         x = p_ptr->x + ddx[dir];\r
1635 \r
1636                         if (cave[y][x].m_idx)\r
1637                                 py_attack(y, x, HISSATSU_ELEC);\r
1638                         else\r
1639                         {\r
1640                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
1641                                 return NULL;\r
1642                         }\r
1643                 }\r
1644                 break;\r
1645 \r
1646         case 18:\r
1647                 if (name) return _("入身", "Rush Attack");\r
1648                 if (desc) return _("素早く相手に近寄り攻撃する。", "Steps close to a monster and attacks at a time.");\r
1649     \r
1650                 if (cast)\r
1651                 {\r
1652                         if (!rush_attack(NULL)) return NULL;\r
1653                 }\r
1654                 break;\r
1655 \r
1656         case 19:\r
1657                 if (name) return _("赤流渦", "Bloody Maelstrom");\r
1658                 if (desc) return _("自分自身も傷を作りつつ、その傷が深いほど大きい威力で全方向の敵を攻撃できる。生きていないモンスターには効果がない。", \r
1659                         "Attacks all adjacent monsters with power corresponding to your cut status. Then increases your cut status. No effect to unliving monsters.");\r
1660     \r
1661                 if (cast)\r
1662                 {\r
1663                         int y = 0, x = 0;\r
1664 \r
1665                         cave_type       *c_ptr;\r
1666                         monster_type    *m_ptr;\r
1667         \r
1668                         if (p_ptr->cut < 300)\r
1669                                 set_cut(p_ptr->cut + 300);\r
1670                         else\r
1671                                 set_cut(p_ptr->cut * 2);\r
1672         \r
1673                         for (dir = 0; dir < 8; dir++)\r
1674                         {\r
1675                                 y = p_ptr->y + ddy_ddd[dir];\r
1676                                 x = p_ptr->x + ddx_ddd[dir];\r
1677                                 c_ptr = &cave[y][x];\r
1678         \r
1679                                 /* Get the monster */\r
1680                                 m_ptr = &m_list[c_ptr->m_idx];\r
1681         \r
1682                                 /* Hack -- attack monsters */\r
1683                                 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))\r
1684                                 {\r
1685                                         if (!monster_living(&r_info[m_ptr->r_idx]))\r
1686                                         {\r
1687                                                 char m_name[80];\r
1688         \r
1689                                                 monster_desc(m_name, m_ptr, 0);\r
1690                                                 msg_format(_("%sには効果がない!", "%s is unharmed!"), m_name);\r
1691                                         }\r
1692                                         else py_attack(y, x, HISSATSU_SEKIRYUKA);\r
1693                                 }\r
1694                         }\r
1695                 }\r
1696                 break;\r
1697 \r
1698         case 20:\r
1699                 if (name) return _("激震撃", "Earthquake Blow");\r
1700                 if (desc) return _("地震を起こす。", "Shakes dungeon structure, and results in random swapping of floors and walls.");\r
1701     \r
1702                 if (cast)\r
1703                 {\r
1704                         int y,x;\r
1705 \r
1706                         if (!get_rep_dir2(&dir)) return NULL;\r
1707                         if (dir == 5) return NULL;\r
1708 \r
1709                         y = p_ptr->y + ddy[dir];\r
1710                         x = p_ptr->x + ddx[dir];\r
1711 \r
1712                         if (cave[y][x].m_idx)\r
1713                                 py_attack(y, x, HISSATSU_QUAKE);\r
1714                         else\r
1715                                 earthquake(p_ptr->y, p_ptr->x, 10);\r
1716                 }\r
1717                 break;\r
1718 \r
1719         case 21:\r
1720                 if (name) return _("地走り", "Crack");\r
1721                 if (desc) return _("衝撃波のビームを放つ。", "Fires a beam of shock wave.");\r
1722     \r
1723                 if (cast)\r
1724                 {\r
1725                         int total_damage = 0, basedam, i;\r
1726                         u32b flgs[TR_FLAG_SIZE];\r
1727                         object_type *o_ptr;\r
1728                         if (!get_aim_dir(&dir)) return NULL;\r
1729                         msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));\r
1730                         for (i = 0; i < 2; i++)\r
1731                         {\r
1732                                 int damage;\r
1733         \r
1734                                 if (!buki_motteruka(INVEN_RARM+i)) break;\r
1735                                 o_ptr = &inventory[INVEN_RARM+i];\r
1736                                 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;\r
1737                                 damage = o_ptr->to_d * 100;\r
1738                                 object_flags(o_ptr, flgs);\r
1739                                 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))\r
1740                                 {\r
1741                                         /* vorpal blade */\r
1742                                         basedam *= 5;\r
1743                                         basedam /= 3;\r
1744                                 }\r
1745                                 else if (have_flag(flgs, TR_VORPAL))\r
1746                                 {\r
1747                                         /* vorpal flag only */\r
1748                                         basedam *= 11;\r
1749                                         basedam /= 9;\r
1750                                 }\r
1751                                 damage += basedam;\r
1752                                 damage *= p_ptr->num_blow[i];\r
1753                                 total_damage += damage / 200;\r
1754                                 if (i) total_damage = total_damage*7/10;\r
1755                         }\r
1756                         fire_beam(GF_FORCE, dir, total_damage);\r
1757                 }\r
1758                 break;\r
1759 \r
1760         case 22:\r
1761                 if (name) return _("気迫の雄叫び", "War Cry");\r
1762                 if (desc) return _("視界内の全モンスターに対して轟音の攻撃を行う。さらに、近くにいるモンスターを怒らせる。", \r
1763                         "Damages all monsters in sight with sound. Aggravate nearby monsters.");\r
1764     \r
1765                 if (cast)\r
1766                 {\r
1767                         msg_print(_("雄叫びをあげた!", "You roar out!"));\r
1768                         project_hack(GF_SOUND, randint1(plev * 3));\r
1769                         aggravate_monsters(0);\r
1770                 }\r
1771                 break;\r
1772 \r
1773         case 23:\r
1774                 if (name) return _("無双三段", "Musou-Sandan");\r
1775                 if (desc) return _("強力な3段攻撃を繰り出す。", "Attacks with powerful 3 strikes.");\r
1776     \r
1777                 if (cast)\r
1778                 {\r
1779                         int i;\r
1780 \r
1781                         if (!get_rep_dir2(&dir)) return NULL;\r
1782                         if (dir == 5) return NULL;\r
1783 \r
1784                         for (i = 0; i < 3; i++)\r
1785                         {\r
1786                                 POSITION y, x;\r
1787                                 POSITION ny, nx;\r
1788                                 MONSTER_IDX m_idx;\r
1789                                 cave_type *c_ptr;\r
1790                                 monster_type *m_ptr;\r
1791         \r
1792                                 y = p_ptr->y + ddy[dir];\r
1793                                 x = p_ptr->x + ddx[dir];\r
1794                                 c_ptr = &cave[y][x];\r
1795         \r
1796                                 if (c_ptr->m_idx)\r
1797                                         py_attack(y, x, HISSATSU_3DAN);\r
1798                                 else\r
1799                                 {\r
1800                                         msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
1801                                         return NULL;\r
1802                                 }\r
1803         \r
1804                                 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)\r
1805                                 {\r
1806                                         return "";\r
1807                                 }\r
1808         \r
1809                                 /* Monster is dead? */\r
1810                                 if (!c_ptr->m_idx) break;\r
1811         \r
1812                                 ny = y + ddy[dir];\r
1813                                 nx = x + ddx[dir];\r
1814                                 m_idx = c_ptr->m_idx;\r
1815                                 m_ptr = &m_list[m_idx];\r
1816         \r
1817                                 /* Monster cannot move back? */\r
1818                                 if (!monster_can_enter(ny, nx, &r_info[m_ptr->r_idx], 0))\r
1819                                 {\r
1820                                         /* -more- */\r
1821                                         if (i < 2) msg_print(NULL);\r
1822                                         continue;\r
1823                                 }\r
1824         \r
1825                                 c_ptr->m_idx = 0;\r
1826                                 cave[ny][nx].m_idx = m_idx;\r
1827                                 m_ptr->fy = ny;\r
1828                                 m_ptr->fx = nx;\r
1829         \r
1830                                 update_mon(m_idx, TRUE);\r
1831         \r
1832                                 /* Redraw the old spot */\r
1833                                 lite_spot(y, x);\r
1834         \r
1835                                 /* Redraw the new spot */\r
1836                                 lite_spot(ny, nx);\r
1837         \r
1838                                 /* Player can move forward? */\r
1839                                 if (player_can_enter(c_ptr->feat, 0))\r
1840                                 {\r
1841                                         /* Move the player */\r
1842                                         if (!move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP)) break;\r
1843                                 }\r
1844                                 else\r
1845                                 {\r
1846                                         break;\r
1847                                 }\r
1848 \r
1849                                 /* -more- */\r
1850                                 if (i < 2) msg_print(NULL);\r
1851                         }\r
1852                 }\r
1853                 break;\r
1854 \r
1855         case 24:\r
1856                 if (name) return _("吸血鬼の牙", "Vampire's Fang");\r
1857                 if (desc) return _("攻撃した相手の体力を吸いとり、自分の体力を回復させる。生命を持たないモンスターには通じない。", \r
1858                         "Attacks with vampiric strikes which absorbs HP from a monster and gives them to you. No effect to unliving monsters.");\r
1859     \r
1860                 if (cast)\r
1861                 {\r
1862                         int y, x;\r
1863 \r
1864                         if (!get_rep_dir2(&dir)) return NULL;\r
1865                         if (dir == 5) return NULL;\r
1866 \r
1867                         y = p_ptr->y + ddy[dir];\r
1868                         x = p_ptr->x + ddx[dir];\r
1869 \r
1870                         if (cave[y][x].m_idx)\r
1871                                 py_attack(y, x, HISSATSU_DRAIN);\r
1872                         else\r
1873                         {\r
1874                                         msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
1875                                 return NULL;\r
1876                         }\r
1877                 }\r
1878                 break;\r
1879 \r
1880         case 25:\r
1881                 if (name) return _("幻惑", "Moon Dazzling");\r
1882                 if (desc) return _("視界内の起きている全モンスターに朦朧、混乱、眠りを与えようとする。", "Attempts to stun, confuse and sleep all waking monsters.");\r
1883     \r
1884                 if (cast)\r
1885                 {\r
1886                         msg_print(_("武器を不規則に揺らした...", "You irregularly wave your weapon..."));\r
1887                         project_hack(GF_ENGETSU, plev * 4);\r
1888                         project_hack(GF_ENGETSU, plev * 4);\r
1889                         project_hack(GF_ENGETSU, plev * 4);\r
1890                 }\r
1891                 break;\r
1892 \r
1893         case 26:\r
1894                 if (name) return _("百人斬り", "Hundred Slaughter");\r
1895                 if (desc) return _("連続して入身でモンスターを攻撃する。攻撃するたびにMPを消費。MPがなくなるか、モンスターを倒せなかったら百人斬りは終了する。", \r
1896                         "Performs a series of rush attacks. The series continues while killing each monster in a time and SP remains.");\r
1897     \r
1898                 if (cast)\r
1899                 {\r
1900                         const int mana_cost_per_monster = 8;\r
1901                         bool is_new = TRUE;\r
1902                         bool mdeath;\r
1903 \r
1904                         do\r
1905                         {\r
1906                                 if (!rush_attack(&mdeath)) break;\r
1907                                 if (is_new)\r
1908                                 {\r
1909                                         /* Reserve needed mana point */\r
1910                                         p_ptr->csp -= technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;\r
1911                                         is_new = FALSE;\r
1912                                 }\r
1913                                 else\r
1914                                         p_ptr->csp -= mana_cost_per_monster;\r
1915 \r
1916                                 if (!mdeath) break;\r
1917                                 command_dir = 0;\r
1918 \r
1919                                 p_ptr->redraw |= PR_MANA;\r
1920                                 handle_stuff();\r
1921                         }\r
1922                         while (p_ptr->csp > mana_cost_per_monster);\r
1923 \r
1924                         if (is_new) return NULL;\r
1925         \r
1926                         /* Restore reserved mana */\r
1927                         p_ptr->csp += technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;\r
1928                 }\r
1929                 break;\r
1930 \r
1931         case 27:\r
1932                 if (name) return _("天翔龍閃", "Dragonic Flash");\r
1933                 if (desc) return _("視界内の場所を指定して、その場所と自分の間にいる全モンスターを攻撃し、その場所に移動する。", \r
1934                         "Runs toward given location while attacking all monsters on the path.");\r
1935     \r
1936                 if (cast)\r
1937                 {\r
1938                         POSITION y, x;\r
1939 \r
1940                         if (!tgt_pt(&x, &y)) return NULL;\r
1941 \r
1942                         if (!cave_player_teleportable_bold(y, x, 0L) ||\r
1943                             (distance(y, x, p_ptr->y, p_ptr->x) > MAX_SIGHT / 2) ||\r
1944                             !projectable(p_ptr->y, p_ptr->x, y, x))\r
1945                         {\r
1946                                 msg_print(_("失敗!", "You cannot move to that place!"));\r
1947                                 break;\r
1948                         }\r
1949                         if (p_ptr->anti_tele)\r
1950                         {\r
1951                                 msg_print(_("不思議な力がテレポートを防いだ!", "A mysterious force prevents you from teleporting!"));\r
1952                                 break;\r
1953                         }\r
1954                         project(0, 0, y, x, HISSATSU_ISSEN, GF_ATTACK, PROJECT_BEAM | PROJECT_KILL, -1);\r
1955                         teleport_player_to(y, x, 0L);\r
1956                 }\r
1957                 break;\r
1958 \r
1959         case 28:\r
1960                 if (name) return _("二重の剣撃", "Twin Slash");\r
1961                 if (desc) return _("1ターンで2度攻撃を行う。", "double attacks at a time.");\r
1962     \r
1963                 if (cast)\r
1964                 {\r
1965                         int x, y;\r
1966         \r
1967                         if (!get_rep_dir(&dir, FALSE)) return NULL;\r
1968 \r
1969                         y = p_ptr->y + ddy[dir];\r
1970                         x = p_ptr->x + ddx[dir];\r
1971 \r
1972                         if (cave[y][x].m_idx)\r
1973                         {\r
1974                                 py_attack(y, x, 0);\r
1975                                 if (cave[y][x].m_idx)\r
1976                                 {\r
1977                                         handle_stuff();\r
1978                                         py_attack(y, x, 0);\r
1979                                 }\r
1980                         }\r
1981                         else\r
1982                         {\r
1983                                 msg_print(_("その方向にはモンスターはいません。", "You don't see any monster in this direction"));\r
1984                                 return NULL;\r
1985                         }\r
1986                 }\r
1987                 break;\r
1988 \r
1989         case 29:\r
1990                 if (name) return _("虎伏絶刀勢", "Kofuku-Zettousei");\r
1991                 if (desc) return _("強力な攻撃を行い、近くの場所にも効果が及ぶ。", "Performs a powerful attack which even effect nearby monsters.");\r
1992     \r
1993                 if (cast)\r
1994                 {\r
1995                         int total_damage = 0, basedam, i;\r
1996                         int y, x;\r
1997                         u32b flgs[TR_FLAG_SIZE];\r
1998                         object_type *o_ptr;\r
1999         \r
2000                         if (!get_rep_dir2(&dir)) return NULL;\r
2001                         if (dir == 5) return NULL;\r
2002 \r
2003                         y = p_ptr->y + ddy[dir];\r
2004                         x = p_ptr->x + ddx[dir];\r
2005 \r
2006                         if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)\r
2007                         {\r
2008                                 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));\r
2009                                 return "";\r
2010                         }\r
2011                         msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));\r
2012                         for (i = 0; i < 2; i++)\r
2013                         {\r
2014                                 int damage;\r
2015                                 if (!buki_motteruka(INVEN_RARM+i)) break;\r
2016                                 o_ptr = &inventory[INVEN_RARM+i];\r
2017                                 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;\r
2018                                 damage = o_ptr->to_d * 100;\r
2019                                 object_flags(o_ptr, flgs);\r
2020                                 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))\r
2021                                 {\r
2022                                         /* vorpal blade */\r
2023                                         basedam *= 5;\r
2024                                         basedam /= 3;\r
2025                                 }\r
2026                                 else if (have_flag(flgs, TR_VORPAL))\r
2027                                 {\r
2028                                         /* vorpal flag only */\r
2029                                         basedam *= 11;\r
2030                                         basedam /= 9;\r
2031                                 }\r
2032                                 damage += basedam;\r
2033                                 damage += p_ptr->to_d[i] * 100;\r
2034                                 damage *= p_ptr->num_blow[i];\r
2035                                 total_damage += (damage / 100);\r
2036                         }\r
2037                         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
2038                 }\r
2039                 break;\r
2040 \r
2041         case 30:\r
2042                 if (name) return _("慶雲鬼忍剣", "Keiun-Kininken");\r
2043                 if (desc) return _("自分もダメージをくらうが、相手に非常に大きなダメージを与える。アンデッドには特に効果がある。", \r
2044                         "Attacks a monster with extremely powerful damage. But you also takes some damages. Hurts a undead monster greatly.");\r
2045     \r
2046                 if (cast)\r
2047                 {\r
2048                         int y, x;\r
2049 \r
2050                         if (!get_rep_dir2(&dir)) return NULL;\r
2051                         if (dir == 5) return NULL;\r
2052 \r
2053                         y = p_ptr->y + ddy[dir];\r
2054                         x = p_ptr->x + ddx[dir];\r
2055 \r
2056                         if (cave[y][x].m_idx)\r
2057                                 py_attack(y, x, HISSATSU_UNDEAD);\r
2058                         else\r
2059                         {\r
2060                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
2061                                 return NULL;\r
2062                         }\r
2063                         take_hit(DAMAGE_NOESCAPE, 100 + randint1(100), _("慶雲鬼忍剣を使った衝撃", "exhaustion on using Keiun-Kininken"), -1);\r
2064                 }\r
2065                 break;\r
2066 \r
2067         case 31:\r
2068                 if (name) return _("切腹", "Harakiri");\r
2069                 if (desc) return _("「武士道とは、死ぬことと見つけたり。」", "'Busido is found in death'");\r
2070 \r
2071                 if (cast)\r
2072                 {\r
2073                         int i;\r
2074                         if (!get_check(_("本当に自殺しますか?", "Do you really want to commit suicide? "))) return NULL;\r
2075                                 /* Special Verification for suicide */\r
2076                         prt(_("確認のため '@' を押して下さい。", "Please verify SUICIDE by typing the '@' sign: "), 0, 0);\r
2077         \r
2078                         flush();\r
2079                         i = inkey();\r
2080                         prt("", 0, 0);\r
2081                         if (i != '@') return NULL;\r
2082                         if (p_ptr->total_winner)\r
2083                         {\r
2084                                 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);\r
2085                                 p_ptr->total_winner = TRUE;\r
2086                         }\r
2087                         else\r
2088                         {\r
2089                                 msg_print(_("武士道とは、死ぬことと見つけたり。", "Meaning of Bushi-do is found in the death."));\r
2090                                 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);\r
2091                         }\r
2092                 }\r
2093                 break;\r
2094         }\r
2095 \r
2096         return "";\r
2097 }\r
2098 \r
2099 /*!\r
2100  * @brief 呪術領域の武器呪縛の対象にできる武器かどうかを返す。 / An "item_tester_hook" for offer\r
2101  * @param o_ptr オブジェクト構造体の参照ポインタ\r
2102  * @return 呪縛可能な武器ならばTRUEを返す\r
2103  */\r
2104 static bool item_tester_hook_weapon_except_bow(object_type *o_ptr)\r
2105 {\r
2106         switch (o_ptr->tval)\r
2107         {\r
2108                 case TV_SWORD:\r
2109                 case TV_HAFTED:\r
2110                 case TV_POLEARM:\r
2111                 case TV_DIGGING:\r
2112                 {\r
2113                         return (TRUE);\r
2114                 }\r
2115         }\r
2116 \r
2117         return (FALSE);\r
2118 }\r
2119 \r
2120 /*!\r
2121  * @brief 呪術領域の各処理に使える呪われた装備かどうかを返す。 / An "item_tester_hook" for offer\r
2122  * @param o_ptr オブジェクト構造体の参照ポインタ\r
2123  * @return 使える装備ならばTRUEを返す\r
2124  */\r
2125 static bool item_tester_hook_cursed(object_type *o_ptr)\r
2126 {\r
2127         return (bool)(object_is_cursed(o_ptr));\r
2128 }\r
2129 \r
2130 /*!\r
2131  * @brief 呪術領域魔法の各処理を行う\r
2132  * @param spell 魔法ID\r
2133  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_CONT / SPELL_STOP)\r
2134  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。\r
2135  */\r
2136 static cptr do_hex_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
2137 {\r
2138         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
2139         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
2140         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
2141         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
2142         bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;\r
2143         bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;\r
2144 \r
2145         bool add = TRUE;\r
2146 \r
2147         PLAYER_LEVEL plev = p_ptr->lev;\r
2148         HIT_POINT power;\r
2149 \r
2150         switch (spell)\r
2151         {\r
2152         /*** 1st book (0-7) ***/\r
2153         case 0:\r
2154                 if (name) return _("邪なる祝福", "Evily blessing");\r
2155                 if (desc) return _("祝福により攻撃精度と防御力が上がる。", "Attempts to increase +to_hit of a weapon and AC");\r
2156                 if (cast)\r
2157                 {\r
2158                         if (!p_ptr->blessed)\r
2159                         {\r
2160                                 msg_print(_("高潔な気分になった!", "You feel righteous!"));\r
2161                         }\r
2162                 }\r
2163                 if (stop)\r
2164                 {\r
2165                         if (!p_ptr->blessed)\r
2166                         {\r
2167                                 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));\r
2168                         }\r
2169                 }\r
2170                 break;\r
2171 \r
2172         case 1:\r
2173                 if (name) return _("軽傷の治癒", "Cure light wounds");\r
2174                 if (desc) return _("HPや傷を少し回復させる。", "Heals cut and HP a little.");\r
2175                 if (info) return info_heal(1, 10, 0);\r
2176                 if (cast)\r
2177                 {\r
2178                         msg_print(_("気分が良くなってくる。", "You feel better and better."));\r
2179                 }\r
2180                 if (cast || cont)\r
2181                 {\r
2182                         hp_player(damroll(1, 10));\r
2183                         set_cut(p_ptr->cut - 10);\r
2184                 }\r
2185                 break;\r
2186 \r
2187         case 2:\r
2188                 if (name) return _("悪魔のオーラ", "Demonic aura");\r
2189                 if (desc) return _("炎のオーラを身にまとい、回復速度が速くなる。", "Gives fire aura and regeneration.");\r
2190                 if (cast)\r
2191                 {\r
2192                         msg_print(_("体が炎のオーラで覆われた。", "You have enveloped by fiery aura!"));\r
2193                 }\r
2194                 if (stop)\r
2195                 {\r
2196                         msg_print(_("炎のオーラが消え去った。", "Fiery aura disappeared."));\r
2197                 }\r
2198                 break;\r
2199 \r
2200         case 3:\r
2201                 if (name) return _("悪臭霧", "Stinking mist");\r
2202                 if (desc) return _("視界内のモンスターに微弱量の毒のダメージを与える。", "Deals few damages of poison to all monsters in your sight.");\r
2203                 power = plev / 2 + 5;\r
2204                 if (info) return info_damage(1, power, 0);\r
2205                 if (cast || cont)\r
2206                 {\r
2207                         project_hack(GF_POIS, randint1(power));\r
2208                 }\r
2209                 break;\r
2210 \r
2211         case 4:\r
2212                 if (name) return _("腕力強化", "Extra might");\r
2213                 if (desc) return _("術者の腕力を上昇させる。", "Attempts to increase your strength.");\r
2214                 if (cast)\r
2215                 {\r
2216                         msg_print(_("何だか力が湧いて来る。", "You feel you get stronger."));\r
2217                 }\r
2218                 break;\r
2219 \r
2220         case 5:\r
2221                 if (name) return _("武器呪縛", "Curse weapon");\r
2222                 if (desc) return _("装備している武器を呪う。", "Curses your weapon.");\r
2223                 if (cast)\r
2224                 {\r
2225                         OBJECT_IDX item;\r
2226                         cptr q, s;\r
2227                         char o_name[MAX_NLEN];\r
2228                         object_type *o_ptr;\r
2229                         u32b f[TR_FLAG_SIZE];\r
2230 \r
2231                         item_tester_hook = item_tester_hook_weapon_except_bow;\r
2232                         q = _("どれを呪いますか?", "Which weapon do you curse?");\r
2233                         s = _("武器を装備していない。", "You wield no weapons.");\r
2234 \r
2235                         if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;\r
2236 \r
2237                         o_ptr = &inventory[item];\r
2238                         object_desc(o_name, o_ptr, OD_NAME_ONLY);\r
2239                         object_flags(o_ptr, f);\r
2240 \r
2241                         if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;\r
2242 \r
2243                         if (!one_in_(3) &&\r
2244                                 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))\r
2245                         {\r
2246                                 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);\r
2247                                 if (one_in_(3))\r
2248                                 {\r
2249                                         if (o_ptr->to_d > 0)\r
2250                                         {\r
2251                                                 o_ptr->to_d -= randint1(3) % 2;\r
2252                                                 if (o_ptr->to_d < 0) o_ptr->to_d = 0;\r
2253                                         }\r
2254                                         if (o_ptr->to_h > 0)\r
2255                                         {\r
2256                                                 o_ptr->to_h -= randint1(3) % 2;\r
2257                                                 if (o_ptr->to_h < 0) o_ptr->to_h = 0;\r
2258                                         }\r
2259                                         if (o_ptr->to_a > 0)\r
2260                                         {\r
2261                                                 o_ptr->to_a -= randint1(3) % 2;\r
2262                                                 if (o_ptr->to_a < 0) o_ptr->to_a = 0;\r
2263                                         }\r
2264                                         msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);\r
2265                                 }\r
2266                         }\r
2267                         else\r
2268                         {\r
2269                                 int curse_rank = 0;\r
2270                                 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);\r
2271                                 o_ptr->curse_flags |= (TRC_CURSED);\r
2272 \r
2273                                 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))\r
2274                                 {\r
2275 \r
2276                                         if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);\r
2277                                         if (one_in_(666))\r
2278                                         {\r
2279                                                 o_ptr->curse_flags |= (TRC_TY_CURSE);\r
2280                                                 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);\r
2281 \r
2282                                                 add_flag(o_ptr->art_flags, TR_AGGRAVATE);\r
2283                                                 add_flag(o_ptr->art_flags, TR_VORPAL);\r
2284                                                 add_flag(o_ptr->art_flags, TR_VAMPIRIC);\r
2285                                                 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));\r
2286                                                 curse_rank = 2;\r
2287                                         }\r
2288                                 }\r
2289 \r
2290                                 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);\r
2291                         }\r
2292 \r
2293                         p_ptr->update |= (PU_BONUS);\r
2294                         add = FALSE;\r
2295                 }\r
2296                 break;\r
2297 \r
2298         case 6:\r
2299                 if (name) return _("邪悪感知", "Evil detection");\r
2300                 if (desc) return _("周囲の邪悪なモンスターを感知する。", "Detects evil monsters.");\r
2301                 if (info) return info_range(MAX_SIGHT);\r
2302                 if (cast)\r
2303                 {\r
2304                         msg_print(_("邪悪な生物の存在を感じ取ろうとした。", "You attend to the presence of evil creatures."));\r
2305                 }\r
2306                 break;\r
2307 \r
2308         case 7:\r
2309                 if (name) return _("我慢", "Patience");\r
2310                 if (desc) return _("数ターン攻撃を耐えた後、受けたダメージを地獄の業火として周囲に放出する。", \r
2311                         "Bursts hell fire strongly after patients any damage while few turns.");\r
2312                 power = MIN(200, (HEX_REVENGE_POWER(p_ptr) * 2));\r
2313                 if (info) return info_damage(0, 0, power);\r
2314                 if (cast)\r
2315                 {\r
2316                         int a = 3 - (p_ptr->pspeed - 100) / 10;\r
2317                         MAGIC_NUM2 r = 3 + randint1(3) + MAX(0, MIN(3, a));\r
2318 \r
2319                         if (HEX_REVENGE_TURN(p_ptr) > 0)\r
2320                         {\r
2321                                 msg_print(_("すでに我慢をしている。", "You are already patienting."));\r
2322                                 return NULL;\r
2323                         }\r
2324 \r
2325                         HEX_REVENGE_TYPE(p_ptr) = 1;\r
2326                         HEX_REVENGE_TURN(p_ptr) = r;\r
2327                         HEX_REVENGE_POWER(p_ptr) = 0;\r
2328                         msg_print(_("じっと耐えることにした。", "You decide to patient all damages."));\r
2329                         add = FALSE;\r
2330                 }\r
2331                 if (cont)\r
2332                 {\r
2333                         int rad = 2 + (power / 50);\r
2334 \r
2335                         HEX_REVENGE_TURN(p_ptr)--;\r
2336 \r
2337                         if ((HEX_REVENGE_TURN(p_ptr) <= 0) || (power >= 200))\r
2338                         {\r
2339                                 msg_print(_("我慢が解かれた!", "Time for end of patioence!"));\r
2340                                 if (power)\r
2341                                 {\r
2342                                         project(0, rad, p_ptr->y, p_ptr->x, power, GF_HELL_FIRE,\r
2343                                                 (PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);\r
2344                                 }\r
2345                                 if (p_ptr->wizard)\r
2346                                 {\r
2347                                         msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);\r
2348                                 }\r
2349 \r
2350                                 /* Reset */\r
2351                                 HEX_REVENGE_TYPE(p_ptr) = 0;\r
2352                                 HEX_REVENGE_TURN(p_ptr) = 0;\r
2353                                 HEX_REVENGE_POWER(p_ptr) = 0;\r
2354                         }\r
2355                 }\r
2356                 break;\r
2357 \r
2358         /*** 2nd book (8-15) ***/\r
2359         case 8:\r
2360                 if (name) return _("氷の鎧", "Ice armor");\r
2361                 if (desc) return _("氷のオーラを身にまとい、防御力が上昇する。", "Gives fire aura and bonus to AC.");\r
2362                 if (cast)\r
2363                 {\r
2364                         msg_print(_("体が氷の鎧で覆われた。", "You have enveloped by ice armor!"));\r
2365                 }\r
2366                 if (stop)\r
2367                 {\r
2368                         msg_print(_("氷の鎧が消え去った。", "Ice armor disappeared."));\r
2369                 }\r
2370                 break;\r
2371 \r
2372         case 9:\r
2373                 if (name) return _("重傷の治癒", "Cure serious wounds");\r
2374                 if (desc) return _("体力や傷を多少回復させる。", "Heals cut and HP more.");\r
2375                 if (info) return info_heal(2, 10, 0);\r
2376                 if (cast)\r
2377                 {\r
2378                         msg_print(_("気分が良くなってくる。", "You feel better and better."));\r
2379                 }\r
2380                 if (cast || cont)\r
2381                 {\r
2382                         hp_player(damroll(2, 10));\r
2383                         set_cut((p_ptr->cut / 2) - 10);\r
2384                 }\r
2385                 break;\r
2386 \r
2387         case 10:\r
2388                 if (name) return _("薬品吸入", "Inhail potion");\r
2389                 if (desc) return _("呪文詠唱を中止することなく、薬の効果を得ることができる。", "Quaffs a potion without canceling of casting a spell.");\r
2390                 if (cast)\r
2391                 {\r
2392                         CASTING_HEX_FLAGS(p_ptr) |= (1L << HEX_INHAIL);\r
2393                         do_cmd_quaff_potion();\r
2394                         CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_INHAIL);\r
2395                         add = FALSE;\r
2396                 }\r
2397                 break;\r
2398 \r
2399         case 11:\r
2400                 if (name) return _("衰弱の霧", "Hypodynamic mist");\r
2401                 if (desc) return _("視界内のモンスターに微弱量の衰弱属性のダメージを与える。", \r
2402                         "Deals few damages of hypodynamia to all monsters in your sight.");\r
2403                 power = (plev / 2) + 5;\r
2404                 if (info) return info_damage(1, power, 0);\r
2405                 if (cast || cont)\r
2406                 {\r
2407                         project_hack(GF_HYPODYNAMIA, randint1(power));\r
2408                 }\r
2409                 break;\r
2410 \r
2411         case 12:\r
2412                 if (name) return _("魔剣化", "Swords to runeswords");\r
2413                 if (desc) return _("武器の攻撃力を上げる。切れ味を得、呪いに応じて与えるダメージが上昇し、善良なモンスターに対するダメージが2倍になる。", \r
2414                         "Gives vorpal ability to your weapon. Increases damages by your weapon acccording to curse of your weapon.");\r
2415                 if (cast)\r
2416                 {\r
2417 #ifdef JP\r
2418                         msg_print("あなたの武器が黒く輝いた。");\r
2419 #else\r
2420                         if (!empty_hands(FALSE))\r
2421                                 msg_print("Your weapons glow bright black.");\r
2422                         else\r
2423                                 msg_print("Your weapon glows bright black.");\r
2424 #endif\r
2425                 }\r
2426                 if (stop)\r
2427                 {\r
2428 #ifdef JP\r
2429                         msg_print("武器の輝きが消え去った。");\r
2430 #else\r
2431                         msg_format("Brightness of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");\r
2432 #endif\r
2433                 }\r
2434                 break;\r
2435 \r
2436         case 13:\r
2437                 if (name) return _("混乱の手", "Touch of confusion");\r
2438                 if (desc) return _("攻撃した際モンスターを混乱させる。", "Confuses a monster when you attack.");\r
2439                 if (cast)\r
2440                 {\r
2441                         msg_print(_("あなたの手が赤く輝き始めた。", "Your hands glow bright red."));\r
2442                 }\r
2443                 if (stop)\r
2444                 {\r
2445                         msg_print(_("手の輝きがなくなった。", "Brightness on your hands disappeard."));\r
2446                 }\r
2447                 break;\r
2448 \r
2449         case 14:\r
2450                 if (name) return _("肉体強化", "Building up");\r
2451                 if (desc) return _("術者の腕力、器用さ、耐久力を上昇させる。攻撃回数の上限を 1 増加させる。", \r
2452                         "Attempts to increases your strength, dexterity and constitusion.");\r
2453                 if (cast)\r
2454                 {\r
2455                         msg_print(_("身体が強くなった気がした。", "You feel your body is developed more now."));\r
2456                 }\r
2457                 break;\r
2458 \r
2459         case 15:\r
2460                 if (name) return _("反テレポート結界", "Anti teleport barrier");\r
2461                 if (desc) return _("視界内のモンスターのテレポートを阻害するバリアを張る。", "Obstructs all teleportations by monsters in your sight.");\r
2462                 power = plev * 3 / 2;\r
2463                 if (info) return info_power(power);\r
2464                 if (cast)\r
2465                 {\r
2466                         msg_print(_("テレポートを防ぐ呪いをかけた。", "You feel anyone can not teleport except you."));\r
2467                 }\r
2468                 break;\r
2469 \r
2470         /*** 3rd book (16-23) ***/\r
2471         case 16:\r
2472                 if (name) return _("衝撃のクローク", "Cloak of shock");\r
2473                 if (desc) return _("電気のオーラを身にまとい、動きが速くなる。", "Gives lightning aura and a bonus to speed.");\r
2474                 if (cast)\r
2475                 {\r
2476                         msg_print(_("体が稲妻のオーラで覆われた。", "You have enveloped by electrical aura!"));\r
2477                 }\r
2478                 if (stop)\r
2479                 {\r
2480                         msg_print(_("稲妻のオーラが消え去った。", "Electrical aura disappeared."));\r
2481                 }\r
2482                 break;\r
2483 \r
2484         case 17:\r
2485                 if (name) return _("致命傷の治癒", "Cure critical wounds");\r
2486                 if (desc) return _("体力や傷を回復させる。", "Heals cut and HP greatry.");\r
2487                 if (info) return info_heal(4, 10, 0);\r
2488                 if (cast)\r
2489                 {\r
2490                         msg_print(_("気分が良くなってくる。", "You feel better and better."));\r
2491                 }\r
2492                 if (cast || cont)\r
2493                 {\r
2494                         hp_player(damroll(4, 10));\r
2495                         set_stun(0);\r
2496                         set_cut(0);\r
2497                         set_poisoned(0);\r
2498                 }\r
2499                 break;\r
2500 \r
2501         case 18:\r
2502                 if (name) return _("呪力封入", "Recharging");\r
2503                 if (desc) return _("魔法の道具に魔力を再充填する。", "Recharges a magic device.");\r
2504                 power = plev * 2;\r
2505                 if (info) return info_power(power);\r
2506                 if (cast)\r
2507                 {\r
2508                         if (!recharge(power)) return NULL;\r
2509                         add = FALSE;\r
2510                 }\r
2511                 break;\r
2512 \r
2513         case 19:\r
2514                 if (name) return _("死者復活", "Animate Dead");\r
2515                 if (desc) return _("死体を蘇らせてペットにする。", "Raises corpses and skeletons from dead.");\r
2516                 if (cast)\r
2517                 {\r
2518                         msg_print(_("死者への呼びかけを始めた。", "You start to call deads.!"));\r
2519                 }\r
2520                 if (cast || cont)\r
2521                 {\r
2522                         animate_dead(0, p_ptr->y, p_ptr->x);\r
2523                 }\r
2524                 break;\r
2525 \r
2526         case 20:\r
2527                 if (name) return _("防具呪縛", "Curse armor");\r
2528                 if (desc) return _("装備している防具に呪いをかける。", "Curse a piece of armour that you wielding.");\r
2529                 if (cast)\r
2530                 {\r
2531                         OBJECT_IDX item;\r
2532                         cptr q, s;\r
2533                         char o_name[MAX_NLEN];\r
2534                         object_type *o_ptr;\r
2535                         u32b f[TR_FLAG_SIZE];\r
2536 \r
2537                         item_tester_hook = object_is_armour;\r
2538                         q = _("どれを呪いますか?", "Which piece of armour do you curse?");\r
2539                         s = _("防具を装備していない。", "You wield no piece of armours.");\r
2540 \r
2541                         if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;\r
2542 \r
2543                         o_ptr = &inventory[item];\r
2544                         object_desc(o_name, o_ptr, OD_NAME_ONLY);\r
2545                         object_flags(o_ptr, f);\r
2546 \r
2547                         if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;\r
2548 \r
2549                         if (!one_in_(3) &&\r
2550                                 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))\r
2551                         {\r
2552                                 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);\r
2553                                 if (one_in_(3))\r
2554                                 {\r
2555                                         if (o_ptr->to_d > 0)\r
2556                                         {\r
2557                                                 o_ptr->to_d -= randint1(3) % 2;\r
2558                                                 if (o_ptr->to_d < 0) o_ptr->to_d = 0;\r
2559                                         }\r
2560                                         if (o_ptr->to_h > 0)\r
2561                                         {\r
2562                                                 o_ptr->to_h -= randint1(3) % 2;\r
2563                                                 if (o_ptr->to_h < 0) o_ptr->to_h = 0;\r
2564                                         }\r
2565                                         if (o_ptr->to_a > 0)\r
2566                                         {\r
2567                                                 o_ptr->to_a -= randint1(3) % 2;\r
2568                                                 if (o_ptr->to_a < 0) o_ptr->to_a = 0;\r
2569                                         }\r
2570                                         msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);\r
2571                                 }\r
2572                         }\r
2573                         else\r
2574                         {\r
2575                                 int curse_rank = 0;\r
2576                                 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);\r
2577                                 o_ptr->curse_flags |= (TRC_CURSED);\r
2578 \r
2579                                 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))\r
2580                                 {\r
2581 \r
2582                                         if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);\r
2583                                         if (one_in_(666))\r
2584                                         {\r
2585                                                 o_ptr->curse_flags |= (TRC_TY_CURSE);\r
2586                                                 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);\r
2587 \r
2588                                                 add_flag(o_ptr->art_flags, TR_AGGRAVATE);\r
2589                                                 add_flag(o_ptr->art_flags, TR_RES_POIS);\r
2590                                                 add_flag(o_ptr->art_flags, TR_RES_DARK);\r
2591                                                 add_flag(o_ptr->art_flags, TR_RES_NETHER);\r
2592                                                 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));\r
2593                                                 curse_rank = 2;\r
2594                                         }\r
2595                                 }\r
2596 \r
2597                                 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);\r
2598                         }\r
2599 \r
2600                         p_ptr->update |= (PU_BONUS);\r
2601                         add = FALSE;\r
2602                 }\r
2603                 break;\r
2604 \r
2605         case 21:\r
2606                 if (name) return _("影のクローク", "Cloak of shadow");\r
2607                 if (desc) return _("影のオーラを身にまとい、敵に影のダメージを与える。", "Gives aura of shadow.");\r
2608                 if (cast)\r
2609                 {\r
2610                         object_type *o_ptr = &inventory[INVEN_OUTER];\r
2611 \r
2612                         if (!o_ptr->k_idx)\r
2613                         {\r
2614                                 msg_print(_("クロークを身につけていない!", "You don't ware any cloak."));\r
2615                                 return NULL;\r
2616                         }\r
2617                         else if (!object_is_cursed(o_ptr))\r
2618                         {\r
2619                                 msg_print(_("クロークは呪われていない!", "Your cloak is not cursed."));\r
2620                                 return NULL;\r
2621                         }\r
2622                         else\r
2623                         {\r
2624                                 msg_print(_("影のオーラを身にまとった。", "You have enveloped by shadow aura!"));\r
2625                         }\r
2626                 }\r
2627                 if (cont)\r
2628                 {\r
2629                         object_type *o_ptr = &inventory[INVEN_OUTER];\r
2630 \r
2631                         if ((!o_ptr->k_idx) || (!object_is_cursed(o_ptr)))\r
2632                         {\r
2633                                 do_spell(REALM_HEX, spell, SPELL_STOP);\r
2634                                 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << spell);\r
2635                                 CASTING_HEX_NUM(p_ptr)--;\r
2636                                 if (!SINGING_SONG_ID(p_ptr)) set_action(ACTION_NONE);\r
2637                         }\r
2638                 }\r
2639                 if (stop)\r
2640                 {\r
2641                         msg_print(_("影のオーラが消え去った。", "Shadow aura disappeared."));\r
2642                 }\r
2643                 break;\r
2644 \r
2645         case 22:\r
2646                 if (name) return _("苦痛を魔力に", "Pains to mana");\r
2647                 if (desc) return _("視界内のモンスターに精神ダメージ与え、魔力を吸い取る。", "Deals psychic damages to all monsters in sight, and drains some mana.");\r
2648                 power = plev * 3 / 2;\r
2649                 if (info) return info_damage(1, power, 0);\r
2650                 if (cast || cont)\r
2651                 {\r
2652                         project_hack(GF_PSI_DRAIN, randint1(power));\r
2653                 }\r
2654                 break;\r
2655 \r
2656         case 23:\r
2657                 if (name) return _("目には目を", "Eye for an eye");\r
2658                 if (desc) return _("打撃や魔法で受けたダメージを、攻撃元のモンスターにも与える。", "Returns same damage which you got to the monster which damaged you.");\r
2659                 if (cast)\r
2660                 {\r
2661                         msg_print(_("復讐したい欲望にかられた。", "You wish strongly you want to revenge anything."));\r
2662                 }\r
2663                 break;\r
2664 \r
2665         /*** 4th book (24-31) ***/\r
2666         case 24:\r
2667                 if (name) return _("反増殖結界", "Anti multiply barrier");\r
2668                 if (desc) return _("その階の増殖するモンスターの増殖を阻止する。", "Obstructs all multiplying by monsters in entire floor.");\r
2669                 if (cast)\r
2670                 {\r
2671                         msg_print(_("増殖を阻止する呪いをかけた。", "You feel anyone can not already multiply."));\r
2672                 }\r
2673                 break;\r
2674 \r
2675         case 25:\r
2676                 if (name) return _("全復活", "Restoration");\r
2677                 if (desc) return _("経験値を徐々に復活し、減少した能力値を回復させる。", "Restores experience and status.");\r
2678                 if (cast)\r
2679                 {\r
2680                         msg_print(_("体が元の活力を取り戻し始めた。", "You feel your lost status starting to return."));\r
2681                 }\r
2682                 if (cast || cont)\r
2683                 {\r
2684                         bool flag = FALSE;\r
2685                         int d = (p_ptr->max_exp - p_ptr->exp);\r
2686                         int r = (p_ptr->exp / 20);\r
2687                         int i;\r
2688 \r
2689                         if (d > 0)\r
2690                         {\r
2691                                 if (d < r)\r
2692                                         p_ptr->exp = p_ptr->max_exp;\r
2693                                 else\r
2694                                         p_ptr->exp += r;\r
2695 \r
2696                                 /* Check the experience */\r
2697                                 check_experience();\r
2698 \r
2699                                 flag = TRUE;\r
2700                         }\r
2701                         for (i = A_STR; i < 6; i ++)\r
2702                         {\r
2703                                 if (p_ptr->stat_cur[i] < p_ptr->stat_max[i])\r
2704                                 {\r
2705                                         if (p_ptr->stat_cur[i] < 18)\r
2706                                                 p_ptr->stat_cur[i]++;\r
2707                                         else\r
2708                                                 p_ptr->stat_cur[i] += 10;\r
2709 \r
2710                                         if (p_ptr->stat_cur[i] > p_ptr->stat_max[i])\r
2711                                                 p_ptr->stat_cur[i] = p_ptr->stat_max[i];\r
2712 \r
2713                                         /* Recalculate bonuses */\r
2714                                         p_ptr->update |= (PU_BONUS);\r
2715 \r
2716                                         flag = TRUE;\r
2717                                 }\r
2718                         }\r
2719 \r
2720                         if (!flag)\r
2721                         {\r
2722                                 msg_format(_("%sの呪文の詠唱をやめた。", "Finish casting '%^s'."), do_spell(REALM_HEX, HEX_RESTORE, SPELL_NAME));\r
2723                                 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_RESTORE);\r
2724                                 if (cont) CASTING_HEX_NUM(p_ptr)--;\r
2725                                 if (CASTING_HEX_NUM(p_ptr)) p_ptr->action = ACTION_NONE;\r
2726 \r
2727                                 /* Redraw status */\r
2728                                 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);\r
2729                                 p_ptr->redraw |= (PR_EXTRA);\r
2730 \r
2731                                 return "";\r
2732                         }\r
2733                 }\r
2734                 break;\r
2735 \r
2736         case 26:\r
2737                 if (name) return _("呪力吸収", "Drain curse power");\r
2738                 if (desc) return _("呪われた武器の呪いを吸収して魔力を回復する。", "Drains curse on your weapon and heals SP a little.");\r
2739                 if (cast)\r
2740                 {\r
2741                         OBJECT_IDX item;\r
2742                         cptr s, q;\r
2743                         u32b f[TR_FLAG_SIZE];\r
2744                         object_type *o_ptr;\r
2745 \r
2746                         item_tester_hook = item_tester_hook_cursed;\r
2747                         q = _("どの装備品から吸収しますか?", "Which cursed equipment do you drain mana from?");\r
2748                         s = _("呪われたアイテムを装備していない。", "You have no cursed equipment.");\r
2749 \r
2750                         if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;\r
2751 \r
2752                         o_ptr = &inventory[item];\r
2753                         object_flags(o_ptr, f);\r
2754 \r
2755                         p_ptr->csp += (p_ptr->lev / 5) + randint1(p_ptr->lev / 5);\r
2756                         if (have_flag(f, TR_TY_CURSE) || (o_ptr->curse_flags & TRC_TY_CURSE)) p_ptr->csp += randint1(5);\r
2757                         if (p_ptr->csp > p_ptr->msp) p_ptr->csp = p_ptr->msp;\r
2758 \r
2759                         if (o_ptr->curse_flags & TRC_PERMA_CURSE)\r
2760                         {\r
2761                                 /* Nothing */\r
2762                         }\r
2763                         else if (o_ptr->curse_flags & TRC_HEAVY_CURSE)\r
2764                         {\r
2765                                 if (one_in_(7))\r
2766                                 {\r
2767                                         msg_print(_("呪いを全て吸い取った。", "Heavy curse vanished away."));\r
2768                                         o_ptr->curse_flags = 0L;\r
2769                                 }\r
2770                         }\r
2771                         else if ((o_ptr->curse_flags & (TRC_CURSED)) && one_in_(3))\r
2772                         {\r
2773                                 msg_print(_("呪いを全て吸い取った。", "Curse vanished away."));\r
2774                                 o_ptr->curse_flags = 0L;\r
2775                         }\r
2776 \r
2777                         add = FALSE;\r
2778                 }\r
2779                 break;\r
2780 \r
2781         case 27:\r
2782                 if (name) return _("吸血の刃", "Swords to vampires");\r
2783                 if (desc) return _("吸血属性で攻撃する。", "Gives vampiric ability to your weapon.");\r
2784                 if (cast)\r
2785                 {\r
2786 #ifdef JP\r
2787                         msg_print("あなたの武器が血を欲している。");\r
2788 #else\r
2789                         if (!empty_hands(FALSE))\r
2790                                 msg_print("Your weapons want more blood now.");\r
2791                         else\r
2792                                 msg_print("Your weapon wants more blood now.");\r
2793 #endif\r
2794                 }\r
2795                 if (stop)\r
2796                 {\r
2797 #ifdef JP\r
2798                         msg_print("武器の渇望が消え去った。");\r
2799 #else\r
2800                         msg_format("Thirsty of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");\r
2801 #endif\r
2802                 }\r
2803                 break;\r
2804 \r
2805         case 28:\r
2806                 if (name) return _("朦朧の言葉", "Word of stun");\r
2807                 if (desc) return _("視界内のモンスターを朦朧とさせる。", "Stuns all monsters in your sight.");\r
2808                 power = plev * 4;\r
2809                 if (info) return info_power(power);\r
2810                 if (cast || cont)\r
2811                 {\r
2812                         stun_monsters(power);\r
2813                 }\r
2814                 break;\r
2815 \r
2816         case 29:\r
2817                 if (name) return _("影移動", "Moving into shadow");\r
2818                 if (desc) return _("モンスターの隣のマスに瞬間移動する。", "Teleports you close to a monster.");\r
2819                 if (cast)\r
2820                 {\r
2821                         int i, dir;\r
2822                         POSITION y, x;\r
2823                         bool flag;\r
2824 \r
2825                         for (i = 0; i < 3; i++)\r
2826                         {\r
2827                                 if (!tgt_pt(&x, &y)) return FALSE;\r
2828 \r
2829                                 flag = FALSE;\r
2830 \r
2831                                 for (dir = 0; dir < 8; dir++)\r
2832                                 {\r
2833                                         int dy = y + ddy_ddd[dir];\r
2834                                         int dx = x + ddx_ddd[dir];\r
2835                                         if (dir == 5) continue;\r
2836                                         if(cave[dy][dx].m_idx) flag = TRUE;\r
2837                                 }\r
2838 \r
2839                                 if (!cave_empty_bold(y, x) || (cave[y][x].info & CAVE_ICKY) ||\r
2840                                         (distance(y, x, p_ptr->y, p_ptr->x) > plev + 2))\r
2841                                 {\r
2842                                         msg_print(_("そこには移動できない。", "Can not teleport to there."));\r
2843                                         continue;\r
2844                                 }\r
2845                                 break;\r
2846                         }\r
2847 \r
2848                         if (flag && randint0(plev * plev / 2))\r
2849                         {\r
2850                                 teleport_player_to(y, x, 0L);\r
2851                         }\r
2852                         else\r
2853                         {\r
2854                                 msg_print(_("おっと!", "Oops!"));\r
2855                                 teleport_player(30, 0L);\r
2856                         }\r
2857 \r
2858                         add = FALSE;\r
2859                 }\r
2860                 break;\r
2861 \r
2862         case 30:\r
2863                 if (name) return _("反魔法結界", "Anti magic barrier");\r
2864                 if (desc) return _("視界内のモンスターの魔法を阻害するバリアを張る。", "Obstructs all magic spell of monsters in your sight.");\r
2865                 power = plev * 3 / 2;\r
2866                 if (info) return info_power(power);\r
2867                 if (cast)\r
2868                 {\r
2869                         msg_print(_("魔法を防ぐ呪いをかけた。", "You feel anyone can not cast spells except you."));\r
2870                 }\r
2871                 break;\r
2872 \r
2873         case 31:\r
2874                 if (name) return _("復讐の宣告", "Revenge sentence");\r
2875                 if (desc) return _("数ターン後にそれまで受けたダメージに応じた威力の地獄の劫火の弾を放つ。", \r
2876                         "Fires  a ball of hell fire to try revenging after few turns.");\r
2877                 power = HEX_REVENGE_POWER(p_ptr);\r
2878                 if (info) return info_damage(0, 0, power);\r
2879                 if (cast)\r
2880                 {\r
2881                         MAGIC_NUM2 r;\r
2882                         int a = 3 - (p_ptr->pspeed - 100) / 10;\r
2883                         r = 1 + randint1(2) + MAX(0, MIN(3, a));\r
2884 \r
2885                         if (HEX_REVENGE_TURN(p_ptr) > 0)\r
2886                         {\r
2887                                 msg_print(_("すでに復讐は宣告済みだ。", "You already pronounced your revenge."));\r
2888                                 return NULL;\r
2889                         }\r
2890 \r
2891                         HEX_REVENGE_TYPE(p_ptr) = 2;\r
2892                         HEX_REVENGE_TURN(p_ptr) = r;\r
2893                         msg_format(_("あなたは復讐を宣告した。あと %d ターン。", "You pronounce your revenge. %d turns left."), r);\r
2894                         add = FALSE;\r
2895                 }\r
2896                 if (cont)\r
2897                 {\r
2898                         HEX_REVENGE_TURN(p_ptr)--;\r
2899 \r
2900                         if (HEX_REVENGE_TURN(p_ptr) <= 0)\r
2901                         {\r
2902                                 int dir;\r
2903 \r
2904                                 if (power)\r
2905                                 {\r
2906                                         command_dir = 0;\r
2907 \r
2908                                         do\r
2909                                         {\r
2910                                                 msg_print(_("復讐の時だ!", "Time to revenge!"));\r
2911                                         }\r
2912                                         while (!get_aim_dir(&dir));\r
2913 \r
2914                                         fire_ball(GF_HELL_FIRE, dir, power, 1);\r
2915 \r
2916                                         if (p_ptr->wizard)\r
2917                                         {\r
2918                                                 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);\r
2919                                         }\r
2920                                 }\r
2921                                 else\r
2922                                 {\r
2923                                         msg_print(_("復讐する気が失せた。", "You are not a mood to revenge."));\r
2924                                 }\r
2925                                 HEX_REVENGE_POWER(p_ptr) = 0;\r
2926                         }\r
2927                 }\r
2928                 break;\r
2929         }\r
2930 \r
2931         /* start casting */\r
2932         if ((cast) && (add))\r
2933         {\r
2934                 /* add spell */\r
2935                 CASTING_HEX_FLAGS(p_ptr) |= 1L << (spell);\r
2936                 CASTING_HEX_NUM(p_ptr)++;\r
2937 \r
2938                 if (p_ptr->action != ACTION_SPELL) set_action(ACTION_SPELL);\r
2939         }\r
2940 \r
2941         /* Redraw status */\r
2942         if (!info)\r
2943         {\r
2944                 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);\r
2945                 p_ptr->redraw |= (PR_EXTRA | PR_HP | PR_MANA);\r
2946         }\r
2947 \r
2948         return "";\r
2949 }\r
2950 \r
2951 \r
2952 /*!\r
2953  * @brief 魔法処理のメインルーチン\r
2954  * @param realm 魔法領域のID\r
2955  * @param spell 各領域の魔法ID\r
2956  * @param mode 求める処理\r
2957  * @return 各領域魔法に各種テキストを求めた場合は文字列参照ポインタ、そうでない場合はNULLポインタを返す。\r
2958  */\r
2959 cptr do_spell(REALM_IDX realm, SPELL_IDX spell, BIT_FLAGS mode)\r
2960 {\r
2961         switch (realm)\r
2962         {\r
2963         case REALM_LIFE:     return do_life_spell(spell, mode);\r
2964         case REALM_SORCERY:  return do_sorcery_spell(spell, mode);\r
2965         case REALM_NATURE:   return do_nature_spell(spell, mode);\r
2966         case REALM_CHAOS:    return do_chaos_spell(spell, mode);\r
2967         case REALM_DEATH:    return do_death_spell(spell, mode);\r
2968         case REALM_TRUMP:    return do_trump_spell(spell, mode);\r
2969         case REALM_ARCANE:   return do_arcane_spell(spell, mode);\r
2970         case REALM_CRAFT:    return do_craft_spell(spell, mode);\r
2971         case REALM_DAEMON:   return do_daemon_spell(spell, mode);\r
2972         case REALM_CRUSADE:  return do_crusade_spell(spell, mode);\r
2973         case REALM_MUSIC:    return do_music_spell(spell, mode);\r
2974         case REALM_HISSATSU: return do_hissatsu_spell(spell, mode);\r
2975         case REALM_HEX:      return do_hex_spell(spell, mode);\r
2976         }\r
2977 \r
2978         return NULL;\r
2979 }\r