OSDN Git Service

v3.0.0 Alpha5 OSDN最終版
[hengband/hengband.git] / src / realm-song.c
1 #include "angband.h"
2 #include "cmd-spell.h"
3 #include "spells-status.h"
4 #include "projection.h"
5
6 /*!
7 * @brief 歌の開始を処理する / Start singing if the player is a Bard
8 * @param spell 領域魔法としてのID
9 * @param song 魔法効果のID
10 * @return なし
11 */
12 static void start_singing(SPELL_IDX spell, MAGIC_NUM1 song)
13 {
14         /* Remember the song index */
15         SINGING_SONG_EFFECT(p_ptr) = (MAGIC_NUM1)song;
16
17         /* Remember the index of the spell which activated the song */
18         SINGING_SONG_ID(p_ptr) = (MAGIC_NUM2)spell;
19
20
21         /* Now the player is singing */
22         set_action(ACTION_SING);
23
24         p_ptr->update |= (PU_BONUS);
25         p_ptr->redraw |= (PR_STATUS);
26 }
27
28 /*!
29 * @brief 歌の各処理を行う
30 * @param spell 歌ID
31 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP)
32 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
33 */
34 concptr do_music_spell(SPELL_IDX spell, BIT_FLAGS mode)
35 {
36         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
37         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
38         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
39         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
40         bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
41         bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
42         bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
43
44         DIRECTION dir;
45         PLAYER_LEVEL plev = p_ptr->lev;
46
47         switch (spell)
48         {
49         case 0:
50                 if (name) return _("遅鈍の歌", "Song of Holding");
51                 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
52
53                 /* Stop singing before start another */
54                 if (cast || fail) stop_singing();
55
56                 if (cast)
57                 {
58                         msg_print(_("ゆっくりとしたメロディを口ずさみ始めた...", "You start humming a slow, steady melody..."));
59                         start_singing(spell, MUSIC_SLOW);
60                 }
61
62                 {
63                         POWER power = plev;
64
65                         if (info) return info_power(power);
66
67                         if (cont)
68                         {
69                                 slow_monsters(plev);
70                         }
71                 }
72                 break;
73
74         case 1:
75                 if (name) return _("祝福の歌", "Song of Blessing");
76                 if (desc) return _("命中率とACのボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
77
78                 /* Stop singing before start another */
79                 if (cast || fail) stop_singing();
80
81                 if (cast)
82                 {
83                         msg_print(_("厳かなメロディを奏で始めた...", "The holy power of the Music of the Ainur enters you..."));
84                         start_singing(spell, MUSIC_BLESS);
85                 }
86
87                 if (stop)
88                 {
89                         if (!p_ptr->blessed)
90                         {
91                                 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
92                         }
93                 }
94
95                 break;
96
97         case 2:
98                 if (name) return _("崩壊の音色", "Wrecking Note");
99                 if (desc) return _("轟音のボルトを放つ。", "Fires a bolt of sound.");
100
101                 /* Stop singing before start another */
102                 if (cast || fail) stop_singing();
103
104                 {
105                         DICE_NUMBER dice = 4 + (plev - 1) / 5;
106                         DICE_SID sides = 4;
107
108                         if (info) return info_damage(dice, sides, 0);
109
110                         if (cast)
111                         {
112                                 if (!get_aim_dir(&dir)) return NULL;
113
114                                 fire_bolt(GF_SOUND, dir, damroll(dice, sides));
115                         }
116                 }
117                 break;
118
119         case 3:
120                 if (name) return _("朦朧の旋律", "Stun Pattern");
121                 if (desc) return _("視界内の全てのモンスターを朦朧させる。抵抗されると無効。", "Attempts to stun all monsters in sight.");
122
123                 /* Stop singing before start another */
124                 if (cast || fail) stop_singing();
125
126                 if (cast)
127                 {
128                         msg_print(_("眩惑させるメロディを奏で始めた...", "You weave a pattern of sounds to bewilder and daze..."));
129                         start_singing(spell, MUSIC_STUN);
130                 }
131
132                 {
133                         DICE_NUMBER dice = plev / 10;
134                         DICE_SID sides = 2;
135
136                         if (info) return info_power_dice(dice, sides);
137
138                         if (cont)
139                         {
140                                 stun_monsters(damroll(dice, sides));
141                         }
142                 }
143
144                 break;
145
146         case 4:
147                 if (name) return _("生命の流れ", "Flow of Life");
148                 if (desc) return _("体力を少し回復させる。", "Heals HP a little.");
149
150                 /* Stop singing before start another */
151                 if (cast || fail) stop_singing();
152
153                 if (cast)
154                 {
155                         msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing a song of healing..."));
156                         start_singing(spell, MUSIC_L_LIFE);
157                 }
158
159                 {
160                         DICE_NUMBER dice = 2;
161                         DICE_SID sides = 6;
162
163                         if (info) return info_heal(dice, sides, 0);
164
165                         if (cont)
166                         {
167                                 hp_player(damroll(dice, sides));
168                         }
169                 }
170
171                 break;
172
173         case 5:
174                 if (name) return _("太陽の歌", "Song of the Sun");
175                 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
176
177                 /* Stop singing before start another */
178                 if (cast || fail) stop_singing();
179
180                 {
181                         DICE_NUMBER dice = 2;
182                         DICE_SID sides = plev / 2;
183                         POSITION rad = plev / 10 + 1;
184
185                         if (info) return info_damage(dice, sides, 0);
186
187                         if (cast)
188                         {
189                                 msg_print(_("光り輝く歌が辺りを照らした。", "Your uplifting song brings brightness to dark places..."));
190                                 lite_area(damroll(dice, sides), rad);
191                         }
192                 }
193                 break;
194
195         case 6:
196                 if (name) return _("恐怖の歌", "Song of Fear");
197                 if (desc) return _("視界内の全てのモンスターを恐怖させる。抵抗されると無効。", "Attempts to scare all monsters in sight.");
198
199                 /* Stop singing before start another */
200                 if (cast || fail) stop_singing();
201
202                 if (cast)
203                 {
204                         msg_print(_("おどろおどろしいメロディを奏で始めた...", "You start weaving a fearful pattern..."));
205                         start_singing(spell, MUSIC_FEAR);
206                 }
207
208                 {
209                         POWER power = plev;
210
211                         if (info) return info_power(power);
212
213                         if (cont)
214                         {
215                                 project_all_los(GF_TURN_ALL, power);
216                         }
217                 }
218
219                 break;
220
221         case 7:
222                 if (name) return _("戦いの歌", "Heroic Ballad");
223                 if (desc) return _("ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
224
225                 /* Stop singing before start another */
226                 if (cast || fail) stop_singing();
227
228                 if (cast)
229                 {
230                         msg_print(_("激しい戦いの歌を歌った...", "You start singing a song of intense fighting..."));
231
232                         (void)hp_player(10);
233                         (void)set_afraid(0);
234
235                         /* Recalculate hitpoints */
236                         p_ptr->update |= (PU_HP);
237
238                         start_singing(spell, MUSIC_HERO);
239                 }
240
241                 if (stop)
242                 {
243                         if (!p_ptr->hero)
244                         {
245                                 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
246                                 /* Recalculate hitpoints */
247                                 p_ptr->update |= (PU_HP);
248                         }
249                 }
250
251                 break;
252
253         case 8:
254                 if (name) return _("霊的知覚", "Clairaudience");
255                 if (desc) return _("近くの罠/扉/階段を感知する。レベル15で全てのモンスター、20で財宝とアイテムを感知できるようになる。レベル25で周辺の地形を感知し、40でその階全体を永久に照らし、ダンジョン内のすべてのアイテムを感知する。この効果は歌い続けることで順に起こる。",
256                         "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.");
257
258                 /* Stop singing before start another */
259                 if (cast || fail) stop_singing();
260
261                 if (cast)
262                 {
263                         msg_print(_("静かな音楽が感覚を研ぎ澄まさせた...", "Your quiet music sharpens your sense of hearing..."));
264                         /* Hack -- Initialize the turn count */
265                         SINGING_COUNT(p_ptr) = 0;
266                         start_singing(spell, MUSIC_DETECT);
267                 }
268
269                 {
270                         POSITION rad = DETECT_RAD_DEFAULT;
271
272                         if (info) return info_radius(rad);
273
274                         if (cont)
275                         {
276                                 int count = SINGING_COUNT(p_ptr);
277
278                                 if (count >= 19) wiz_lite(FALSE);
279                                 if (count >= 11)
280                                 {
281                                         map_area(rad);
282                                         if (plev > 39 && count < 19)
283                                                 SINGING_COUNT(p_ptr) = count + 1;
284                                 }
285                                 if (count >= 6)
286                                 {
287                                         /* There are too many hidden treasure.  So... */
288                                         /* detect_treasure(rad); */
289                                         detect_objects_gold(rad);
290                                         detect_objects_normal(rad);
291
292                                         if (plev > 24 && count < 11)
293                                                 SINGING_COUNT(p_ptr) = count + 1;
294                                 }
295                                 if (count >= 3)
296                                 {
297                                         detect_monsters_invis(rad);
298                                         detect_monsters_normal(rad);
299
300                                         if (plev > 19 && count < A_MAX)
301                                                 SINGING_COUNT(p_ptr) = count + 1;
302                                 }
303                                 detect_traps(rad, TRUE);
304                                 detect_doors(rad);
305                                 detect_stairs(rad);
306
307                                 if (plev > 14 && count < 3)
308                                         SINGING_COUNT(p_ptr) = count + 1;
309                         }
310                 }
311
312                 break;
313
314         case 9:
315                 if (name) return _("魂の歌", "Soul Shriek");
316                 if (desc) return _("視界内の全てのモンスターに対して精神攻撃を行う。", "Damages all monsters in sight with PSI damages.");
317
318                 /* Stop singing before start another */
319                 if (cast || fail) stop_singing();
320
321                 if (cast)
322                 {
323                         msg_print(_("精神を捻じ曲げる歌を歌った...", "You start singing a song of soul in pain..."));
324                         start_singing(spell, MUSIC_PSI);
325                 }
326
327                 {
328                         DICE_NUMBER dice = 1;
329                         DICE_SID sides = plev * 3 / 2;
330
331                         if (info) return info_damage(dice, sides, 0);
332
333                         if (cont)
334                         {
335                                 project_all_los(GF_PSI, damroll(dice, sides));
336                         }
337                 }
338
339                 break;
340
341         case 10:
342                 if (name) return _("知識の歌", "Song of Lore");
343                 if (desc) return _("自分のいるマスと隣りのマスに落ちているアイテムを鑑定する。", "Identifies all items which are in the adjacent squares.");
344
345                 /* Stop singing before start another */
346                 if (cast || fail) stop_singing();
347
348                 if (cast)
349                 {
350                         msg_print(_("この世界の知識が流れ込んできた...", "You recall the rich lore of the world..."));
351                         start_singing(spell, MUSIC_ID);
352                 }
353
354                 {
355                         POSITION rad = 1;
356
357                         if (info) return info_radius(rad);
358
359                         /*
360                         * 歌の開始時にも効果発動:
361                         * MP不足で鑑定が発動される前に歌が中断してしまうのを防止。
362                         */
363                         if (cont || cast)
364                         {
365                                 project(0, rad, p_ptr->y, p_ptr->x, 0, GF_IDENTIFY, PROJECT_ITEM, -1);
366                         }
367                 }
368
369                 break;
370
371         case 11:
372                 if (name) return _("隠遁の歌", "Hiding Tune");
373                 if (desc) return _("隠密行動能力を上昇させる。", "Gives improved stealth.");
374
375                 /* Stop singing before start another */
376                 if (cast || fail) stop_singing();
377
378                 if (cast)
379                 {
380                         msg_print(_("あなたの姿が景色にとけこんでいった...", "Your song carries you beyond the sight of mortal eyes..."));
381                         start_singing(spell, MUSIC_STEALTH);
382                 }
383
384                 if (stop)
385                 {
386                         if (!p_ptr->tim_stealth)
387                         {
388                                 msg_print(_("姿がはっきりと見えるようになった。", "You are no longer hided."));
389                         }
390                 }
391
392                 break;
393
394         case 12:
395                 if (name) return _("幻影の旋律", "Illusion Pattern");
396                 if (desc) return _("視界内の全てのモンスターを混乱させる。抵抗されると無効。", "Attempts to confuse all monsters in sight.");
397
398                 /* Stop singing before start another */
399                 if (cast || fail) stop_singing();
400
401                 if (cast)
402                 {
403                         msg_print(_("辺り一面に幻影が現れた...", "You weave a pattern of sounds to beguile and confuse..."));
404                         start_singing(spell, MUSIC_CONF);
405                 }
406
407                 {
408                         POWER power = plev * 2;
409
410                         if (info) return info_power(power);
411
412                         if (cont)
413                         {
414                                 confuse_monsters(power);
415                         }
416                 }
417
418                 break;
419
420         case 13:
421                 if (name) return _("破滅の叫び", "Doomcall");
422                 if (desc) return _("視界内の全てのモンスターに対して轟音攻撃を行う。", "Damages all monsters in sight with booming sound.");
423
424                 /* Stop singing before start another */
425                 if (cast || fail) stop_singing();
426
427                 if (cast)
428                 {
429                         msg_print(_("轟音が響いた...", "The fury of the Downfall of Numenor lashes out..."));
430                         start_singing(spell, MUSIC_SOUND);
431                 }
432
433                 {
434                         DICE_NUMBER dice = 10 + plev / 5;
435                         DICE_SID sides = 7;
436
437                         if (info) return info_damage(dice, sides, 0);
438
439                         if (cont)
440                         {
441                                 project_all_los(GF_SOUND, damroll(dice, sides));
442                         }
443                 }
444
445                 break;
446
447         case 14:
448                 if (name) return _("フィリエルの歌", "Firiel's Song");
449                 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
450
451                 {
452                         /* Stop singing before start another */
453                         if (cast || fail) stop_singing();
454
455                         if (cast)
456                         {
457                                 msg_print(_("生命と復活のテーマを奏で始めた...", "The themes of life and revival are woven into your song..."));
458                                 animate_dead(0, p_ptr->y, p_ptr->x);
459                         }
460                 }
461                 break;
462
463         case 15:
464                 if (name) return _("旅の仲間", "Fellowship Chant");
465                 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
466
467                 /* Stop singing before start another */
468                 if (cast || fail) stop_singing();
469
470                 if (cast)
471                 {
472                         msg_print(_("安らかなメロディを奏で始めた...", "You weave a slow, soothing melody of imploration..."));
473                         start_singing(spell, MUSIC_CHARM);
474                 }
475
476                 {
477                         DICE_NUMBER dice = 10 + plev / 15;
478                         DICE_SID sides = 6;
479
480                         if (info) return info_power_dice(dice, sides);
481
482                         if (cont)
483                         {
484                                 charm_monsters(damroll(dice, sides));
485                         }
486                 }
487
488                 break;
489
490         case 16:
491                 if (name) return _("分解音波", "Sound of disintegration");
492                 if (desc) return _("壁を掘り進む。自分の足元のアイテムは蒸発する。", "Makes you be able to burrow into walls. Objects under your feet evaporate.");
493
494                 /* Stop singing before start another */
495                 if (cast || fail) stop_singing();
496
497                 if (cast)
498                 {
499                         msg_print(_("粉砕するメロディを奏で始めた...", "You weave a violent pattern of sounds to break wall."));
500                         start_singing(spell, MUSIC_WALL);
501                 }
502
503                 {
504                         /*
505                         * 歌の開始時にも効果発動:
506                         * MP不足で効果が発動される前に歌が中断してしまうのを防止。
507                         */
508                         if (cont || cast)
509                         {
510                                 project(0, 0, p_ptr->y, p_ptr->x,
511                                         0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1);
512                         }
513                 }
514                 break;
515
516         case 17:
517                 if (name) return _("元素耐性", "Finrod's Resistance");
518                 if (desc) return _("酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
519                         "Gives resistance to fire, cold, electricity, acid and poison. These resistances can be added to which from equipment for more powerful resistances.");
520
521                 /* Stop singing before start another */
522                 if (cast || fail) stop_singing();
523
524                 if (cast)
525                 {
526                         msg_print(_("元素の力に対する忍耐の歌を歌った。", "You sing a song of perseverance against powers..."));
527                         start_singing(spell, MUSIC_RESIST);
528                 }
529
530                 if (stop)
531                 {
532                         if (!p_ptr->oppose_acid)
533                         {
534                                 msg_print(_("酸への耐性が薄れた気がする。", "You feel less resistant to acid."));
535                         }
536
537                         if (!p_ptr->oppose_elec)
538                         {
539                                 msg_print(_("電撃への耐性が薄れた気がする。", "You feel less resistant to elec."));
540                         }
541
542                         if (!p_ptr->oppose_fire)
543                         {
544                                 msg_print(_("火への耐性が薄れた気がする。", "You feel less resistant to fire."));
545                         }
546
547                         if (!p_ptr->oppose_cold)
548                         {
549                                 msg_print(_("冷気への耐性が薄れた気がする。", "You feel less resistant to cold."));
550                         }
551
552                         if (!p_ptr->oppose_pois)
553                         {
554                                 msg_print(_("毒への耐性が薄れた気がする。", "You feel less resistant to pois."));
555                         }
556                 }
557
558                 break;
559
560         case 18:
561                 if (name) return _("ホビットのメロディ", "Hobbit Melodies");
562                 if (desc) return _("加速する。", "Hastes you.");
563
564                 /* Stop singing before start another */
565                 if (cast || fail) stop_singing();
566
567                 if (cast)
568                 {
569                         msg_print(_("軽快な歌を口ずさみ始めた...", "You start singing joyful pop song..."));
570                         start_singing(spell, MUSIC_SPEED);
571                 }
572
573                 if (stop)
574                 {
575                         if (!p_ptr->fast)
576                         {
577                                 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
578                         }
579                 }
580
581                 break;
582
583         case 19:
584                 if (name) return _("歪んだ世界", "World Contortion");
585                 if (desc) return _("近くのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all nearby monsters away unless resisted.");
586
587                 {
588                         POSITION rad = plev / 15 + 1;
589                         POWER power = plev * 3 + 1;
590
591                         if (info) return info_radius(rad);
592
593                         /* Stop singing before start another */
594                         if (cast || fail) stop_singing();
595
596                         if (cast)
597                         {
598                                 msg_print(_("歌が空間を歪めた...", "Reality whirls wildly as you sing a dizzying melody..."));
599                                 project(0, rad, p_ptr->y, p_ptr->x, power, GF_AWAY_ALL, PROJECT_KILL, -1);
600                         }
601                 }
602                 break;
603
604         case 20:
605                 if (name) return _("退散の歌", "Dispelling chant");
606                 if (desc) return _("視界内の全てのモンスターにダメージを与える。邪悪なモンスターに特に大きなダメージを与える。",
607                         "Damages all monsters in sight. Hurts evil monsters greatly.");
608
609                 /* Stop singing before start another */
610                 if (cast || fail) stop_singing();
611
612                 if (cast)
613                 {
614                         msg_print(_("耐えられない不協和音が敵を責め立てた...", "You cry out in an ear-wracking voice..."));
615                         start_singing(spell, MUSIC_DISPEL);
616                 }
617
618                 {
619                         DICE_SID m_sides = plev * 3;
620                         DICE_SID e_sides = plev * 3;
621
622                         if (info) return format("%s1d%d+1d%d", KWD_DAM, m_sides, e_sides);
623
624                         if (cont)
625                         {
626                                 dispel_monsters(randint1(m_sides));
627                                 dispel_evil(randint1(e_sides));
628                         }
629                 }
630                 break;
631
632         case 21:
633                 if (name) return _("サルマンの甘言", "The Voice of Saruman");
634                 if (desc) return _("視界内の全てのモンスターを減速させ、眠らせようとする。抵抗されると無効。", "Attempts to slow and sleep all monsters in sight.");
635
636                 /* Stop singing before start another */
637                 if (cast || fail) stop_singing();
638
639                 if (cast)
640                 {
641                         msg_print(_("優しく、魅力的な歌を口ずさみ始めた...", "You start humming a gentle and attractive song..."));
642                         start_singing(spell, MUSIC_SARUMAN);
643                 }
644
645                 {
646                         POWER power = plev;
647
648                         if (info) return info_power(power);
649
650                         if (cont)
651                         {
652                                 slow_monsters(plev);
653                                 sleep_monsters(plev);
654                         }
655                 }
656
657                 break;
658
659         case 22:
660                 if (name) return _("嵐の音色", "Song of the Tempest");
661                 if (desc) return _("轟音のビームを放つ。", "Fires a beam of sound.");
662
663                 {
664                         DICE_NUMBER dice = 15 + (plev - 1) / 2;
665                         DICE_SID sides = 10;
666
667                         if (info) return info_damage(dice, sides, 0);
668
669                         /* Stop singing before start another */
670                         if (cast || fail) stop_singing();
671
672                         if (cast)
673                         {
674                                 if (!get_aim_dir(&dir)) return NULL;
675
676                                 fire_beam(GF_SOUND, dir, damroll(dice, sides));
677                         }
678                 }
679                 break;
680
681         case 23:
682                 if (name) return _("もう一つの世界", "Ambarkanta");
683                 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
684
685                 {
686                         int base = 15;
687                         DICE_SID sides = 20;
688
689                         if (info) return info_delay(base, sides);
690
691                         /* Stop singing before start another */
692                         if (cast || fail) stop_singing();
693
694                         if (cast)
695                         {
696                                 msg_print(_("周囲が変化し始めた...", "You sing of the primeval shaping of Middle-earth..."));
697                                 alter_reality();
698                         }
699                 }
700                 break;
701
702         case 24:
703                 if (name) return _("破壊の旋律", "Wrecking Pattern");
704                 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
705                         "Shakes dungeon structure, and results in random swapping of floors and walls.");
706
707                 /* Stop singing before start another */
708                 if (cast || fail) stop_singing();
709
710                 if (cast)
711                 {
712                         msg_print(_("破壊的な歌が響きわたった...", "You weave a pattern of sounds to contort and shatter..."));
713                         start_singing(spell, MUSIC_QUAKE);
714                 }
715
716                 {
717                         POSITION rad = 10;
718
719                         if (info) return info_radius(rad);
720
721                         if (cont)
722                         {
723                                 earthquake(p_ptr->y, p_ptr->x, 10);
724                         }
725                 }
726
727                 break;
728
729
730         case 25:
731                 if (name) return _("停滞の歌", "Stationary Shriek");
732                 if (desc) return _("視界内の全てのモンスターを麻痺させようとする。抵抗されると無効。", "Attempts to freeze all monsters in sight.");
733
734                 /* Stop singing before start another */
735                 if (cast || fail) stop_singing();
736
737                 if (cast)
738                 {
739                         msg_print(_("ゆっくりとしたメロディを奏で始めた...", "You weave a very slow pattern which is almost likely to stop..."));
740                         start_singing(spell, MUSIC_STASIS);
741                 }
742
743                 {
744                         POWER power = plev * 4;
745
746                         if (info) return info_power(power);
747
748                         if (cont)
749                         {
750                                 stasis_monsters(power);
751                         }
752                 }
753
754                 break;
755
756         case 26:
757                 if (name) return _("守りの歌", "Endurance");
758                 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。",
759                         "Sets a glyph on the floor beneath you. Monsters cannot attack you if you are on a glyph, but can try to break glyph.");
760
761                 {
762                         /* Stop singing before start another */
763                         if (cast || fail) stop_singing();
764
765                         if (cast)
766                         {
767                                 msg_print(_("歌が神聖な場を作り出した...", "The holy power of the Music is creating sacred field..."));
768                                 warding_glyph();
769                         }
770                 }
771                 break;
772
773         case 27:
774                 if (name) return _("英雄の詩", "The Hero's Poem");
775                 if (desc) return _("加速し、ヒーロー気分になり、視界内の全てのモンスターにダメージを与える。",
776                         "Hastes you. Gives heroism. Damages all monsters in sight.");
777
778                 /* Stop singing before start another */
779                 if (cast || fail) stop_singing();
780
781                 if (cast)
782                 {
783                         msg_print(_("英雄の歌を口ずさんだ...", "You chant a powerful, heroic call to arms..."));
784                         (void)hp_player(10);
785                         (void)set_afraid(0);
786
787                         /* Recalculate hitpoints */
788                         p_ptr->update |= (PU_HP);
789
790                         start_singing(spell, MUSIC_SHERO);
791                 }
792
793                 if (stop)
794                 {
795                         if (!p_ptr->hero)
796                         {
797                                 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
798                                 /* Recalculate hitpoints */
799                                 p_ptr->update |= (PU_HP);
800                         }
801
802                         if (!p_ptr->fast)
803                         {
804                                 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
805                         }
806                 }
807
808                 {
809                         DICE_NUMBER dice = 1;
810                         DICE_SID sides = plev * 3;
811
812                         if (info) return info_damage(dice, sides, 0);
813
814                         if (cont)
815                         {
816                                 dispel_monsters(damroll(dice, sides));
817                         }
818                 }
819                 break;
820
821         case 28:
822                 if (name) return _("ヤヴァンナの助け", "Relief of Yavanna");
823                 if (desc) return _("強力な回復の歌で、負傷と朦朧状態も全快する。", "Powerful healing song. Also heals cut and stun completely.");
824
825                 /* Stop singing before start another */
826                 if (cast || fail) stop_singing();
827
828                 if (cast)
829                 {
830                         msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing the song..."));
831                         start_singing(spell, MUSIC_H_LIFE);
832                 }
833
834                 {
835                         DICE_NUMBER dice = 15;
836                         DICE_SID sides = 10;
837
838                         if (info) return info_heal(dice, sides, 0);
839
840                         if (cont)
841                         {
842                                 hp_player(damroll(dice, sides));
843                                 set_stun(0);
844                                 set_cut(0);
845                         }
846                 }
847
848                 break;
849
850         case 29:
851                 if (name) return _("再生の歌", "Goddess' rebirth");
852                 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
853
854                 {
855                         /* Stop singing before start another */
856                         if (cast || fail) stop_singing();
857
858                         if (cast)
859                         {
860                                 msg_print(_("暗黒の中に光と美をふりまいた。体が元の活力を取り戻した。",
861                                         "You strewed light and beauty in the dark as you sing. You feel refreshed."));
862                                 (void)restore_all_status();
863                                 (void)restore_level();
864                         }
865                 }
866                 break;
867
868         case 30:
869                 if (name) return _("サウロンの魔術", "Wizardry of Sauron");
870                 if (desc) return _("非常に強力でごく小さい轟音の球を放つ。", "Fires an extremely powerful tiny ball of sound.");
871
872                 {
873                         DICE_NUMBER dice = 50 + plev;
874                         DICE_SID sides = 10;
875                         POSITION rad = 0;
876
877                         if (info) return info_damage(dice, sides, 0);
878
879                         /* Stop singing before start another */
880                         if (cast || fail) stop_singing();
881
882                         if (cast)
883                         {
884                                 if (!get_aim_dir(&dir)) return NULL;
885
886                                 fire_ball(GF_SOUND, dir, damroll(dice, sides), rad);
887                         }
888                 }
889                 break;
890
891         case 31:
892                 if (name) return _("フィンゴルフィンの挑戦", "Fingolfin's Challenge");
893                 if (desc) return _("ダメージを受けなくなるバリアを張る。",
894                         "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks.");
895
896                 /* Stop singing before start another */
897                 if (cast || fail) stop_singing();
898
899                 if (cast)
900                 {
901                         msg_print(_("フィンゴルフィンの冥王への挑戦を歌った...",
902                                 "You recall the valor of Fingolfin's challenge to the Dark Lord..."));
903
904                         p_ptr->redraw |= (PR_MAP);
905                         p_ptr->update |= (PU_MONSTERS);
906                         p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
907
908                         start_singing(spell, MUSIC_INVULN);
909                 }
910
911                 if (stop)
912                 {
913                         if (!p_ptr->invuln)
914                         {
915                                 msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));
916
917                                 p_ptr->redraw |= (PR_MAP);
918                                 p_ptr->update |= (PU_MONSTERS);
919                                 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
920                         }
921                 }
922
923                 break;
924         }
925
926         return "";
927 }
928