OSDN Git Service

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