OSDN Git Service

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