3 #include "spells-status.h"
4 #include "projection.h"
5 #include "spells-floor.h"
8 * @brief 歌の開始を処理する / Start singing if the player is a Bard
9 * @param spell 領域魔法としてのID
13 static void start_singing(SPELL_IDX spell, MAGIC_NUM1 song)
15 /* Remember the song index */
16 SINGING_SONG_EFFECT(p_ptr) = (MAGIC_NUM1)song;
18 /* Remember the index of the spell which activated the song */
19 SINGING_SONG_ID(p_ptr) = (MAGIC_NUM2)spell;
22 /* Now the player is singing */
23 set_action(ACTION_SING);
25 p_ptr->update |= (PU_BONUS);
26 p_ptr->redraw |= (PR_STATUS);
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文字列を返す。
35 concptr do_music_spell(SPELL_IDX spell, BIT_FLAGS mode)
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;
46 PLAYER_LEVEL plev = p_ptr->lev;
51 if (name) return _("遅鈍の歌", "Song of Holding");
52 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
54 /* Stop singing before start another */
55 if (cast || fail) stop_singing(p_ptr);
59 msg_print(_("ゆっくりとしたメロディを口ずさみ始めた...", "You start humming a slow, steady melody..."));
60 start_singing(spell, MUSIC_SLOW);
66 if (info) return info_power(power);
76 if (name) return _("祝福の歌", "Song of Blessing");
77 if (desc) return _("命中率とACのボーナスを得る。", "Gives a bonus to hit and AC for a few turns.");
79 /* Stop singing before start another */
80 if (cast || fail) stop_singing(p_ptr);
84 msg_print(_("厳かなメロディを奏で始めた...", "The holy power of the Music of the Ainur enters you..."));
85 start_singing(spell, MUSIC_BLESS);
92 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
99 if (name) return _("崩壊の音色", "Wrecking Note");
100 if (desc) return _("轟音のボルトを放つ。", "Fires a bolt of sound.");
102 /* Stop singing before start another */
103 if (cast || fail) stop_singing(p_ptr);
106 DICE_NUMBER dice = 4 + (plev - 1) / 5;
109 if (info) return info_damage(dice, sides, 0);
113 if (!get_aim_dir(&dir)) return NULL;
115 fire_bolt(GF_SOUND, dir, damroll(dice, sides));
121 if (name) return _("朦朧の旋律", "Stun Pattern");
122 if (desc) return _("視界内の全てのモンスターを朦朧させる。抵抗されると無効。", "Attempts to stun all monsters in sight.");
124 /* Stop singing before start another */
125 if (cast || fail) stop_singing(p_ptr);
129 msg_print(_("眩惑させるメロディを奏で始めた...", "You weave a pattern of sounds to bewilder and daze..."));
130 start_singing(spell, MUSIC_STUN);
134 DICE_NUMBER dice = plev / 10;
137 if (info) return info_power_dice(dice, sides);
141 stun_monsters(damroll(dice, sides));
148 if (name) return _("生命の流れ", "Flow of Life");
149 if (desc) return _("体力を少し回復させる。", "Heals HP a little.");
151 /* Stop singing before start another */
152 if (cast || fail) stop_singing(p_ptr);
156 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing a song of healing..."));
157 start_singing(spell, MUSIC_L_LIFE);
161 DICE_NUMBER dice = 2;
164 if (info) return info_heal(dice, sides, 0);
168 hp_player(damroll(dice, sides));
175 if (name) return _("太陽の歌", "Song of the Sun");
176 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
178 /* Stop singing before start another */
179 if (cast || fail) stop_singing(p_ptr);
182 DICE_NUMBER dice = 2;
183 DICE_SID sides = plev / 2;
184 POSITION rad = plev / 10 + 1;
186 if (info) return info_damage(dice, sides, 0);
190 msg_print(_("光り輝く歌が辺りを照らした。", "Your uplifting song brings brightness to dark places..."));
191 lite_area(damroll(dice, sides), rad);
197 if (name) return _("恐怖の歌", "Song of Fear");
198 if (desc) return _("視界内の全てのモンスターを恐怖させる。抵抗されると無効。", "Attempts to scare all monsters in sight.");
200 /* Stop singing before start another */
201 if (cast || fail) stop_singing(p_ptr);
205 msg_print(_("おどろおどろしいメロディを奏で始めた...", "You start weaving a fearful pattern..."));
206 start_singing(spell, MUSIC_FEAR);
212 if (info) return info_power(power);
216 project_all_los(GF_TURN_ALL, power);
223 if (name) return _("戦いの歌", "Heroic Ballad");
224 if (desc) return _("ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
226 /* Stop singing before start another */
227 if (cast || fail) stop_singing(p_ptr);
231 msg_print(_("激しい戦いの歌を歌った...", "You start singing a song of intense fighting..."));
236 /* Recalculate hitpoints */
237 p_ptr->update |= (PU_HP);
239 start_singing(spell, MUSIC_HERO);
246 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
247 /* Recalculate hitpoints */
248 p_ptr->update |= (PU_HP);
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 accumulate as the song continues.");
259 /* Stop singing before start another */
260 if (cast || fail) stop_singing(p_ptr);
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);
271 POSITION rad = DETECT_RAD_DEFAULT;
273 if (info) return info_radius(rad);
277 int count = SINGING_COUNT(p_ptr);
279 if (count >= 19) wiz_lite(FALSE);
283 if (plev > 39 && count < 19)
284 SINGING_COUNT(p_ptr) = count + 1;
288 /* There are too many hidden treasure. So... */
289 /* detect_treasure(rad); */
290 detect_objects_gold(rad);
291 detect_objects_normal(rad);
293 if (plev > 24 && count < 11)
294 SINGING_COUNT(p_ptr) = count + 1;
298 detect_monsters_invis(rad);
299 detect_monsters_normal(rad);
301 if (plev > 19 && count < A_MAX)
302 SINGING_COUNT(p_ptr) = count + 1;
304 detect_traps(rad, TRUE);
308 if (plev > 14 && count < 3)
309 SINGING_COUNT(p_ptr) = count + 1;
316 if (name) return _("魂の歌", "Soul Shriek");
317 if (desc) return _("視界内の全てのモンスターに対して精神攻撃を行う。", "Damages all monsters in sight with PSI damages.");
319 /* Stop singing before start another */
320 if (cast || fail) stop_singing(p_ptr);
324 msg_print(_("精神を捻じ曲げる歌を歌った...", "You start singing a song of soul in pain..."));
325 start_singing(spell, MUSIC_PSI);
329 DICE_NUMBER dice = 1;
330 DICE_SID sides = plev * 3 / 2;
332 if (info) return info_damage(dice, sides, 0);
336 project_all_los(GF_PSI, damroll(dice, sides));
343 if (name) return _("知識の歌", "Song of Lore");
344 if (desc) return _("自分のいるマスと隣りのマスに落ちているアイテムを鑑定する。", "Identifies all items which are in the adjacent squares.");
346 /* Stop singing before start another */
347 if (cast || fail) stop_singing(p_ptr);
351 msg_print(_("この世界の知識が流れ込んできた...", "You recall the rich lore of the world..."));
352 start_singing(spell, MUSIC_ID);
358 if (info) return info_radius(rad);
362 * MP不足で鑑定が発動される前に歌が中断してしまうのを防止。
366 project(0, rad, p_ptr->y, p_ptr->x, 0, GF_IDENTIFY, PROJECT_ITEM, -1);
373 if (name) return _("隠遁の歌", "Hiding Tune");
374 if (desc) return _("隠密行動能力を上昇させる。", "Gives improved stealth.");
376 /* Stop singing before start another */
377 if (cast || fail) stop_singing(p_ptr);
381 msg_print(_("あなたの姿が景色にとけこんでいった...", "Your song carries you beyond the sight of mortal eyes..."));
382 start_singing(spell, MUSIC_STEALTH);
387 if (!p_ptr->tim_stealth)
389 msg_print(_("姿がはっきりと見えるようになった。", "You are no longer hidden."));
396 if (name) return _("幻影の旋律", "Illusion Pattern");
397 if (desc) return _("視界内の全てのモンスターを混乱させる。抵抗されると無効。", "Attempts to confuse all monsters in sight.");
399 /* Stop singing before start another */
400 if (cast || fail) stop_singing(p_ptr);
404 msg_print(_("辺り一面に幻影が現れた...", "You weave a pattern of sounds to beguile and confuse..."));
405 start_singing(spell, MUSIC_CONF);
409 POWER power = plev * 2;
411 if (info) return info_power(power);
415 confuse_monsters(power);
422 if (name) return _("破滅の叫び", "Doomcall");
423 if (desc) return _("視界内の全てのモンスターに対して轟音攻撃を行う。", "Damages all monsters in sight with booming sound.");
425 /* Stop singing before start another */
426 if (cast || fail) stop_singing(p_ptr);
430 msg_print(_("轟音が響いた...", "The fury of the Downfall of Numenor lashes out..."));
431 start_singing(spell, MUSIC_SOUND);
435 DICE_NUMBER dice = 10 + plev / 5;
438 if (info) return info_damage(dice, sides, 0);
442 project_all_los(GF_SOUND, damroll(dice, sides));
449 if (name) return _("フィリエルの歌", "Firiel's Song");
450 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
453 /* Stop singing before start another */
454 if (cast || fail) stop_singing(p_ptr);
458 msg_print(_("生命と復活のテーマを奏で始めた...", "The themes of life and revival are woven into your song..."));
459 animate_dead(0, p_ptr->y, p_ptr->x);
465 if (name) return _("旅の仲間", "Fellowship Chant");
466 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
468 /* Stop singing before start another */
469 if (cast || fail) stop_singing(p_ptr);
473 msg_print(_("安らかなメロディを奏で始めた...", "You weave a slow, soothing melody of imploration..."));
474 start_singing(spell, MUSIC_CHARM);
478 DICE_NUMBER dice = 10 + plev / 15;
481 if (info) return info_power_dice(dice, sides);
485 charm_monsters(damroll(dice, sides));
492 if (name) return _("分解音波", "Sound of disintegration");
493 if (desc) return _("壁を掘り進む。自分の足元のアイテムは蒸発する。", "Makes you be able to burrow into walls. Objects under your feet evaporate.");
495 /* Stop singing before start another */
496 if (cast || fail) stop_singing(p_ptr);
500 msg_print(_("粉砕するメロディを奏で始めた...", "You weave a violent pattern of sounds to break wall."));
501 start_singing(spell, MUSIC_WALL);
507 * MP不足で効果が発動される前に歌が中断してしまうのを防止。
511 project(0, 0, p_ptr->y, p_ptr->x,
512 0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1);
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 those from equipment for more powerful resistances.");
522 /* Stop singing before start another */
523 if (cast || fail) stop_singing(p_ptr);
527 msg_print(_("元素の力に対する忍耐の歌を歌った。", "You sing a song of perseverance against powers..."));
528 start_singing(spell, MUSIC_RESIST);
533 if (!p_ptr->oppose_acid)
535 msg_print(_("酸への耐性が薄れた気がする。", "You feel less resistant to acid."));
538 if (!p_ptr->oppose_elec)
540 msg_print(_("電撃への耐性が薄れた気がする。", "You feel less resistant to elec."));
543 if (!p_ptr->oppose_fire)
545 msg_print(_("火への耐性が薄れた気がする。", "You feel less resistant to fire."));
548 if (!p_ptr->oppose_cold)
550 msg_print(_("冷気への耐性が薄れた気がする。", "You feel less resistant to cold."));
553 if (!p_ptr->oppose_pois)
555 msg_print(_("毒への耐性が薄れた気がする。", "You feel less resistant to pois."));
562 if (name) return _("ホビットのメロディ", "Hobbit Melodies");
563 if (desc) return _("加速する。", "Hastes you.");
565 /* Stop singing before start another */
566 if (cast || fail) stop_singing(p_ptr);
570 msg_print(_("軽快な歌を口ずさみ始めた...", "You start singing joyful pop song..."));
571 start_singing(spell, MUSIC_SPEED);
578 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
585 if (name) return _("歪んだ世界", "World Contortion");
586 if (desc) return _("近くのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all nearby monsters away unless resisted.");
589 POSITION rad = plev / 15 + 1;
590 POWER power = plev * 3 + 1;
592 if (info) return info_radius(rad);
594 /* Stop singing before start another */
595 if (cast || fail) stop_singing(p_ptr);
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);
606 if (name) return _("退散の歌", "Dispelling chant");
607 if (desc) return _("視界内の全てのモンスターにダメージを与える。邪悪なモンスターに特に大きなダメージを与える。",
608 "Damages all monsters in sight. Hurts evil monsters greatly.");
610 /* Stop singing before start another */
611 if (cast || fail) stop_singing(p_ptr);
615 msg_print(_("耐えられない不協和音が敵を責め立てた...", "You cry out in an ear-wracking voice..."));
616 start_singing(spell, MUSIC_DISPEL);
620 DICE_SID m_sides = plev * 3;
621 DICE_SID e_sides = plev * 3;
623 if (info) return format("%s1d%d+1d%d", KWD_DAM, m_sides, e_sides);
627 dispel_monsters(randint1(m_sides));
628 dispel_evil(randint1(e_sides));
634 if (name) return _("サルマンの甘言", "The Voice of Saruman");
635 if (desc) return _("視界内の全てのモンスターを減速させ、眠らせようとする。抵抗されると無効。", "Attempts to slow and put to sleep all monsters in sight.");
637 /* Stop singing before start another */
638 if (cast || fail) stop_singing(p_ptr);
642 msg_print(_("優しく、魅力的な歌を口ずさみ始めた...", "You start humming a gentle and attractive song..."));
643 start_singing(spell, MUSIC_SARUMAN);
649 if (info) return info_power(power);
654 sleep_monsters(plev);
661 if (name) return _("嵐の音色", "Song of the Tempest");
662 if (desc) return _("轟音のビームを放つ。", "Fires a beam of sound.");
665 DICE_NUMBER dice = 15 + (plev - 1) / 2;
668 if (info) return info_damage(dice, sides, 0);
670 /* Stop singing before start another */
671 if (cast || fail) stop_singing(p_ptr);
675 if (!get_aim_dir(&dir)) return NULL;
677 fire_beam(GF_SOUND, dir, damroll(dice, sides));
683 if (name) return _("もう一つの世界", "Ambarkanta");
684 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
690 if (info) return info_delay(base, sides);
692 /* Stop singing before start another */
693 if (cast || fail) stop_singing(p_ptr);
697 msg_print(_("周囲が変化し始めた...", "You sing of the primeval shaping of Middle-earth..."));
704 if (name) return _("破壊の旋律", "Wrecking Pattern");
705 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
706 "Shakes dungeon structure, and results in random swapping of floors and walls.");
708 /* Stop singing before start another */
709 if (cast || fail) stop_singing(p_ptr);
713 msg_print(_("破壊的な歌が響きわたった...", "You weave a pattern of sounds to contort and shatter..."));
714 start_singing(spell, MUSIC_QUAKE);
720 if (info) return info_radius(rad);
724 earthquake(p_ptr->y, p_ptr->x, 10);
732 if (name) return _("停滞の歌", "Stationary Shriek");
733 if (desc) return _("視界内の全てのモンスターを麻痺させようとする。抵抗されると無効。", "Attempts to freeze all monsters in sight.");
735 /* Stop singing before start another */
736 if (cast || fail) stop_singing(p_ptr);
740 msg_print(_("ゆっくりとしたメロディを奏で始めた...", "You weave a very slow pattern which is almost likely to stop..."));
741 start_singing(spell, MUSIC_STASIS);
745 POWER power = plev * 4;
747 if (info) return info_power(power);
751 stasis_monsters(power);
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.");
763 /* Stop singing before start another */
764 if (cast || fail) stop_singing(p_ptr);
768 msg_print(_("歌が神聖な場を作り出した...", "The holy power of the Music is creating sacred field..."));
775 if (name) return _("英雄の詩", "The Hero's Poem");
776 if (desc) return _("加速し、ヒーロー気分になり、視界内の全てのモンスターにダメージを与える。",
777 "Hastes you. Gives heroism. Damages all monsters in sight.");
779 /* Stop singing before start another */
780 if (cast || fail) stop_singing(p_ptr);
784 msg_print(_("英雄の歌を口ずさんだ...", "You chant a powerful, heroic call to arms..."));
788 /* Recalculate hitpoints */
789 p_ptr->update |= (PU_HP);
791 start_singing(spell, MUSIC_SHERO);
798 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
799 /* Recalculate hitpoints */
800 p_ptr->update |= (PU_HP);
805 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
810 DICE_NUMBER dice = 1;
811 DICE_SID sides = plev * 3;
813 if (info) return info_damage(dice, sides, 0);
817 dispel_monsters(damroll(dice, sides));
823 if (name) return _("ヤヴァンナの助け", "Relief of Yavanna");
824 if (desc) return _("強力な回復の歌で、負傷と朦朧状態も全快する。", "Powerful healing song. Also heals cut and stun completely.");
826 /* Stop singing before start another */
827 if (cast || fail) stop_singing(p_ptr);
831 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing the song..."));
832 start_singing(spell, MUSIC_H_LIFE);
836 DICE_NUMBER dice = 15;
839 if (info) return info_heal(dice, sides, 0);
843 hp_player(damroll(dice, sides));
852 if (name) return _("再生の歌", "Goddess' rebirth");
853 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
856 /* Stop singing before start another */
857 if (cast || fail) stop_singing(p_ptr);
861 msg_print(_("暗黒の中に光と美をふりまいた。体が元の活力を取り戻した。",
862 "You strew light and beauty in the dark as you sing. You feel refreshed."));
863 (void)restore_all_status();
864 (void)restore_level();
870 if (name) return _("サウロンの魔術", "Wizardry of Sauron");
871 if (desc) return _("非常に強力でごく小さい轟音の球を放つ。", "Fires an extremely powerful tiny ball of sound.");
874 DICE_NUMBER dice = 50 + plev;
878 if (info) return info_damage(dice, sides, 0);
880 /* Stop singing before start another */
881 if (cast || fail) stop_singing(p_ptr);
885 if (!get_aim_dir(&dir)) return NULL;
887 fire_ball(GF_SOUND, dir, damroll(dice, sides), rad);
893 if (name) return _("フィンゴルフィンの挑戦", "Fingolfin's Challenge");
894 if (desc) return _("ダメージを受けなくなるバリアを張る。",
895 "Generates a barrier which completely protect you from almost all damage.");
897 /* Stop singing before start another */
898 if (cast || fail) stop_singing(p_ptr);
902 msg_print(_("フィンゴルフィンの冥王への挑戦を歌った...",
903 "You recall the valor of Fingolfin's challenge to the Dark Lord..."));
905 p_ptr->redraw |= (PR_MAP);
906 p_ptr->update |= (PU_MONSTERS);
907 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
909 start_singing(spell, MUSIC_INVULN);
916 msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));
918 p_ptr->redraw |= (PR_MAP);
919 p_ptr->update |= (PU_MONSTERS);
920 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);