OSDN Git Service

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