5 * @brief 歌の開始を処理する / Start singing if the player is a Bard
6 * @param spell 領域魔法としてのID
10 static void start_singing(SPELL_IDX spell, MAGIC_NUM1 song)
12 /* Remember the song index */
13 SINGING_SONG_EFFECT(p_ptr) = (MAGIC_NUM1)song;
15 /* Remember the index of the spell which activated the song */
16 SINGING_SONG_ID(p_ptr) = (MAGIC_NUM2)spell;
19 /* Now the player is singing */
20 set_action(ACTION_SING);
22 p_ptr->update |= (PU_BONUS);
24 /* Redraw status bar */
25 p_ptr->redraw |= (PR_STATUS);
29 * @brief 歌の停止を処理する / Stop singing if the player is a Bard
32 void stop_singing(void)
34 if (p_ptr->pclass != CLASS_BARD) return;
36 /* Are there interupted song? */
37 if (INTERUPTING_SONG_EFFECT(p_ptr))
39 /* Forget interupted song */
40 INTERUPTING_SONG_EFFECT(p_ptr) = MUSIC_NONE;
44 /* The player is singing? */
45 if (!SINGING_SONG_EFFECT(p_ptr)) return;
47 /* Hack -- if called from set_action(), avoid recursive loop */
48 if (p_ptr->action == ACTION_SING) set_action(ACTION_NONE);
50 /* Message text of each song or etc. */
51 do_spell(REALM_MUSIC, SINGING_SONG_ID(p_ptr), SPELL_STOP);
53 SINGING_SONG_EFFECT(p_ptr) = MUSIC_NONE;
54 SINGING_SONG_ID(p_ptr) = 0;
55 p_ptr->update |= (PU_BONUS);
57 /* Redraw status bar */
58 p_ptr->redraw |= (PR_STATUS);
64 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP)
65 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
67 cptr do_music_spell(SPELL_IDX spell, BIT_FLAGS mode)
69 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
70 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
71 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
72 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
73 bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
74 bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
75 bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
76 static const char s_dam[] = _("損傷:", "dam ");
79 PLAYER_LEVEL plev = p_ptr->lev;
84 if (name) return _("遅鈍の歌", "Song of Holding");
85 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
87 /* Stop singing before start another */
88 if (cast || fail) stop_singing();
92 msg_print(_("ゆっくりとしたメロディを口ずさみ始めた...", "You start humming a slow, steady melody..."));
93 start_singing(spell, MUSIC_SLOW);
99 if (info) return info_power(power);
109 if (name) return _("祝福の歌", "Song of Blessing");
110 if (desc) return _("命中率とACのボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
112 /* Stop singing before start another */
113 if (cast || fail) stop_singing();
117 msg_print(_("厳かなメロディを奏で始めた...", "The holy power of the Music of the Ainur enters you..."));
118 start_singing(spell, MUSIC_BLESS);
125 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
132 if (name) return _("崩壊の音色", "Wrecking Note");
133 if (desc) return _("轟音のボルトを放つ。", "Fires a bolt of sound.");
135 /* Stop singing before start another */
136 if (cast || fail) stop_singing();
139 DICE_NUMBER dice = 4 + (plev - 1) / 5;
142 if (info) return info_damage(dice, sides, 0);
146 if (!get_aim_dir(&dir)) return NULL;
148 fire_bolt(GF_SOUND, dir, damroll(dice, sides));
154 if (name) return _("朦朧の旋律", "Stun Pattern");
155 if (desc) return _("視界内の全てのモンスターを朦朧させる。抵抗されると無効。", "Attempts to stun all monsters in sight.");
157 /* Stop singing before start another */
158 if (cast || fail) stop_singing();
162 msg_print(_("眩惑させるメロディを奏で始めた...", "You weave a pattern of sounds to bewilder and daze..."));
163 start_singing(spell, MUSIC_STUN);
167 DICE_NUMBER dice = plev / 10;
170 if (info) return info_power_dice(dice, sides);
174 stun_monsters(damroll(dice, sides));
181 if (name) return _("生命の流れ", "Flow of Life");
182 if (desc) return _("体力を少し回復させる。", "Heals HP a little.");
184 /* Stop singing before start another */
185 if (cast || fail) stop_singing();
189 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing a song of healing..."));
190 start_singing(spell, MUSIC_L_LIFE);
194 DICE_NUMBER dice = 2;
197 if (info) return info_heal(dice, sides, 0);
201 hp_player(damroll(dice, sides));
208 if (name) return _("太陽の歌", "Song of the Sun");
209 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
211 /* Stop singing before start another */
212 if (cast || fail) stop_singing();
215 DICE_NUMBER dice = 2;
216 DICE_SID sides = plev / 2;
217 POSITION rad = plev / 10 + 1;
219 if (info) return info_damage(dice, sides, 0);
223 msg_print(_("光り輝く歌が辺りを照らした。", "Your uplifting song brings brightness to dark places..."));
224 lite_area(damroll(dice, sides), rad);
230 if (name) return _("恐怖の歌", "Song of Fear");
231 if (desc) return _("視界内の全てのモンスターを恐怖させる。抵抗されると無効。", "Attempts to scare all monsters in sight.");
233 /* Stop singing before start another */
234 if (cast || fail) stop_singing();
238 msg_print(_("おどろおどろしいメロディを奏で始めた...", "You start weaving a fearful pattern..."));
239 start_singing(spell, MUSIC_FEAR);
245 if (info) return info_power(power);
249 project_all_los(GF_TURN_ALL, power);
256 if (name) return _("戦いの歌", "Heroic Ballad");
257 if (desc) return _("ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
259 /* Stop singing before start another */
260 if (cast || fail) stop_singing();
264 msg_print(_("激しい戦いの歌を歌った...", "You start singing a song of intense fighting..."));
269 /* Recalculate hitpoints */
270 p_ptr->update |= (PU_HP);
272 start_singing(spell, MUSIC_HERO);
279 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
280 /* Recalculate hitpoints */
281 p_ptr->update |= (PU_HP);
288 if (name) return _("霊的知覚", "Clairaudience");
289 if (desc) return _("近くの罠/扉/階段を感知する。レベル15で全てのモンスター、20で財宝とアイテムを感知できるようになる。レベル25で周辺の地形を感知し、40でその階全体を永久に照らし、ダンジョン内のすべてのアイテムを感知する。この効果は歌い続けることで順に起こる。",
290 "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.");
292 /* Stop singing before start another */
293 if (cast || fail) stop_singing();
297 msg_print(_("静かな音楽が感覚を研ぎ澄まさせた...", "Your quiet music sharpens your sense of hearing..."));
298 /* Hack -- Initialize the turn count */
299 SINGING_COUNT(p_ptr) = 0;
300 start_singing(spell, MUSIC_DETECT);
304 POSITION rad = DETECT_RAD_DEFAULT;
306 if (info) return info_radius(rad);
310 int count = SINGING_COUNT(p_ptr);
312 if (count >= 19) wiz_lite(FALSE);
316 if (plev > 39 && count < 19)
317 SINGING_COUNT(p_ptr) = count + 1;
321 /* There are too many hidden treasure. So... */
322 /* detect_treasure(rad); */
323 detect_objects_gold(rad);
324 detect_objects_normal(rad);
326 if (plev > 24 && count < 11)
327 SINGING_COUNT(p_ptr) = count + 1;
331 detect_monsters_invis(rad);
332 detect_monsters_normal(rad);
334 if (plev > 19 && count < 6)
335 SINGING_COUNT(p_ptr) = count + 1;
337 detect_traps(rad, TRUE);
341 if (plev > 14 && count < 3)
342 SINGING_COUNT(p_ptr) = count + 1;
349 if (name) return _("魂の歌", "Soul Shriek");
350 if (desc) return _("視界内の全てのモンスターに対して精神攻撃を行う。", "Damages all monsters in sight with PSI damages.");
352 /* Stop singing before start another */
353 if (cast || fail) stop_singing();
357 msg_print(_("精神を捻じ曲げる歌を歌った...", "You start singing a song of soul in pain..."));
358 start_singing(spell, MUSIC_PSI);
362 DICE_NUMBER dice = 1;
363 DICE_SID sides = plev * 3 / 2;
365 if (info) return info_damage(dice, sides, 0);
369 project_all_los(GF_PSI, damroll(dice, sides));
376 if (name) return _("知識の歌", "Song of Lore");
377 if (desc) return _("自分のいるマスと隣りのマスに落ちているアイテムを鑑定する。", "Identifies all items which are in the adjacent squares.");
379 /* Stop singing before start another */
380 if (cast || fail) stop_singing();
384 msg_print(_("この世界の知識が流れ込んできた...", "You recall the rich lore of the world..."));
385 start_singing(spell, MUSIC_ID);
391 if (info) return info_radius(rad);
395 * MP不足で鑑定が発動される前に歌が中断してしまうのを防止。
399 project(0, rad, p_ptr->y, p_ptr->x, 0, GF_IDENTIFY, PROJECT_ITEM, -1);
406 if (name) return _("隠遁の歌", "Hiding Tune");
407 if (desc) return _("隠密行動能力を上昇させる。", "Gives improved stealth.");
409 /* Stop singing before start another */
410 if (cast || fail) stop_singing();
414 msg_print(_("あなたの姿が景色にとけこんでいった...", "Your song carries you beyond the sight of mortal eyes..."));
415 start_singing(spell, MUSIC_STEALTH);
420 if (!p_ptr->tim_stealth)
422 msg_print(_("姿がはっきりと見えるようになった。", "You are no longer hided."));
429 if (name) return _("幻影の旋律", "Illusion Pattern");
430 if (desc) return _("視界内の全てのモンスターを混乱させる。抵抗されると無効。", "Attempts to confuse all monsters in sight.");
432 /* Stop singing before start another */
433 if (cast || fail) stop_singing();
437 msg_print(_("辺り一面に幻影が現れた...", "You weave a pattern of sounds to beguile and confuse..."));
438 start_singing(spell, MUSIC_CONF);
442 POWER power = plev * 2;
444 if (info) return info_power(power);
448 confuse_monsters(power);
455 if (name) return _("破滅の叫び", "Doomcall");
456 if (desc) return _("視界内の全てのモンスターに対して轟音攻撃を行う。", "Damages all monsters in sight with booming sound.");
458 /* Stop singing before start another */
459 if (cast || fail) stop_singing();
463 msg_print(_("轟音が響いた...", "The fury of the Downfall of Numenor lashes out..."));
464 start_singing(spell, MUSIC_SOUND);
468 DICE_NUMBER dice = 10 + plev / 5;
471 if (info) return info_damage(dice, sides, 0);
475 project_all_los(GF_SOUND, damroll(dice, sides));
482 if (name) return _("フィリエルの歌", "Firiel's Song");
483 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
486 /* Stop singing before start another */
487 if (cast || fail) stop_singing();
491 msg_print(_("生命と復活のテーマを奏で始めた...", "The themes of life and revival are woven into your song..."));
492 animate_dead(0, p_ptr->y, p_ptr->x);
498 if (name) return _("旅の仲間", "Fellowship Chant");
499 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
501 /* Stop singing before start another */
502 if (cast || fail) stop_singing();
506 msg_print(_("安らかなメロディを奏で始めた...", "You weave a slow, soothing melody of imploration..."));
507 start_singing(spell, MUSIC_CHARM);
511 DICE_NUMBER dice = 10 + plev / 15;
514 if (info) return info_power_dice(dice, sides);
518 charm_monsters(damroll(dice, sides));
525 if (name) return _("分解音波", "Sound of disintegration");
526 if (desc) return _("壁を掘り進む。自分の足元のアイテムは蒸発する。", "Makes you be able to burrow into walls. Objects under your feet evaporate.");
528 /* Stop singing before start another */
529 if (cast || fail) stop_singing();
533 msg_print(_("粉砕するメロディを奏で始めた...", "You weave a violent pattern of sounds to break wall."));
534 start_singing(spell, MUSIC_WALL);
540 * MP不足で効果が発動される前に歌が中断してしまうのを防止。
544 project(0, 0, p_ptr->y, p_ptr->x,
545 0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1);
551 if (name) return _("元素耐性", "Finrod's Resistance");
552 if (desc) return _("酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
553 "Gives resistance to fire, cold, electricity, acid and poison. These resistances can be added to which from equipment for more powerful resistances.");
555 /* Stop singing before start another */
556 if (cast || fail) stop_singing();
560 msg_print(_("元素の力に対する忍耐の歌を歌った。", "You sing a song of perseverance against powers..."));
561 start_singing(spell, MUSIC_RESIST);
566 if (!p_ptr->oppose_acid)
568 msg_print(_("酸への耐性が薄れた気がする。", "You feel less resistant to acid."));
571 if (!p_ptr->oppose_elec)
573 msg_print(_("電撃への耐性が薄れた気がする。", "You feel less resistant to elec."));
576 if (!p_ptr->oppose_fire)
578 msg_print(_("火への耐性が薄れた気がする。", "You feel less resistant to fire."));
581 if (!p_ptr->oppose_cold)
583 msg_print(_("冷気への耐性が薄れた気がする。", "You feel less resistant to cold."));
586 if (!p_ptr->oppose_pois)
588 msg_print(_("毒への耐性が薄れた気がする。", "You feel less resistant to pois."));
595 if (name) return _("ホビットのメロディ", "Hobbit Melodies");
596 if (desc) return _("加速する。", "Hastes you.");
598 /* Stop singing before start another */
599 if (cast || fail) stop_singing();
603 msg_print(_("軽快な歌を口ずさみ始めた...", "You start singing joyful pop song..."));
604 start_singing(spell, MUSIC_SPEED);
611 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
618 if (name) return _("歪んだ世界", "World Contortion");
619 if (desc) return _("近くのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all nearby monsters away unless resisted.");
622 POSITION rad = plev / 15 + 1;
623 POWER power = plev * 3 + 1;
625 if (info) return info_radius(rad);
627 /* Stop singing before start another */
628 if (cast || fail) stop_singing();
632 msg_print(_("歌が空間を歪めた...", "Reality whirls wildly as you sing a dizzying melody..."));
633 project(0, rad, p_ptr->y, p_ptr->x, power, GF_AWAY_ALL, PROJECT_KILL, -1);
639 if (name) return _("退散の歌", "Dispelling chant");
640 if (desc) return _("視界内の全てのモンスターにダメージを与える。邪悪なモンスターに特に大きなダメージを与える。",
641 "Damages all monsters in sight. Hurts evil monsters greatly.");
643 /* Stop singing before start another */
644 if (cast || fail) stop_singing();
648 msg_print(_("耐えられない不協和音が敵を責め立てた...", "You cry out in an ear-wracking voice..."));
649 start_singing(spell, MUSIC_DISPEL);
653 DICE_SID m_sides = plev * 3;
654 DICE_SID e_sides = plev * 3;
656 if (info) return format("%s1d%d+1d%d", s_dam, m_sides, e_sides);
660 dispel_monsters(randint1(m_sides));
661 dispel_evil(randint1(e_sides));
667 if (name) return _("サルマンの甘言", "The Voice of Saruman");
668 if (desc) return _("視界内の全てのモンスターを減速させ、眠らせようとする。抵抗されると無効。", "Attempts to slow and sleep all monsters in sight.");
670 /* Stop singing before start another */
671 if (cast || fail) stop_singing();
675 msg_print(_("優しく、魅力的な歌を口ずさみ始めた...", "You start humming a gentle and attractive song..."));
676 start_singing(spell, MUSIC_SARUMAN);
682 if (info) return info_power(power);
687 sleep_monsters(plev);
694 if (name) return _("嵐の音色", "Song of the Tempest");
695 if (desc) return _("轟音のビームを放つ。", "Fires a beam of sound.");
698 DICE_NUMBER dice = 15 + (plev - 1) / 2;
701 if (info) return info_damage(dice, sides, 0);
703 /* Stop singing before start another */
704 if (cast || fail) stop_singing();
708 if (!get_aim_dir(&dir)) return NULL;
710 fire_beam(GF_SOUND, dir, damroll(dice, sides));
716 if (name) return _("もう一つの世界", "Ambarkanta");
717 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
723 if (info) return info_delay(base, sides);
725 /* Stop singing before start another */
726 if (cast || fail) stop_singing();
730 msg_print(_("周囲が変化し始めた...", "You sing of the primeval shaping of Middle-earth..."));
737 if (name) return _("破壊の旋律", "Wrecking Pattern");
738 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
739 "Shakes dungeon structure, and results in random swapping of floors and walls.");
741 /* Stop singing before start another */
742 if (cast || fail) stop_singing();
746 msg_print(_("破壊的な歌が響きわたった...", "You weave a pattern of sounds to contort and shatter..."));
747 start_singing(spell, MUSIC_QUAKE);
753 if (info) return info_radius(rad);
757 earthquake(p_ptr->y, p_ptr->x, 10);
765 if (name) return _("停滞の歌", "Stationary Shriek");
766 if (desc) return _("視界内の全てのモンスターを麻痺させようとする。抵抗されると無効。", "Attempts to freeze all monsters in sight.");
768 /* Stop singing before start another */
769 if (cast || fail) stop_singing();
773 msg_print(_("ゆっくりとしたメロディを奏で始めた...", "You weave a very slow pattern which is almost likely to stop..."));
774 start_singing(spell, MUSIC_STASIS);
778 POWER power = plev * 4;
780 if (info) return info_power(power);
784 stasis_monsters(power);
791 if (name) return _("守りの歌", "Endurance");
792 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。",
793 "Sets a glyph on the floor beneath you. Monsters cannot attack you if you are on a glyph, but can try to break glyph.");
796 /* Stop singing before start another */
797 if (cast || fail) stop_singing();
801 msg_print(_("歌が神聖な場を作り出した...", "The holy power of the Music is creating sacred field..."));
808 if (name) return _("英雄の詩", "The Hero's Poem");
809 if (desc) return _("加速し、ヒーロー気分になり、視界内の全てのモンスターにダメージを与える。",
810 "Hastes you. Gives heroism. Damages all monsters in sight.");
812 /* Stop singing before start another */
813 if (cast || fail) stop_singing();
817 msg_print(_("英雄の歌を口ずさんだ...", "You chant a powerful, heroic call to arms..."));
821 /* Recalculate hitpoints */
822 p_ptr->update |= (PU_HP);
824 start_singing(spell, MUSIC_SHERO);
831 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
832 /* Recalculate hitpoints */
833 p_ptr->update |= (PU_HP);
838 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
843 DICE_NUMBER dice = 1;
844 DICE_SID sides = plev * 3;
846 if (info) return info_damage(dice, sides, 0);
850 dispel_monsters(damroll(dice, sides));
856 if (name) return _("ヤヴァンナの助け", "Relief of Yavanna");
857 if (desc) return _("強力な回復の歌で、負傷と朦朧状態も全快する。", "Powerful healing song. Also heals cut and stun completely.");
859 /* Stop singing before start another */
860 if (cast || fail) stop_singing();
864 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing the song..."));
865 start_singing(spell, MUSIC_H_LIFE);
869 DICE_NUMBER dice = 15;
872 if (info) return info_heal(dice, sides, 0);
876 hp_player(damroll(dice, sides));
885 if (name) return _("再生の歌", "Goddess' rebirth");
886 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
889 /* Stop singing before start another */
890 if (cast || fail) stop_singing();
894 msg_print(_("暗黒の中に光と美をふりまいた。体が元の活力を取り戻した。",
895 "You strewed light and beauty in the dark as you sing. You feel refreshed."));
896 (void)restore_all_status();
897 (void)restore_level();
903 if (name) return _("サウロンの魔術", "Wizardry of Sauron");
904 if (desc) return _("非常に強力でごく小さい轟音の球を放つ。", "Fires an extremely powerful tiny ball of sound.");
907 DICE_NUMBER dice = 50 + plev;
911 if (info) return info_damage(dice, sides, 0);
913 /* Stop singing before start another */
914 if (cast || fail) stop_singing();
918 if (!get_aim_dir(&dir)) return NULL;
920 fire_ball(GF_SOUND, dir, damroll(dice, sides), rad);
926 if (name) return _("フィンゴルフィンの挑戦", "Fingolfin's Challenge");
927 if (desc) return _("ダメージを受けなくなるバリアを張る。",
928 "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks.");
930 /* Stop singing before start another */
931 if (cast || fail) stop_singing();
935 msg_print(_("フィンゴルフィンの冥王への挑戦を歌った...",
936 "You recall the valor of Fingolfin's challenge to the Dark Lord..."));
938 p_ptr->redraw |= (PR_MAP);
939 p_ptr->update |= (PU_MONSTERS);
940 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
942 start_singing(spell, MUSIC_INVULN);
949 msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));
951 p_ptr->redraw |= (PR_MAP);
952 p_ptr->update |= (PU_MONSTERS);
953 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);