3 @brief 魔法のインターフェイスと発動 / Purpose: Do everything for each spell
\r
6 2013 Deskull rearranged comment for Doxygen.
\r
10 #include "selfinfo.h"
\r
11 #include "cmd-quaff.h"
\r
12 #include "spells-summon.h"
\r
13 #include "realm-arcane.h"
\r
14 #include "realm-chaos.h"
\r
15 #include "realm-craft.h"
\r
16 #include "realm-crusade.h"
\r
17 #include "realm-daemon.h"
\r
18 #include "realm-death.h"
\r
19 #include "realm-life.h"
\r
20 #include "realm-nature.h"
\r
21 #include "realm-sorcery.h"
\r
22 #include "realm-trump.h"
\r
26 * 魔法の効果を「キャプション:ダイス+定数値」のフォーマットで出力する / Generate dice info string such as "foo 2d10"
\r
31 * @return フォーマットに従い整形された文字列
\r
33 cptr info_string_dice(cptr str, int dice, int sides, int base)
\r
37 return format("%s%d", str, base);
\r
41 return format("%s%dd%d", str, dice, sides);
\r
43 /* Dice plus base value */
\r
45 return format("%s%dd%d%+d", str, dice, sides, base);
\r
50 * @brief 魔法によるダメージを出力する / Generate damage-dice info string such as "dam 2d10"
\r
54 * @return フォーマットに従い整形された文字列
\r
56 cptr info_damage(int dice, int sides, int base)
\r
58 return info_string_dice(_("損傷:", "dam "), dice, sides, base);
\r
62 * @brief 魔法の効果時間を出力する / Generate duration info string such as "dur 20+1d20"
\r
65 * @return フォーマットに従い整形された文字列
\r
67 cptr info_duration(int base, int sides)
\r
69 return format(_("期間:%d+1d%d", "dur %d+1d%d"), base, sides);
\r
73 * @brief 魔法の効果範囲を出力する / Generate range info string such as "range 5"
\r
75 * @return フォーマットに従い整形された文字列
\r
77 cptr info_range(POSITION range)
\r
79 return format(_("範囲:%d", "range %d"), range);
\r
83 * @brief 魔法による回復量を出力する / Generate heal info string such as "heal 2d8"
\r
87 * @return フォーマットに従い整形された文字列
\r
89 cptr info_heal(int dice, int sides, int base)
\r
91 return info_string_dice(_("回復:", "heal "), dice, sides, base);
\r
95 * @brief 魔法効果発動までの遅延ターンを出力する / Generate delay info string such as "delay 15+1d15"
\r
98 * @return フォーマットに従い整形された文字列
\r
100 cptr info_delay(int base, int sides)
\r
102 return format(_("遅延:%d+1d%d", "delay %d+1d%d"), base, sides);
\r
107 * @brief 魔法によるダメージを出力する(固定値&複数回処理) / Generate multiple-damage info string such as "dam 25 each"
\r
109 * @return フォーマットに従い整形された文字列
\r
111 cptr info_multi_damage(HIT_POINT dam)
\r
113 return format(_("損傷:各%d", "dam %d each"), dam);
\r
118 * @brief 魔法によるダメージを出力する(ダイスのみ&複数回処理) / Generate multiple-damage-dice info string such as "dam 5d2 each"
\r
120 * @param sides ダイス目
\r
121 * @return フォーマットに従い整形された文字列
\r
123 cptr info_multi_damage_dice(int dice, int sides)
\r
125 return format(_("損傷:各%dd%d", "dam %dd%d each"), dice, sides);
\r
129 * @brief 魔法による一般的な効力値を出力する(固定値) / Generate power info string such as "power 100"
\r
131 * @return フォーマットに従い整形された文字列
\r
133 cptr info_power(int power)
\r
135 return format(_("効力:%d", "power %d"), power);
\r
140 * @brief 魔法による一般的な効力値を出力する(ダイス値) / Generate power info string such as "power 100"
\r
142 * @param sides ダイス目
\r
143 * @return フォーマットに従い整形された文字列
\r
146 * Generate power info string such as "power 1d100"
\r
148 cptr info_power_dice(int dice, int sides)
\r
150 return format(_("効力:%dd%d", "power %dd%d"), dice, sides);
\r
155 * @brief 魔法の効果半径を出力する / Generate radius info string such as "rad 100"
\r
157 * @return フォーマットに従い整形された文字列
\r
159 cptr info_radius(int rad)
\r
161 return format(_("半径:%d", "rad %d"), rad);
\r
166 * @brief 魔法効果の限界重量を出力する / Generate weight info string such as "max wgt 15"
\r
167 * @param weight 最大重量
\r
168 * @return フォーマットに従い整形された文字列
\r
170 cptr info_weight(int weight)
\r
173 return format("最大重量:%d.%dkg", lbtokg1(weight), lbtokg2(weight));
\r
175 return format("max wgt %d", weight/10);
\r
181 * @brief 歌の開始を処理する / Start singing if the player is a Bard
\r
182 * @param spell 領域魔法としてのID
\r
183 * @param song 魔法効果のID
\r
186 static void start_singing(SPELL_IDX spell, MAGIC_NUM1 song)
\r
188 /* Remember the song index */
\r
189 SINGING_SONG_EFFECT(p_ptr) = (MAGIC_NUM1)song;
\r
191 /* Remember the index of the spell which activated the song */
\r
192 SINGING_SONG_ID(p_ptr) = (MAGIC_NUM2)spell;
\r
195 /* Now the player is singing */
\r
196 set_action(ACTION_SING);
\r
199 /* Recalculate bonuses */
\r
200 p_ptr->update |= (PU_BONUS);
\r
202 /* Redraw status bar */
\r
203 p_ptr->redraw |= (PR_STATUS);
\r
207 * @brief 歌の停止を処理する / Stop singing if the player is a Bard
\r
210 void stop_singing(void)
\r
212 if (p_ptr->pclass != CLASS_BARD) return;
\r
214 /* Are there interupted song? */
\r
215 if (INTERUPTING_SONG_EFFECT(p_ptr))
\r
217 /* Forget interupted song */
\r
218 INTERUPTING_SONG_EFFECT(p_ptr) = MUSIC_NONE;
\r
222 /* The player is singing? */
\r
223 if (!SINGING_SONG_EFFECT(p_ptr)) return;
\r
225 /* Hack -- if called from set_action(), avoid recursive loop */
\r
226 if (p_ptr->action == ACTION_SING) set_action(ACTION_NONE);
\r
228 /* Message text of each song or etc. */
\r
229 do_spell(REALM_MUSIC, SINGING_SONG_ID(p_ptr), SPELL_STOP);
\r
231 SINGING_SONG_EFFECT(p_ptr) = MUSIC_NONE;
\r
232 SINGING_SONG_ID(p_ptr) = 0;
\r
234 /* Recalculate bonuses */
\r
235 p_ptr->update |= (PU_BONUS);
\r
237 /* Redraw status bar */
\r
238 p_ptr->redraw |= (PR_STATUS);
\r
244 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP)
\r
245 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
\r
247 static cptr do_music_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
249 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
250 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
251 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
252 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
253 bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
\r
254 bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
\r
255 bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
\r
256 static const char s_dam[] = _("損傷:", "dam ");
\r
259 int plev = p_ptr->lev;
\r
264 if (name) return _("遅鈍の歌", "Song of Holding");
\r
265 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
\r
267 /* Stop singing before start another */
\r
268 if (cast || fail) stop_singing();
\r
272 msg_print(_("ゆっくりとしたメロディを口ずさみ始めた...", "You start humming a slow, steady melody..."));
\r
273 start_singing(spell, MUSIC_SLOW);
\r
279 if (info) return info_power(power);
\r
283 slow_monsters(plev);
\r
289 if (name) return _("祝福の歌", "Song of Blessing");
\r
290 if (desc) return _("命中率とACのボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
\r
292 /* Stop singing before start another */
\r
293 if (cast || fail) stop_singing();
\r
297 msg_print(_("厳かなメロディを奏で始めた...", "The holy power of the Music of the Ainur enters you..."));
\r
298 start_singing(spell, MUSIC_BLESS);
\r
303 if (!p_ptr->blessed)
\r
305 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
\r
312 if (name) return _("崩壊の音色", "Wrecking Note");
\r
313 if (desc) return _("轟音のボルトを放つ。", "Fires a bolt of sound.");
\r
315 /* Stop singing before start another */
\r
316 if (cast || fail) stop_singing();
\r
319 int dice = 4 + (plev - 1) / 5;
\r
322 if (info) return info_damage(dice, sides, 0);
\r
326 if (!get_aim_dir(&dir)) return NULL;
\r
328 fire_bolt(GF_SOUND, dir, damroll(dice, sides));
\r
334 if (name) return _("朦朧の旋律", "Stun Pattern");
\r
335 if (desc) return _("視界内の全てのモンスターを朦朧させる。抵抗されると無効。", "Attempts to stun all monsters in sight.");
\r
337 /* Stop singing before start another */
\r
338 if (cast || fail) stop_singing();
\r
342 msg_print(_("眩惑させるメロディを奏で始めた...", "You weave a pattern of sounds to bewilder and daze..."));
\r
343 start_singing(spell, MUSIC_STUN);
\r
347 int dice = plev / 10;
\r
350 if (info) return info_power_dice(dice, sides);
\r
354 stun_monsters(damroll(dice, sides));
\r
361 if (name) return _("生命の流れ", "Flow of Life");
\r
362 if (desc) return _("体力を少し回復させる。", "Heals HP a little.");
\r
364 /* Stop singing before start another */
\r
365 if (cast || fail) stop_singing();
\r
369 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing a song of healing..."));
\r
370 start_singing(spell, MUSIC_L_LIFE);
\r
377 if (info) return info_heal(dice, sides, 0);
\r
381 hp_player(damroll(dice, sides));
\r
388 if (name) return _("太陽の歌", "Song of the Sun");
\r
389 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
\r
391 /* Stop singing before start another */
\r
392 if (cast || fail) stop_singing();
\r
396 int sides = plev / 2;
\r
397 int rad = plev / 10 + 1;
\r
399 if (info) return info_damage(dice, sides, 0);
\r
403 msg_print(_("光り輝く歌が辺りを照らした。", "Your uplifting song brings brightness to dark places..."));
\r
404 lite_area(damroll(dice, sides), rad);
\r
410 if (name) return _("恐怖の歌", "Song of Fear");
\r
411 if (desc) return _("視界内の全てのモンスターを恐怖させる。抵抗されると無効。", "Attempts to scare all monsters in sight.");
\r
413 /* Stop singing before start another */
\r
414 if (cast || fail) stop_singing();
\r
418 msg_print(_("おどろおどろしいメロディを奏で始めた...", "You start weaving a fearful pattern..."));
\r
419 start_singing(spell, MUSIC_FEAR);
\r
425 if (info) return info_power(power);
\r
429 project_hack(GF_TURN_ALL, power);
\r
436 if (name) return _("戦いの歌", "Heroic Ballad");
\r
437 if (desc) return _("ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
439 /* Stop singing before start another */
\r
440 if (cast || fail) stop_singing();
\r
444 msg_print(_("激しい戦いの歌を歌った...", "You start singing a song of intense fighting..."));
\r
446 (void)hp_player(10);
\r
447 (void)set_afraid(0);
\r
449 /* Recalculate hitpoints */
\r
450 p_ptr->update |= (PU_HP);
\r
452 start_singing(spell, MUSIC_HERO);
\r
459 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
\r
460 /* Recalculate hitpoints */
\r
461 p_ptr->update |= (PU_HP);
\r
468 if (name) return _("霊的知覚", "Clairaudience");
\r
469 if (desc) return _("近くの罠/扉/階段を感知する。レベル15で全てのモンスター、20で財宝とアイテムを感知できるようになる。レベル25で周辺の地形を感知し、40でその階全体を永久に照らし、ダンジョン内のすべてのアイテムを感知する。この効果は歌い続けることで順に起こる。",
\r
470 "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.");
\r
472 /* Stop singing before start another */
\r
473 if (cast || fail) stop_singing();
\r
477 msg_print(_("静かな音楽が感覚を研ぎ澄まさせた...", "Your quiet music sharpens your sense of hearing..."));
\r
478 /* Hack -- Initialize the turn count */
\r
479 SINGING_COUNT(p_ptr) = 0;
\r
480 start_singing(spell, MUSIC_DETECT);
\r
484 int rad = DETECT_RAD_DEFAULT;
\r
486 if (info) return info_radius(rad);
\r
490 int count = SINGING_COUNT(p_ptr);
\r
492 if (count >= 19) wiz_lite(FALSE);
\r
496 if (plev > 39 && count < 19)
\r
497 SINGING_COUNT(p_ptr) = count + 1;
\r
501 /* There are too many hidden treasure. So... */
\r
502 /* detect_treasure(rad); */
\r
503 detect_objects_gold(rad);
\r
504 detect_objects_normal(rad);
\r
506 if (plev > 24 && count < 11)
\r
507 SINGING_COUNT(p_ptr) = count + 1;
\r
511 detect_monsters_invis(rad);
\r
512 detect_monsters_normal(rad);
\r
514 if (plev > 19 && count < 6)
\r
515 SINGING_COUNT(p_ptr) = count + 1;
\r
517 detect_traps(rad, TRUE);
\r
519 detect_stairs(rad);
\r
521 if (plev > 14 && count < 3)
\r
522 SINGING_COUNT(p_ptr) = count + 1;
\r
529 if (name) return _("魂の歌", "Soul Shriek");
\r
530 if (desc) return _("視界内の全てのモンスターに対して精神攻撃を行う。", "Damages all monsters in sight with PSI damages.");
\r
532 /* Stop singing before start another */
\r
533 if (cast || fail) stop_singing();
\r
537 msg_print(_("精神を捻じ曲げる歌を歌った...", "You start singing a song of soul in pain..."));
\r
538 start_singing(spell, MUSIC_PSI);
\r
543 int sides = plev * 3 / 2;
\r
545 if (info) return info_damage(dice, sides, 0);
\r
549 project_hack(GF_PSI, damroll(dice, sides));
\r
556 if (name) return _("知識の歌", "Song of Lore");
\r
557 if (desc) return _("自分のいるマスと隣りのマスに落ちているアイテムを鑑定する。", "Identifies all items which are in the adjacent squares.");
\r
559 /* Stop singing before start another */
\r
560 if (cast || fail) stop_singing();
\r
564 msg_print(_("この世界の知識が流れ込んできた...", "You recall the rich lore of the world..."));
\r
565 start_singing(spell, MUSIC_ID);
\r
571 if (info) return info_radius(rad);
\r
575 * MP不足で鑑定が発動される前に歌が中断してしまうのを防止。
\r
579 project(0, rad, p_ptr->y, p_ptr->x, 0, GF_IDENTIFY, PROJECT_ITEM, -1);
\r
586 if (name) return _("隠遁の歌", "Hiding Tune");
\r
587 if (desc) return _("隠密行動能力を上昇させる。", "Gives improved stealth.");
\r
589 /* Stop singing before start another */
\r
590 if (cast || fail) stop_singing();
\r
594 msg_print(_("あなたの姿が景色にとけこんでいった...", "Your song carries you beyond the sight of mortal eyes..."));
\r
595 start_singing(spell, MUSIC_STEALTH);
\r
600 if (!p_ptr->tim_stealth)
\r
602 msg_print(_("姿がはっきりと見えるようになった。", "You are no longer hided."));
\r
609 if (name) return _("幻影の旋律", "Illusion Pattern");
\r
610 if (desc) return _("視界内の全てのモンスターを混乱させる。抵抗されると無効。", "Attempts to confuse all monsters in sight.");
\r
612 /* Stop singing before start another */
\r
613 if (cast || fail) stop_singing();
\r
617 msg_print(_("辺り一面に幻影が現れた...", "You weave a pattern of sounds to beguile and confuse..."));
\r
618 start_singing(spell, MUSIC_CONF);
\r
622 int power = plev * 2;
\r
624 if (info) return info_power(power);
\r
628 confuse_monsters(power);
\r
635 if (name) return _("破滅の叫び", "Doomcall");
\r
636 if (desc) return _("視界内の全てのモンスターに対して轟音攻撃を行う。", "Damages all monsters in sight with booming sound.");
\r
638 /* Stop singing before start another */
\r
639 if (cast || fail) stop_singing();
\r
643 msg_print(_("轟音が響いた...", "The fury of the Downfall of Numenor lashes out..."));
\r
644 start_singing(spell, MUSIC_SOUND);
\r
648 int dice = 10 + plev / 5;
\r
651 if (info) return info_damage(dice, sides, 0);
\r
655 project_hack(GF_SOUND, damroll(dice, sides));
\r
662 if (name) return _("フィリエルの歌", "Firiel's Song");
\r
663 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
\r
666 /* Stop singing before start another */
\r
667 if (cast || fail) stop_singing();
\r
671 msg_print(_("生命と復活のテーマを奏で始めた...", "The themes of life and revival are woven into your song..."));
\r
672 animate_dead(0, p_ptr->y, p_ptr->x);
\r
678 if (name) return _("旅の仲間", "Fellowship Chant");
\r
679 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
\r
681 /* Stop singing before start another */
\r
682 if (cast || fail) stop_singing();
\r
686 msg_print(_("安らかなメロディを奏で始めた...", "You weave a slow, soothing melody of imploration..."));
\r
687 start_singing(spell, MUSIC_CHARM);
\r
691 int dice = 10 + plev / 15;
\r
694 if (info) return info_power_dice(dice, sides);
\r
698 charm_monsters(damroll(dice, sides));
\r
705 if (name) return _("分解音波", "Sound of disintegration");
\r
706 if (desc) return _("壁を掘り進む。自分の足元のアイテムは蒸発する。", "Makes you be able to burrow into walls. Objects under your feet evaporate.");
\r
708 /* Stop singing before start another */
\r
709 if (cast || fail) stop_singing();
\r
713 msg_print(_("粉砕するメロディを奏で始めた...", "You weave a violent pattern of sounds to break wall."));
\r
714 start_singing(spell, MUSIC_WALL);
\r
720 * MP不足で効果が発動される前に歌が中断してしまうのを防止。
\r
724 project(0, 0, p_ptr->y, p_ptr->x,
\r
725 0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1);
\r
731 if (name) return _("元素耐性", "Finrod's Resistance");
\r
732 if (desc) return _("酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
\r
733 "Gives resistance to fire, cold, electricity, acid and poison. These resistances can be added to which from equipment for more powerful resistances.");
\r
735 /* Stop singing before start another */
\r
736 if (cast || fail) stop_singing();
\r
740 msg_print(_("元素の力に対する忍耐の歌を歌った。", "You sing a song of perseverance against powers..."));
\r
741 start_singing(spell, MUSIC_RESIST);
\r
746 if (!p_ptr->oppose_acid)
\r
748 msg_print(_("酸への耐性が薄れた気がする。", "You feel less resistant to acid."));
\r
751 if (!p_ptr->oppose_elec)
\r
753 msg_print(_("電撃への耐性が薄れた気がする。", "You feel less resistant to elec."));
\r
756 if (!p_ptr->oppose_fire)
\r
758 msg_print(_("火への耐性が薄れた気がする。", "You feel less resistant to fire."));
\r
761 if (!p_ptr->oppose_cold)
\r
763 msg_print(_("冷気への耐性が薄れた気がする。", "You feel less resistant to cold."));
\r
766 if (!p_ptr->oppose_pois)
\r
768 msg_print(_("毒への耐性が薄れた気がする。", "You feel less resistant to pois."));
\r
775 if (name) return _("ホビットのメロディ", "Hobbit Melodies");
\r
776 if (desc) return _("加速する。", "Hastes you.");
\r
778 /* Stop singing before start another */
\r
779 if (cast || fail) stop_singing();
\r
783 msg_print(_("軽快な歌を口ずさみ始めた...", "You start singing joyful pop song..."));
\r
784 start_singing(spell, MUSIC_SPEED);
\r
791 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
\r
798 if (name) return _("歪んだ世界", "World Contortion");
\r
799 if (desc) return _("近くのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all nearby monsters away unless resisted.");
\r
802 int rad = plev / 15 + 1;
\r
803 int power = plev * 3 + 1;
\r
805 if (info) return info_radius(rad);
\r
807 /* Stop singing before start another */
\r
808 if (cast || fail) stop_singing();
\r
812 msg_print(_("歌が空間を歪めた...", "Reality whirls wildly as you sing a dizzying melody..."));
\r
813 project(0, rad, p_ptr->y, p_ptr->x, power, GF_AWAY_ALL, PROJECT_KILL, -1);
\r
819 if (name) return _("退散の歌", "Dispelling chant");
\r
820 if (desc) return _("視界内の全てのモンスターにダメージを与える。邪悪なモンスターに特に大きなダメージを与える。",
\r
821 "Damages all monsters in sight. Hurts evil monsters greatly.");
\r
823 /* Stop singing before start another */
\r
824 if (cast || fail) stop_singing();
\r
828 msg_print(_("耐えられない不協和音が敵を責め立てた...", "You cry out in an ear-wracking voice..."));
\r
829 start_singing(spell, MUSIC_DISPEL);
\r
833 int m_sides = plev * 3;
\r
834 int e_sides = plev * 3;
\r
836 if (info) return format("%s1d%d+1d%d", s_dam, m_sides, e_sides);
\r
840 dispel_monsters(randint1(m_sides));
\r
841 dispel_evil(randint1(e_sides));
\r
847 if (name) return _("サルマンの甘言", "The Voice of Saruman");
\r
848 if (desc) return _("視界内の全てのモンスターを減速させ、眠らせようとする。抵抗されると無効。", "Attempts to slow and sleep all monsters in sight.");
\r
850 /* Stop singing before start another */
\r
851 if (cast || fail) stop_singing();
\r
855 msg_print(_("優しく、魅力的な歌を口ずさみ始めた...", "You start humming a gentle and attractive song..."));
\r
856 start_singing(spell, MUSIC_SARUMAN);
\r
862 if (info) return info_power(power);
\r
866 slow_monsters(plev);
\r
867 sleep_monsters(plev);
\r
874 if (name) return _("嵐の音色", "Song of the Tempest");
\r
875 if (desc) return _("轟音のビームを放つ。", "Fires a beam of sound.");
\r
878 int dice = 15 + (plev - 1) / 2;
\r
881 if (info) return info_damage(dice, sides, 0);
\r
883 /* Stop singing before start another */
\r
884 if (cast || fail) stop_singing();
\r
888 if (!get_aim_dir(&dir)) return NULL;
\r
890 fire_beam(GF_SOUND, dir, damroll(dice, sides));
\r
896 if (name) return _("もう一つの世界", "Ambarkanta");
\r
897 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
\r
903 if (info) return info_delay(base, sides);
\r
905 /* Stop singing before start another */
\r
906 if (cast || fail) stop_singing();
\r
910 msg_print(_("周囲が変化し始めた...", "You sing of the primeval shaping of Middle-earth..."));
\r
917 if (name) return _("破壊の旋律", "Wrecking Pattern");
\r
918 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
\r
919 "Shakes dungeon structure, and results in random swapping of floors and walls.");
\r
921 /* Stop singing before start another */
\r
922 if (cast || fail) stop_singing();
\r
926 msg_print(_("破壊的な歌が響きわたった...", "You weave a pattern of sounds to contort and shatter..."));
\r
927 start_singing(spell, MUSIC_QUAKE);
\r
933 if (info) return info_radius(rad);
\r
937 earthquake(p_ptr->y, p_ptr->x, 10);
\r
945 if (name) return _("停滞の歌", "Stationary Shriek");
\r
946 if (desc) return _("視界内の全てのモンスターを麻痺させようとする。抵抗されると無効。", "Attempts to freeze all monsters in sight.");
\r
948 /* Stop singing before start another */
\r
949 if (cast || fail) stop_singing();
\r
953 msg_print(_("ゆっくりとしたメロディを奏で始めた...", "You weave a very slow pattern which is almost likely to stop..."));
\r
954 start_singing(spell, MUSIC_STASIS);
\r
958 int power = plev * 4;
\r
960 if (info) return info_power(power);
\r
964 stasis_monsters(power);
\r
971 if (name) return _("守りの歌", "Endurance");
\r
972 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。",
\r
973 "Sets a glyph on the floor beneath you. Monsters cannot attack you if you are on a glyph, but can try to break glyph.");
\r
976 /* Stop singing before start another */
\r
977 if (cast || fail) stop_singing();
\r
981 msg_print(_("歌が神聖な場を作り出した...", "The holy power of the Music is creating sacred field..."));
\r
988 if (name) return _("英雄の詩", "The Hero's Poem");
\r
989 if (desc) return _("加速し、ヒーロー気分になり、視界内の全てのモンスターにダメージを与える。",
\r
990 "Hastes you. Gives heroism. Damages all monsters in sight.");
\r
992 /* Stop singing before start another */
\r
993 if (cast || fail) stop_singing();
\r
997 msg_print(_("英雄の歌を口ずさんだ...", "You chant a powerful, heroic call to arms..."));
\r
998 (void)hp_player(10);
\r
999 (void)set_afraid(0);
\r
1001 /* Recalculate hitpoints */
\r
1002 p_ptr->update |= (PU_HP);
\r
1004 start_singing(spell, MUSIC_SHERO);
\r
1011 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
\r
1012 /* Recalculate hitpoints */
\r
1013 p_ptr->update |= (PU_HP);
\r
1018 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
\r
1024 int sides = plev * 3;
\r
1026 if (info) return info_damage(dice, sides, 0);
\r
1030 dispel_monsters(damroll(dice, sides));
\r
1036 if (name) return _("ヤヴァンナの助け", "Relief of Yavanna");
\r
1037 if (desc) return _("強力な回復の歌で、負傷と朦朧状態も全快する。", "Powerful healing song. Also heals cut and stun completely.");
\r
1039 /* Stop singing before start another */
\r
1040 if (cast || fail) stop_singing();
\r
1044 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing the song..."));
\r
1045 start_singing(spell, MUSIC_H_LIFE);
\r
1052 if (info) return info_heal(dice, sides, 0);
\r
1056 hp_player(damroll(dice, sides));
\r
1065 if (name) return _("再生の歌", "Goddess' rebirth");
\r
1066 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
\r
1069 /* Stop singing before start another */
\r
1070 if (cast || fail) stop_singing();
\r
1074 msg_print(_("暗黒の中に光と美をふりまいた。体が元の活力を取り戻した。",
\r
1075 "You strewed light and beauty in the dark as you sing. You feel refreshed."));
\r
1076 (void)do_res_stat(A_STR);
\r
1077 (void)do_res_stat(A_INT);
\r
1078 (void)do_res_stat(A_WIS);
\r
1079 (void)do_res_stat(A_DEX);
\r
1080 (void)do_res_stat(A_CON);
\r
1081 (void)do_res_stat(A_CHR);
\r
1082 (void)restore_level();
\r
1088 if (name) return _("サウロンの魔術", "Wizardry of Sauron");
\r
1089 if (desc) return _("非常に強力でごく小さい轟音の球を放つ。", "Fires an extremely powerful tiny ball of sound.");
\r
1092 int dice = 50 + plev;
\r
1096 if (info) return info_damage(dice, sides, 0);
\r
1098 /* Stop singing before start another */
\r
1099 if (cast || fail) stop_singing();
\r
1103 if (!get_aim_dir(&dir)) return NULL;
\r
1105 fire_ball(GF_SOUND, dir, damroll(dice, sides), rad);
\r
1111 if (name) return _("フィンゴルフィンの挑戦", "Fingolfin's Challenge");
\r
1112 if (desc) return _("ダメージを受けなくなるバリアを張る。",
\r
1113 "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks.");
\r
1115 /* Stop singing before start another */
\r
1116 if (cast || fail) stop_singing();
\r
1120 msg_print(_("フィンゴルフィンの冥王への挑戦を歌った...",
\r
1121 "You recall the valor of Fingolfin's challenge to the Dark Lord..."));
\r
1124 p_ptr->redraw |= (PR_MAP);
\r
1126 /* Update monsters */
\r
1127 p_ptr->update |= (PU_MONSTERS);
\r
1129 /* Window stuff */
\r
1130 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
\r
1132 start_singing(spell, MUSIC_INVULN);
\r
1137 if (!p_ptr->invuln)
\r
1139 msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));
\r
1141 p_ptr->redraw |= (PR_MAP);
\r
1143 /* Update monsters */
\r
1144 p_ptr->update |= (PU_MONSTERS);
\r
1146 /* Window stuff */
\r
1147 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
\r
1158 * @brief 剣術の各処理を行う
\r
1159 * @param spell 剣術ID
\r
1160 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_CAST)
\r
1161 * @return SPELL_NAME / SPELL_DESC 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
1163 static cptr do_hissatsu_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
1165 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
1166 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
1167 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
1170 int plev = p_ptr->lev;
\r
1175 if (name) return _("飛飯綱", "Tobi-Izuna");
\r
1176 if (desc) return _("2マス離れたところにいるモンスターを攻撃する。", "Attacks a two squares distant monster.");
\r
1180 project_length = 2;
\r
1181 if (!get_aim_dir(&dir)) return NULL;
\r
1183 project_hook(GF_ATTACK, dir, HISSATSU_2, PROJECT_STOP | PROJECT_KILL);
\r
1188 if (name) return _("五月雨斬り", "3-Way Attack");
\r
1189 if (desc) return _("3方向に対して攻撃する。", "Attacks in 3 directions in one time.");
\r
1196 if (!get_rep_dir2(&dir)) return NULL;
\r
1197 if (dir == 5) return NULL;
\r
1199 for (cdir = 0;cdir < 8; cdir++)
\r
1201 if (cdd[cdir] == dir) break;
\r
1204 if (cdir == 8) return NULL;
\r
1206 y = p_ptr->y + ddy_cdd[cdir];
\r
1207 x = p_ptr->x + ddx_cdd[cdir];
\r
1208 if (cave[y][x].m_idx)
\r
1209 py_attack(y, x, 0);
\r
1211 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
\r
1213 y = p_ptr->y + ddy_cdd[(cdir + 7) % 8];
\r
1214 x = p_ptr->x + ddx_cdd[(cdir + 7) % 8];
\r
1215 if (cave[y][x].m_idx)
\r
1216 py_attack(y, x, 0);
\r
1218 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
\r
1220 y = p_ptr->y + ddy_cdd[(cdir + 1) % 8];
\r
1221 x = p_ptr->x + ddx_cdd[(cdir + 1) % 8];
\r
1222 if (cave[y][x].m_idx)
\r
1223 py_attack(y, x, 0);
\r
1225 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
\r
1230 if (name) return _("ブーメラン", "Boomerang");
\r
1231 if (desc) return _("武器を手元に戻ってくるように投げる。戻ってこないこともある。",
\r
1232 "Throws current weapon. And it'll return to your hand unless failed.");
\r
1236 if (!do_cmd_throw(1, TRUE, -1)) return NULL;
\r
1241 if (name) return _("焔霊", "Burning Strike");
\r
1242 if (desc) return _("火炎耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to fire.");
\r
1248 if (!get_rep_dir2(&dir)) return NULL;
\r
1249 if (dir == 5) return NULL;
\r
1251 y = p_ptr->y + ddy[dir];
\r
1252 x = p_ptr->x + ddx[dir];
\r
1254 if (cave[y][x].m_idx)
\r
1255 py_attack(y, x, HISSATSU_FIRE);
\r
1258 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
1265 if (name) return _("殺気感知", "Detect Ferocity");
\r
1266 if (desc) return _("近くの思考することができるモンスターを感知する。", "Detects all monsters except mindless in your vicinity.");
\r
1270 detect_monsters_mind(DETECT_RAD_DEFAULT);
\r
1275 if (name) return _("みね打ち", "Strike to Stun");
\r
1276 if (desc) return _("相手にダメージを与えないが、朦朧とさせる。", "Attempts to stun a monster in the adjacent.");
\r
1282 if (!get_rep_dir2(&dir)) return NULL;
\r
1283 if (dir == 5) return NULL;
\r
1285 y = p_ptr->y + ddy[dir];
\r
1286 x = p_ptr->x + ddx[dir];
\r
1288 if (cave[y][x].m_idx)
\r
1289 py_attack(y, x, HISSATSU_MINEUCHI);
\r
1292 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
1299 if (name) return _("カウンター", "Counter");
\r
1300 if (desc) return _("相手に攻撃されたときに反撃する。反撃するたびにMPを消費。",
\r
1301 "Prepares to counterattack. When attack by a monster, strikes back using SP each time.");
\r
1305 if (p_ptr->riding)
\r
1307 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
\r
1310 msg_print(_("相手の攻撃に対して身構えた。", "You prepare to counter blow."));
\r
1311 p_ptr->counter = TRUE;
\r
1316 if (name) return _("払い抜け", "Harainuke");
\r
1317 if (desc) return _("攻撃した後、反対側に抜ける。",
\r
1318 "Attacks monster with your weapons normally, then move through counter side of the monster.");
\r
1324 if (p_ptr->riding)
\r
1326 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
\r
1330 if (!get_rep_dir2(&dir)) return NULL;
\r
1332 if (dir == 5) return NULL;
\r
1333 y = p_ptr->y + ddy[dir];
\r
1334 x = p_ptr->x + ddx[dir];
\r
1336 if (!cave[y][x].m_idx)
\r
1338 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
1342 py_attack(y, x, 0);
\r
1344 if (!player_can_enter(cave[y][x].feat, 0) || is_trap(cave[y][x].feat))
\r
1350 if (player_can_enter(cave[y][x].feat, 0) && !is_trap(cave[y][x].feat) && !cave[y][x].m_idx)
\r
1354 /* Move the player */
\r
1355 (void)move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);
\r
1361 if (name) return _("サーペンツタン", "Serpent's Tongue");
\r
1362 if (desc) return _("毒耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to poison.");
\r
1368 if (!get_rep_dir2(&dir)) return NULL;
\r
1369 if (dir == 5) return NULL;
\r
1371 y = p_ptr->y + ddy[dir];
\r
1372 x = p_ptr->x + ddx[dir];
\r
1374 if (cave[y][x].m_idx)
\r
1375 py_attack(y, x, HISSATSU_POISON);
\r
1378 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
1385 if (name) return _("斬魔剣弐の太刀", "Zammaken");
\r
1386 if (desc) return _("生命のない邪悪なモンスターに大ダメージを与えるが、他のモンスターには全く効果がない。",
\r
1387 "Attacks an evil unliving monster with great damage. No effect to other monsters.");
\r
1393 if (!get_rep_dir2(&dir)) return NULL;
\r
1394 if (dir == 5) return NULL;
\r
1396 y = p_ptr->y + ddy[dir];
\r
1397 x = p_ptr->x + ddx[dir];
\r
1399 if (cave[y][x].m_idx)
\r
1400 py_attack(y, x, HISSATSU_ZANMA);
\r
1403 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
1410 if (name) return _("裂風剣", "Wind Blast");
\r
1411 if (desc) return _("攻撃した相手を後方へ吹き飛ばす。", "Attacks an adjacent monster, and blow it away.");
\r
1417 if (!get_rep_dir2(&dir)) return NULL;
\r
1418 if (dir == 5) return NULL;
\r
1420 y = p_ptr->y + ddy[dir];
\r
1421 x = p_ptr->x + ddx[dir];
\r
1423 if (cave[y][x].m_idx)
\r
1424 py_attack(y, x, 0);
\r
1427 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
1430 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
\r
1434 if (cave[y][x].m_idx)
\r
1437 POSITION ty = y, tx = x;
\r
1438 POSITION oy = y, ox = x;
\r
1439 MONSTER_IDX m_idx = cave[y][x].m_idx;
\r
1440 monster_type *m_ptr = &m_list[m_idx];
\r
1443 monster_desc(m_name, m_ptr, 0);
\r
1445 for (i = 0; i < 5; i++)
\r
1449 if (cave_empty_bold(y, x))
\r
1456 if ((ty != oy) || (tx != ox))
\r
1458 msg_format(_("%sを吹き飛ばした!", "You blow %s away!"), m_name);
\r
1459 cave[oy][ox].m_idx = 0;
\r
1460 cave[ty][tx].m_idx = m_idx;
\r
1464 update_mon(m_idx, TRUE);
\r
1465 lite_spot(oy, ox);
\r
1466 lite_spot(ty, tx);
\r
1468 if (r_info[m_ptr->r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))
\r
1469 p_ptr->update |= (PU_MON_LITE);
\r
1476 if (name) return _("刀匠の目利き", "Judge");
\r
1477 if (desc) return _("武器・防具を1つ識別する。レベル45以上で武器・防具の能力を完全に知ることができる。",
\r
1478 "Identifies a weapon or armor. Or *identifies* these at level 45.");
\r
1484 if (!identify_fully(TRUE)) return NULL;
\r
1488 if (!ident_spell(TRUE)) return NULL;
\r
1494 if (name) return _("破岩斬", "Rock Smash");
\r
1495 if (desc) return _("岩を壊し、岩石系のモンスターに大ダメージを与える。", "Breaks rock. Or greatly damage a monster made by rocks.");
\r
1501 if (!get_rep_dir2(&dir)) return NULL;
\r
1502 if (dir == 5) return NULL;
\r
1504 y = p_ptr->y + ddy[dir];
\r
1505 x = p_ptr->x + ddx[dir];
\r
1507 if (cave[y][x].m_idx)
\r
1508 py_attack(y, x, HISSATSU_HAGAN);
\r
1510 if (!cave_have_flag_bold(y, x, FF_HURT_ROCK)) break;
\r
1512 /* Destroy the feature */
\r
1513 cave_alter_feat(y, x, FF_HURT_ROCK);
\r
1515 /* Update some things */
\r
1516 p_ptr->update |= (PU_FLOW);
\r
1521 if (name) return _("乱れ雪月花", "Midare-Setsugekka");
\r
1522 if (desc) return _("攻撃回数が増え、冷気耐性のないモンスターに大ダメージを与える。",
\r
1523 "Attacks a monster with increased number of attacks and more damage unless it has resistance to cold.");
\r
1529 if (!get_rep_dir2(&dir)) return NULL;
\r
1530 if (dir == 5) return NULL;
\r
1532 y = p_ptr->y + ddy[dir];
\r
1533 x = p_ptr->x + ddx[dir];
\r
1535 if (cave[y][x].m_idx)
\r
1536 py_attack(y, x, HISSATSU_COLD);
\r
1539 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
1546 if (name) return _("急所突き", "Spot Aiming");
\r
1547 if (desc) return _("モンスターを一撃で倒す攻撃を繰り出す。失敗すると1点しかダメージを与えられない。",
\r
1548 "Attempts to kill a monster instantly. If failed cause only 1HP of damage.");
\r
1554 if (!get_rep_dir2(&dir)) return NULL;
\r
1555 if (dir == 5) return NULL;
\r
1557 y = p_ptr->y + ddy[dir];
\r
1558 x = p_ptr->x + ddx[dir];
\r
1560 if (cave[y][x].m_idx)
\r
1561 py_attack(y, x, HISSATSU_KYUSHO);
\r
1564 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
1571 if (name) return _("魔神斬り", "Majingiri");
\r
1572 if (desc) return _("会心の一撃で攻撃する。攻撃がかわされやすい。",
\r
1573 "Attempts to attack with critical hit. But this attack is easy to evade for a monster.");
\r
1579 if (!get_rep_dir2(&dir)) return NULL;
\r
1580 if (dir == 5) return NULL;
\r
1582 y = p_ptr->y + ddy[dir];
\r
1583 x = p_ptr->x + ddx[dir];
\r
1585 if (cave[y][x].m_idx)
\r
1586 py_attack(y, x, HISSATSU_MAJIN);
\r
1589 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
1596 if (name) return _("捨て身", "Desperate Attack");
\r
1597 if (desc) return _("強力な攻撃を繰り出す。次のターンまでの間、食らうダメージが増える。",
\r
1598 "Attacks with all of your power. But all damages you take will be doubled for one turn.");
\r
1604 if (!get_rep_dir2(&dir)) return NULL;
\r
1605 if (dir == 5) return NULL;
\r
1607 y = p_ptr->y + ddy[dir];
\r
1608 x = p_ptr->x + ddx[dir];
\r
1610 if (cave[y][x].m_idx)
\r
1611 py_attack(y, x, HISSATSU_SUTEMI);
\r
1614 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
1617 p_ptr->sutemi = TRUE;
\r
1622 if (name) return _("雷撃鷲爪斬", "Lightning Eagle");
\r
1623 if (desc) return _("電撃耐性のないモンスターに非常に大きいダメージを与える。",
\r
1624 "Attacks a monster with more damage unless it has resistance to electricity.");
\r
1630 if (!get_rep_dir2(&dir)) return NULL;
\r
1631 if (dir == 5) return NULL;
\r
1633 y = p_ptr->y + ddy[dir];
\r
1634 x = p_ptr->x + ddx[dir];
\r
1636 if (cave[y][x].m_idx)
\r
1637 py_attack(y, x, HISSATSU_ELEC);
\r
1640 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
1647 if (name) return _("入身", "Rush Attack");
\r
1648 if (desc) return _("素早く相手に近寄り攻撃する。", "Steps close to a monster and attacks at a time.");
\r
1652 if (!rush_attack(NULL)) return NULL;
\r
1657 if (name) return _("赤流渦", "Bloody Maelstrom");
\r
1658 if (desc) return _("自分自身も傷を作りつつ、その傷が深いほど大きい威力で全方向の敵を攻撃できる。生きていないモンスターには効果がない。",
\r
1659 "Attacks all adjacent monsters with power corresponding to your cut status. Then increases your cut status. No effect to unliving monsters.");
\r
1666 monster_type *m_ptr;
\r
1668 if (p_ptr->cut < 300)
\r
1669 set_cut(p_ptr->cut + 300);
\r
1671 set_cut(p_ptr->cut * 2);
\r
1673 for (dir = 0; dir < 8; dir++)
\r
1675 y = p_ptr->y + ddy_ddd[dir];
\r
1676 x = p_ptr->x + ddx_ddd[dir];
\r
1677 c_ptr = &cave[y][x];
\r
1679 /* Get the monster */
\r
1680 m_ptr = &m_list[c_ptr->m_idx];
\r
1682 /* Hack -- attack monsters */
\r
1683 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
\r
1685 if (!monster_living(&r_info[m_ptr->r_idx]))
\r
1689 monster_desc(m_name, m_ptr, 0);
\r
1690 msg_format(_("%sには効果がない!", "%s is unharmed!"), m_name);
\r
1692 else py_attack(y, x, HISSATSU_SEKIRYUKA);
\r
1699 if (name) return _("激震撃", "Earthquake Blow");
\r
1700 if (desc) return _("地震を起こす。", "Shakes dungeon structure, and results in random swapping of floors and walls.");
\r
1706 if (!get_rep_dir2(&dir)) return NULL;
\r
1707 if (dir == 5) return NULL;
\r
1709 y = p_ptr->y + ddy[dir];
\r
1710 x = p_ptr->x + ddx[dir];
\r
1712 if (cave[y][x].m_idx)
\r
1713 py_attack(y, x, HISSATSU_QUAKE);
\r
1715 earthquake(p_ptr->y, p_ptr->x, 10);
\r
1720 if (name) return _("地走り", "Crack");
\r
1721 if (desc) return _("衝撃波のビームを放つ。", "Fires a beam of shock wave.");
\r
1725 int total_damage = 0, basedam, i;
\r
1726 u32b flgs[TR_FLAG_SIZE];
\r
1727 object_type *o_ptr;
\r
1728 if (!get_aim_dir(&dir)) return NULL;
\r
1729 msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
\r
1730 for (i = 0; i < 2; i++)
\r
1734 if (!buki_motteruka(INVEN_RARM+i)) break;
\r
1735 o_ptr = &inventory[INVEN_RARM+i];
\r
1736 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
\r
1737 damage = o_ptr->to_d * 100;
\r
1738 object_flags(o_ptr, flgs);
\r
1739 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
\r
1741 /* vorpal blade */
\r
1745 else if (have_flag(flgs, TR_VORPAL))
\r
1747 /* vorpal flag only */
\r
1751 damage += basedam;
\r
1752 damage *= p_ptr->num_blow[i];
\r
1753 total_damage += damage / 200;
\r
1754 if (i) total_damage = total_damage*7/10;
\r
1756 fire_beam(GF_FORCE, dir, total_damage);
\r
1761 if (name) return _("気迫の雄叫び", "War Cry");
\r
1762 if (desc) return _("視界内の全モンスターに対して轟音の攻撃を行う。さらに、近くにいるモンスターを怒らせる。",
\r
1763 "Damages all monsters in sight with sound. Aggravate nearby monsters.");
\r
1767 msg_print(_("雄叫びをあげた!", "You roar out!"));
\r
1768 project_hack(GF_SOUND, randint1(plev * 3));
\r
1769 aggravate_monsters(0);
\r
1774 if (name) return _("無双三段", "Musou-Sandan");
\r
1775 if (desc) return _("強力な3段攻撃を繰り出す。", "Attacks with powerful 3 strikes.");
\r
1781 if (!get_rep_dir2(&dir)) return NULL;
\r
1782 if (dir == 5) return NULL;
\r
1784 for (i = 0; i < 3; i++)
\r
1788 MONSTER_IDX m_idx;
\r
1790 monster_type *m_ptr;
\r
1792 y = p_ptr->y + ddy[dir];
\r
1793 x = p_ptr->x + ddx[dir];
\r
1794 c_ptr = &cave[y][x];
\r
1797 py_attack(y, x, HISSATSU_3DAN);
\r
1800 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
1804 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
\r
1809 /* Monster is dead? */
\r
1810 if (!c_ptr->m_idx) break;
\r
1812 ny = y + ddy[dir];
\r
1813 nx = x + ddx[dir];
\r
1814 m_idx = c_ptr->m_idx;
\r
1815 m_ptr = &m_list[m_idx];
\r
1817 /* Monster cannot move back? */
\r
1818 if (!monster_can_enter(ny, nx, &r_info[m_ptr->r_idx], 0))
\r
1821 if (i < 2) msg_print(NULL);
\r
1826 cave[ny][nx].m_idx = m_idx;
\r
1830 update_mon(m_idx, TRUE);
\r
1832 /* Redraw the old spot */
\r
1835 /* Redraw the new spot */
\r
1836 lite_spot(ny, nx);
\r
1838 /* Player can move forward? */
\r
1839 if (player_can_enter(c_ptr->feat, 0))
\r
1841 /* Move the player */
\r
1842 if (!move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP)) break;
\r
1850 if (i < 2) msg_print(NULL);
\r
1856 if (name) return _("吸血鬼の牙", "Vampire's Fang");
\r
1857 if (desc) return _("攻撃した相手の体力を吸いとり、自分の体力を回復させる。生命を持たないモンスターには通じない。",
\r
1858 "Attacks with vampiric strikes which absorbs HP from a monster and gives them to you. No effect to unliving monsters.");
\r
1864 if (!get_rep_dir2(&dir)) return NULL;
\r
1865 if (dir == 5) return NULL;
\r
1867 y = p_ptr->y + ddy[dir];
\r
1868 x = p_ptr->x + ddx[dir];
\r
1870 if (cave[y][x].m_idx)
\r
1871 py_attack(y, x, HISSATSU_DRAIN);
\r
1874 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
1881 if (name) return _("幻惑", "Moon Dazzling");
\r
1882 if (desc) return _("視界内の起きている全モンスターに朦朧、混乱、眠りを与えようとする。", "Attempts to stun, confuse and sleep all waking monsters.");
\r
1886 msg_print(_("武器を不規則に揺らした...", "You irregularly wave your weapon..."));
\r
1887 project_hack(GF_ENGETSU, plev * 4);
\r
1888 project_hack(GF_ENGETSU, plev * 4);
\r
1889 project_hack(GF_ENGETSU, plev * 4);
\r
1894 if (name) return _("百人斬り", "Hundred Slaughter");
\r
1895 if (desc) return _("連続して入身でモンスターを攻撃する。攻撃するたびにMPを消費。MPがなくなるか、モンスターを倒せなかったら百人斬りは終了する。",
\r
1896 "Performs a series of rush attacks. The series continues while killing each monster in a time and SP remains.");
\r
1900 const int mana_cost_per_monster = 8;
\r
1901 bool is_new = TRUE;
\r
1906 if (!rush_attack(&mdeath)) break;
\r
1909 /* Reserve needed mana point */
\r
1910 p_ptr->csp -= technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
\r
1914 p_ptr->csp -= mana_cost_per_monster;
\r
1916 if (!mdeath) break;
\r
1919 p_ptr->redraw |= PR_MANA;
\r
1922 while (p_ptr->csp > mana_cost_per_monster);
\r
1924 if (is_new) return NULL;
\r
1926 /* Restore reserved mana */
\r
1927 p_ptr->csp += technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
\r
1932 if (name) return _("天翔龍閃", "Dragonic Flash");
\r
1933 if (desc) return _("視界内の場所を指定して、その場所と自分の間にいる全モンスターを攻撃し、その場所に移動する。",
\r
1934 "Runs toward given location while attacking all monsters on the path.");
\r
1940 if (!tgt_pt(&x, &y)) return NULL;
\r
1942 if (!cave_player_teleportable_bold(y, x, 0L) ||
\r
1943 (distance(y, x, p_ptr->y, p_ptr->x) > MAX_SIGHT / 2) ||
\r
1944 !projectable(p_ptr->y, p_ptr->x, y, x))
\r
1946 msg_print(_("失敗!", "You cannot move to that place!"));
\r
1949 if (p_ptr->anti_tele)
\r
1951 msg_print(_("不思議な力がテレポートを防いだ!", "A mysterious force prevents you from teleporting!"));
\r
1954 project(0, 0, y, x, HISSATSU_ISSEN, GF_ATTACK, PROJECT_BEAM | PROJECT_KILL, -1);
\r
1955 teleport_player_to(y, x, 0L);
\r
1960 if (name) return _("二重の剣撃", "Twin Slash");
\r
1961 if (desc) return _("1ターンで2度攻撃を行う。", "double attacks at a time.");
\r
1967 if (!get_rep_dir(&dir, FALSE)) return NULL;
\r
1969 y = p_ptr->y + ddy[dir];
\r
1970 x = p_ptr->x + ddx[dir];
\r
1972 if (cave[y][x].m_idx)
\r
1974 py_attack(y, x, 0);
\r
1975 if (cave[y][x].m_idx)
\r
1978 py_attack(y, x, 0);
\r
1983 msg_print(_("その方向にはモンスターはいません。", "You don't see any monster in this direction"));
\r
1990 if (name) return _("虎伏絶刀勢", "Kofuku-Zettousei");
\r
1991 if (desc) return _("強力な攻撃を行い、近くの場所にも効果が及ぶ。", "Performs a powerful attack which even effect nearby monsters.");
\r
1995 int total_damage = 0, basedam, i;
\r
1997 u32b flgs[TR_FLAG_SIZE];
\r
1998 object_type *o_ptr;
\r
2000 if (!get_rep_dir2(&dir)) return NULL;
\r
2001 if (dir == 5) return NULL;
\r
2003 y = p_ptr->y + ddy[dir];
\r
2004 x = p_ptr->x + ddx[dir];
\r
2006 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
\r
2008 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));
\r
2011 msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
\r
2012 for (i = 0; i < 2; i++)
\r
2015 if (!buki_motteruka(INVEN_RARM+i)) break;
\r
2016 o_ptr = &inventory[INVEN_RARM+i];
\r
2017 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
\r
2018 damage = o_ptr->to_d * 100;
\r
2019 object_flags(o_ptr, flgs);
\r
2020 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
\r
2022 /* vorpal blade */
\r
2026 else if (have_flag(flgs, TR_VORPAL))
\r
2028 /* vorpal flag only */
\r
2032 damage += basedam;
\r
2033 damage += p_ptr->to_d[i] * 100;
\r
2034 damage *= p_ptr->num_blow[i];
\r
2035 total_damage += (damage / 100);
\r
2037 project(0, (cave_have_flag_bold(y, x, FF_PROJECT) ? 5 : 0), y, x, total_damage * 3 / 2, GF_METEOR, PROJECT_KILL | PROJECT_JUMP | PROJECT_ITEM, -1);
\r
2042 if (name) return _("慶雲鬼忍剣", "Keiun-Kininken");
\r
2043 if (desc) return _("自分もダメージをくらうが、相手に非常に大きなダメージを与える。アンデッドには特に効果がある。",
\r
2044 "Attacks a monster with extremely powerful damage. But you also takes some damages. Hurts a undead monster greatly.");
\r
2050 if (!get_rep_dir2(&dir)) return NULL;
\r
2051 if (dir == 5) return NULL;
\r
2053 y = p_ptr->y + ddy[dir];
\r
2054 x = p_ptr->x + ddx[dir];
\r
2056 if (cave[y][x].m_idx)
\r
2057 py_attack(y, x, HISSATSU_UNDEAD);
\r
2060 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
2063 take_hit(DAMAGE_NOESCAPE, 100 + randint1(100), _("慶雲鬼忍剣を使った衝撃", "exhaustion on using Keiun-Kininken"), -1);
\r
2068 if (name) return _("切腹", "Harakiri");
\r
2069 if (desc) return _("「武士道とは、死ぬことと見つけたり。」", "'Busido is found in death'");
\r
2074 if (!get_check(_("本当に自殺しますか?", "Do you really want to commit suicide? "))) return NULL;
\r
2075 /* Special Verification for suicide */
\r
2076 prt(_("確認のため '@' を押して下さい。", "Please verify SUICIDE by typing the '@' sign: "), 0, 0);
\r
2081 if (i != '@') return NULL;
\r
2082 if (p_ptr->total_winner)
\r
2084 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
\r
2085 p_ptr->total_winner = TRUE;
\r
2089 msg_print(_("武士道とは、死ぬことと見つけたり。", "Meaning of Bushi-do is found in the death."));
\r
2090 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
\r
2100 * @brief 呪術領域の武器呪縛の対象にできる武器かどうかを返す。 / An "item_tester_hook" for offer
\r
2101 * @param o_ptr オブジェクト構造体の参照ポインタ
\r
2102 * @return 呪縛可能な武器ならばTRUEを返す
\r
2104 static bool item_tester_hook_weapon_except_bow(object_type *o_ptr)
\r
2106 switch (o_ptr->tval)
\r
2121 * @brief 呪術領域の各処理に使える呪われた装備かどうかを返す。 / An "item_tester_hook" for offer
\r
2122 * @param o_ptr オブジェクト構造体の参照ポインタ
\r
2123 * @return 使える装備ならばTRUEを返す
\r
2125 static bool item_tester_hook_cursed(object_type *o_ptr)
\r
2127 return (bool)(object_is_cursed(o_ptr));
\r
2131 * @brief 呪術領域魔法の各処理を行う
\r
2132 * @param spell 魔法ID
\r
2133 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_CONT / SPELL_STOP)
\r
2134 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
\r
2136 static cptr do_hex_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
2138 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
2139 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
2140 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
2141 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
2142 bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
\r
2143 bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
\r
2147 PLAYER_LEVEL plev = p_ptr->lev;
\r
2152 /*** 1st book (0-7) ***/
\r
2154 if (name) return _("邪なる祝福", "Evily blessing");
\r
2155 if (desc) return _("祝福により攻撃精度と防御力が上がる。", "Attempts to increase +to_hit of a weapon and AC");
\r
2158 if (!p_ptr->blessed)
\r
2160 msg_print(_("高潔な気分になった!", "You feel righteous!"));
\r
2165 if (!p_ptr->blessed)
\r
2167 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
\r
2173 if (name) return _("軽傷の治癒", "Cure light wounds");
\r
2174 if (desc) return _("HPや傷を少し回復させる。", "Heals cut and HP a little.");
\r
2175 if (info) return info_heal(1, 10, 0);
\r
2178 msg_print(_("気分が良くなってくる。", "You feel better and better."));
\r
2182 hp_player(damroll(1, 10));
\r
2183 set_cut(p_ptr->cut - 10);
\r
2188 if (name) return _("悪魔のオーラ", "Demonic aura");
\r
2189 if (desc) return _("炎のオーラを身にまとい、回復速度が速くなる。", "Gives fire aura and regeneration.");
\r
2192 msg_print(_("体が炎のオーラで覆われた。", "You have enveloped by fiery aura!"));
\r
2196 msg_print(_("炎のオーラが消え去った。", "Fiery aura disappeared."));
\r
2201 if (name) return _("悪臭霧", "Stinking mist");
\r
2202 if (desc) return _("視界内のモンスターに微弱量の毒のダメージを与える。", "Deals few damages of poison to all monsters in your sight.");
\r
2203 power = plev / 2 + 5;
\r
2204 if (info) return info_damage(1, power, 0);
\r
2207 project_hack(GF_POIS, randint1(power));
\r
2212 if (name) return _("腕力強化", "Extra might");
\r
2213 if (desc) return _("術者の腕力を上昇させる。", "Attempts to increase your strength.");
\r
2216 msg_print(_("何だか力が湧いて来る。", "You feel you get stronger."));
\r
2221 if (name) return _("武器呪縛", "Curse weapon");
\r
2222 if (desc) return _("装備している武器を呪う。", "Curses your weapon.");
\r
2227 char o_name[MAX_NLEN];
\r
2228 object_type *o_ptr;
\r
2229 u32b f[TR_FLAG_SIZE];
\r
2231 item_tester_hook = item_tester_hook_weapon_except_bow;
\r
2232 q = _("どれを呪いますか?", "Which weapon do you curse?");
\r
2233 s = _("武器を装備していない。", "You wield no weapons.");
\r
2235 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
\r
2237 o_ptr = &inventory[item];
\r
2238 object_desc(o_name, o_ptr, OD_NAME_ONLY);
\r
2239 object_flags(o_ptr, f);
\r
2241 if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
\r
2243 if (!one_in_(3) &&
\r
2244 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
\r
2246 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
\r
2249 if (o_ptr->to_d > 0)
\r
2251 o_ptr->to_d -= randint1(3) % 2;
\r
2252 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
\r
2254 if (o_ptr->to_h > 0)
\r
2256 o_ptr->to_h -= randint1(3) % 2;
\r
2257 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
\r
2259 if (o_ptr->to_a > 0)
\r
2261 o_ptr->to_a -= randint1(3) % 2;
\r
2262 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
\r
2264 msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
\r
2269 int curse_rank = 0;
\r
2270 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
\r
2271 o_ptr->curse_flags |= (TRC_CURSED);
\r
2273 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
\r
2276 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
\r
2279 o_ptr->curse_flags |= (TRC_TY_CURSE);
\r
2280 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
\r
2282 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
\r
2283 add_flag(o_ptr->art_flags, TR_VORPAL);
\r
2284 add_flag(o_ptr->art_flags, TR_VAMPIRIC);
\r
2285 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
\r
2290 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);
\r
2293 p_ptr->update |= (PU_BONUS);
\r
2299 if (name) return _("邪悪感知", "Evil detection");
\r
2300 if (desc) return _("周囲の邪悪なモンスターを感知する。", "Detects evil monsters.");
\r
2301 if (info) return info_range(MAX_SIGHT);
\r
2304 msg_print(_("邪悪な生物の存在を感じ取ろうとした。", "You attend to the presence of evil creatures."));
\r
2309 if (name) return _("我慢", "Patience");
\r
2310 if (desc) return _("数ターン攻撃を耐えた後、受けたダメージを地獄の業火として周囲に放出する。",
\r
2311 "Bursts hell fire strongly after patients any damage while few turns.");
\r
2312 power = MIN(200, (HEX_REVENGE_POWER(p_ptr) * 2));
\r
2313 if (info) return info_damage(0, 0, power);
\r
2316 int a = 3 - (p_ptr->pspeed - 100) / 10;
\r
2317 MAGIC_NUM2 r = 3 + randint1(3) + MAX(0, MIN(3, a));
\r
2319 if (HEX_REVENGE_TURN(p_ptr) > 0)
\r
2321 msg_print(_("すでに我慢をしている。", "You are already patienting."));
\r
2325 HEX_REVENGE_TYPE(p_ptr) = 1;
\r
2326 HEX_REVENGE_TURN(p_ptr) = r;
\r
2327 HEX_REVENGE_POWER(p_ptr) = 0;
\r
2328 msg_print(_("じっと耐えることにした。", "You decide to patient all damages."));
\r
2333 int rad = 2 + (power / 50);
\r
2335 HEX_REVENGE_TURN(p_ptr)--;
\r
2337 if ((HEX_REVENGE_TURN(p_ptr) <= 0) || (power >= 200))
\r
2339 msg_print(_("我慢が解かれた!", "Time for end of patioence!"));
\r
2342 project(0, rad, p_ptr->y, p_ptr->x, power, GF_HELL_FIRE,
\r
2343 (PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);
\r
2345 if (p_ptr->wizard)
\r
2347 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
\r
2351 HEX_REVENGE_TYPE(p_ptr) = 0;
\r
2352 HEX_REVENGE_TURN(p_ptr) = 0;
\r
2353 HEX_REVENGE_POWER(p_ptr) = 0;
\r
2358 /*** 2nd book (8-15) ***/
\r
2360 if (name) return _("氷の鎧", "Ice armor");
\r
2361 if (desc) return _("氷のオーラを身にまとい、防御力が上昇する。", "Gives fire aura and bonus to AC.");
\r
2364 msg_print(_("体が氷の鎧で覆われた。", "You have enveloped by ice armor!"));
\r
2368 msg_print(_("氷の鎧が消え去った。", "Ice armor disappeared."));
\r
2373 if (name) return _("重傷の治癒", "Cure serious wounds");
\r
2374 if (desc) return _("体力や傷を多少回復させる。", "Heals cut and HP more.");
\r
2375 if (info) return info_heal(2, 10, 0);
\r
2378 msg_print(_("気分が良くなってくる。", "You feel better and better."));
\r
2382 hp_player(damroll(2, 10));
\r
2383 set_cut((p_ptr->cut / 2) - 10);
\r
2388 if (name) return _("薬品吸入", "Inhail potion");
\r
2389 if (desc) return _("呪文詠唱を中止することなく、薬の効果を得ることができる。", "Quaffs a potion without canceling of casting a spell.");
\r
2392 CASTING_HEX_FLAGS(p_ptr) |= (1L << HEX_INHAIL);
\r
2393 do_cmd_quaff_potion();
\r
2394 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_INHAIL);
\r
2400 if (name) return _("衰弱の霧", "Hypodynamic mist");
\r
2401 if (desc) return _("視界内のモンスターに微弱量の衰弱属性のダメージを与える。",
\r
2402 "Deals few damages of hypodynamia to all monsters in your sight.");
\r
2403 power = (plev / 2) + 5;
\r
2404 if (info) return info_damage(1, power, 0);
\r
2407 project_hack(GF_HYPODYNAMIA, randint1(power));
\r
2412 if (name) return _("魔剣化", "Swords to runeswords");
\r
2413 if (desc) return _("武器の攻撃力を上げる。切れ味を得、呪いに応じて与えるダメージが上昇し、善良なモンスターに対するダメージが2倍になる。",
\r
2414 "Gives vorpal ability to your weapon. Increases damages by your weapon acccording to curse of your weapon.");
\r
2418 msg_print("あなたの武器が黒く輝いた。");
\r
2420 if (!empty_hands(FALSE))
\r
2421 msg_print("Your weapons glow bright black.");
\r
2423 msg_print("Your weapon glows bright black.");
\r
2429 msg_print("武器の輝きが消え去った。");
\r
2431 msg_format("Brightness of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
\r
2437 if (name) return _("混乱の手", "Touch of confusion");
\r
2438 if (desc) return _("攻撃した際モンスターを混乱させる。", "Confuses a monster when you attack.");
\r
2441 msg_print(_("あなたの手が赤く輝き始めた。", "Your hands glow bright red."));
\r
2445 msg_print(_("手の輝きがなくなった。", "Brightness on your hands disappeard."));
\r
2450 if (name) return _("肉体強化", "Building up");
\r
2451 if (desc) return _("術者の腕力、器用さ、耐久力を上昇させる。攻撃回数の上限を 1 増加させる。",
\r
2452 "Attempts to increases your strength, dexterity and constitusion.");
\r
2455 msg_print(_("身体が強くなった気がした。", "You feel your body is developed more now."));
\r
2460 if (name) return _("反テレポート結界", "Anti teleport barrier");
\r
2461 if (desc) return _("視界内のモンスターのテレポートを阻害するバリアを張る。", "Obstructs all teleportations by monsters in your sight.");
\r
2462 power = plev * 3 / 2;
\r
2463 if (info) return info_power(power);
\r
2466 msg_print(_("テレポートを防ぐ呪いをかけた。", "You feel anyone can not teleport except you."));
\r
2470 /*** 3rd book (16-23) ***/
\r
2472 if (name) return _("衝撃のクローク", "Cloak of shock");
\r
2473 if (desc) return _("電気のオーラを身にまとい、動きが速くなる。", "Gives lightning aura and a bonus to speed.");
\r
2476 msg_print(_("体が稲妻のオーラで覆われた。", "You have enveloped by electrical aura!"));
\r
2480 msg_print(_("稲妻のオーラが消え去った。", "Electrical aura disappeared."));
\r
2485 if (name) return _("致命傷の治癒", "Cure critical wounds");
\r
2486 if (desc) return _("体力や傷を回復させる。", "Heals cut and HP greatry.");
\r
2487 if (info) return info_heal(4, 10, 0);
\r
2490 msg_print(_("気分が良くなってくる。", "You feel better and better."));
\r
2494 hp_player(damroll(4, 10));
\r
2502 if (name) return _("呪力封入", "Recharging");
\r
2503 if (desc) return _("魔法の道具に魔力を再充填する。", "Recharges a magic device.");
\r
2505 if (info) return info_power(power);
\r
2508 if (!recharge(power)) return NULL;
\r
2514 if (name) return _("死者復活", "Animate Dead");
\r
2515 if (desc) return _("死体を蘇らせてペットにする。", "Raises corpses and skeletons from dead.");
\r
2518 msg_print(_("死者への呼びかけを始めた。", "You start to call deads.!"));
\r
2522 animate_dead(0, p_ptr->y, p_ptr->x);
\r
2527 if (name) return _("防具呪縛", "Curse armor");
\r
2528 if (desc) return _("装備している防具に呪いをかける。", "Curse a piece of armour that you wielding.");
\r
2533 char o_name[MAX_NLEN];
\r
2534 object_type *o_ptr;
\r
2535 u32b f[TR_FLAG_SIZE];
\r
2537 item_tester_hook = object_is_armour;
\r
2538 q = _("どれを呪いますか?", "Which piece of armour do you curse?");
\r
2539 s = _("防具を装備していない。", "You wield no piece of armours.");
\r
2541 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
\r
2543 o_ptr = &inventory[item];
\r
2544 object_desc(o_name, o_ptr, OD_NAME_ONLY);
\r
2545 object_flags(o_ptr, f);
\r
2547 if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
\r
2549 if (!one_in_(3) &&
\r
2550 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
\r
2552 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
\r
2555 if (o_ptr->to_d > 0)
\r
2557 o_ptr->to_d -= randint1(3) % 2;
\r
2558 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
\r
2560 if (o_ptr->to_h > 0)
\r
2562 o_ptr->to_h -= randint1(3) % 2;
\r
2563 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
\r
2565 if (o_ptr->to_a > 0)
\r
2567 o_ptr->to_a -= randint1(3) % 2;
\r
2568 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
\r
2570 msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
\r
2575 int curse_rank = 0;
\r
2576 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
\r
2577 o_ptr->curse_flags |= (TRC_CURSED);
\r
2579 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
\r
2582 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
\r
2585 o_ptr->curse_flags |= (TRC_TY_CURSE);
\r
2586 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
\r
2588 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
\r
2589 add_flag(o_ptr->art_flags, TR_RES_POIS);
\r
2590 add_flag(o_ptr->art_flags, TR_RES_DARK);
\r
2591 add_flag(o_ptr->art_flags, TR_RES_NETHER);
\r
2592 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
\r
2597 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);
\r
2600 p_ptr->update |= (PU_BONUS);
\r
2606 if (name) return _("影のクローク", "Cloak of shadow");
\r
2607 if (desc) return _("影のオーラを身にまとい、敵に影のダメージを与える。", "Gives aura of shadow.");
\r
2610 object_type *o_ptr = &inventory[INVEN_OUTER];
\r
2612 if (!o_ptr->k_idx)
\r
2614 msg_print(_("クロークを身につけていない!", "You don't ware any cloak."));
\r
2617 else if (!object_is_cursed(o_ptr))
\r
2619 msg_print(_("クロークは呪われていない!", "Your cloak is not cursed."));
\r
2624 msg_print(_("影のオーラを身にまとった。", "You have enveloped by shadow aura!"));
\r
2629 object_type *o_ptr = &inventory[INVEN_OUTER];
\r
2631 if ((!o_ptr->k_idx) || (!object_is_cursed(o_ptr)))
\r
2633 do_spell(REALM_HEX, spell, SPELL_STOP);
\r
2634 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << spell);
\r
2635 CASTING_HEX_NUM(p_ptr)--;
\r
2636 if (!SINGING_SONG_ID(p_ptr)) set_action(ACTION_NONE);
\r
2641 msg_print(_("影のオーラが消え去った。", "Shadow aura disappeared."));
\r
2646 if (name) return _("苦痛を魔力に", "Pains to mana");
\r
2647 if (desc) return _("視界内のモンスターに精神ダメージ与え、魔力を吸い取る。", "Deals psychic damages to all monsters in sight, and drains some mana.");
\r
2648 power = plev * 3 / 2;
\r
2649 if (info) return info_damage(1, power, 0);
\r
2652 project_hack(GF_PSI_DRAIN, randint1(power));
\r
2657 if (name) return _("目には目を", "Eye for an eye");
\r
2658 if (desc) return _("打撃や魔法で受けたダメージを、攻撃元のモンスターにも与える。", "Returns same damage which you got to the monster which damaged you.");
\r
2661 msg_print(_("復讐したい欲望にかられた。", "You wish strongly you want to revenge anything."));
\r
2665 /*** 4th book (24-31) ***/
\r
2667 if (name) return _("反増殖結界", "Anti multiply barrier");
\r
2668 if (desc) return _("その階の増殖するモンスターの増殖を阻止する。", "Obstructs all multiplying by monsters in entire floor.");
\r
2671 msg_print(_("増殖を阻止する呪いをかけた。", "You feel anyone can not already multiply."));
\r
2676 if (name) return _("全復活", "Restoration");
\r
2677 if (desc) return _("経験値を徐々に復活し、減少した能力値を回復させる。", "Restores experience and status.");
\r
2680 msg_print(_("体が元の活力を取り戻し始めた。", "You feel your lost status starting to return."));
\r
2684 bool flag = FALSE;
\r
2685 int d = (p_ptr->max_exp - p_ptr->exp);
\r
2686 int r = (p_ptr->exp / 20);
\r
2692 p_ptr->exp = p_ptr->max_exp;
\r
2696 /* Check the experience */
\r
2697 check_experience();
\r
2701 for (i = A_STR; i < 6; i ++)
\r
2703 if (p_ptr->stat_cur[i] < p_ptr->stat_max[i])
\r
2705 if (p_ptr->stat_cur[i] < 18)
\r
2706 p_ptr->stat_cur[i]++;
\r
2708 p_ptr->stat_cur[i] += 10;
\r
2710 if (p_ptr->stat_cur[i] > p_ptr->stat_max[i])
\r
2711 p_ptr->stat_cur[i] = p_ptr->stat_max[i];
\r
2713 /* Recalculate bonuses */
\r
2714 p_ptr->update |= (PU_BONUS);
\r
2722 msg_format(_("%sの呪文の詠唱をやめた。", "Finish casting '%^s'."), do_spell(REALM_HEX, HEX_RESTORE, SPELL_NAME));
\r
2723 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_RESTORE);
\r
2724 if (cont) CASTING_HEX_NUM(p_ptr)--;
\r
2725 if (CASTING_HEX_NUM(p_ptr)) p_ptr->action = ACTION_NONE;
\r
2727 /* Redraw status */
\r
2728 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
\r
2729 p_ptr->redraw |= (PR_EXTRA);
\r
2737 if (name) return _("呪力吸収", "Drain curse power");
\r
2738 if (desc) return _("呪われた武器の呪いを吸収して魔力を回復する。", "Drains curse on your weapon and heals SP a little.");
\r
2743 u32b f[TR_FLAG_SIZE];
\r
2744 object_type *o_ptr;
\r
2746 item_tester_hook = item_tester_hook_cursed;
\r
2747 q = _("どの装備品から吸収しますか?", "Which cursed equipment do you drain mana from?");
\r
2748 s = _("呪われたアイテムを装備していない。", "You have no cursed equipment.");
\r
2750 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
\r
2752 o_ptr = &inventory[item];
\r
2753 object_flags(o_ptr, f);
\r
2755 p_ptr->csp += (p_ptr->lev / 5) + randint1(p_ptr->lev / 5);
\r
2756 if (have_flag(f, TR_TY_CURSE) || (o_ptr->curse_flags & TRC_TY_CURSE)) p_ptr->csp += randint1(5);
\r
2757 if (p_ptr->csp > p_ptr->msp) p_ptr->csp = p_ptr->msp;
\r
2759 if (o_ptr->curse_flags & TRC_PERMA_CURSE)
\r
2763 else if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
\r
2767 msg_print(_("呪いを全て吸い取った。", "Heavy curse vanished away."));
\r
2768 o_ptr->curse_flags = 0L;
\r
2771 else if ((o_ptr->curse_flags & (TRC_CURSED)) && one_in_(3))
\r
2773 msg_print(_("呪いを全て吸い取った。", "Curse vanished away."));
\r
2774 o_ptr->curse_flags = 0L;
\r
2782 if (name) return _("吸血の刃", "Swords to vampires");
\r
2783 if (desc) return _("吸血属性で攻撃する。", "Gives vampiric ability to your weapon.");
\r
2787 msg_print("あなたの武器が血を欲している。");
\r
2789 if (!empty_hands(FALSE))
\r
2790 msg_print("Your weapons want more blood now.");
\r
2792 msg_print("Your weapon wants more blood now.");
\r
2798 msg_print("武器の渇望が消え去った。");
\r
2800 msg_format("Thirsty of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
\r
2806 if (name) return _("朦朧の言葉", "Word of stun");
\r
2807 if (desc) return _("視界内のモンスターを朦朧とさせる。", "Stuns all monsters in your sight.");
\r
2809 if (info) return info_power(power);
\r
2812 stun_monsters(power);
\r
2817 if (name) return _("影移動", "Moving into shadow");
\r
2818 if (desc) return _("モンスターの隣のマスに瞬間移動する。", "Teleports you close to a monster.");
\r
2825 for (i = 0; i < 3; i++)
\r
2827 if (!tgt_pt(&x, &y)) return FALSE;
\r
2831 for (dir = 0; dir < 8; dir++)
\r
2833 int dy = y + ddy_ddd[dir];
\r
2834 int dx = x + ddx_ddd[dir];
\r
2835 if (dir == 5) continue;
\r
2836 if(cave[dy][dx].m_idx) flag = TRUE;
\r
2839 if (!cave_empty_bold(y, x) || (cave[y][x].info & CAVE_ICKY) ||
\r
2840 (distance(y, x, p_ptr->y, p_ptr->x) > plev + 2))
\r
2842 msg_print(_("そこには移動できない。", "Can not teleport to there."));
\r
2848 if (flag && randint0(plev * plev / 2))
\r
2850 teleport_player_to(y, x, 0L);
\r
2854 msg_print(_("おっと!", "Oops!"));
\r
2855 teleport_player(30, 0L);
\r
2863 if (name) return _("反魔法結界", "Anti magic barrier");
\r
2864 if (desc) return _("視界内のモンスターの魔法を阻害するバリアを張る。", "Obstructs all magic spell of monsters in your sight.");
\r
2865 power = plev * 3 / 2;
\r
2866 if (info) return info_power(power);
\r
2869 msg_print(_("魔法を防ぐ呪いをかけた。", "You feel anyone can not cast spells except you."));
\r
2874 if (name) return _("復讐の宣告", "Revenge sentence");
\r
2875 if (desc) return _("数ターン後にそれまで受けたダメージに応じた威力の地獄の劫火の弾を放つ。",
\r
2876 "Fires a ball of hell fire to try revenging after few turns.");
\r
2877 power = HEX_REVENGE_POWER(p_ptr);
\r
2878 if (info) return info_damage(0, 0, power);
\r
2882 int a = 3 - (p_ptr->pspeed - 100) / 10;
\r
2883 r = 1 + randint1(2) + MAX(0, MIN(3, a));
\r
2885 if (HEX_REVENGE_TURN(p_ptr) > 0)
\r
2887 msg_print(_("すでに復讐は宣告済みだ。", "You already pronounced your revenge."));
\r
2891 HEX_REVENGE_TYPE(p_ptr) = 2;
\r
2892 HEX_REVENGE_TURN(p_ptr) = r;
\r
2893 msg_format(_("あなたは復讐を宣告した。あと %d ターン。", "You pronounce your revenge. %d turns left."), r);
\r
2898 HEX_REVENGE_TURN(p_ptr)--;
\r
2900 if (HEX_REVENGE_TURN(p_ptr) <= 0)
\r
2910 msg_print(_("復讐の時だ!", "Time to revenge!"));
\r
2912 while (!get_aim_dir(&dir));
\r
2914 fire_ball(GF_HELL_FIRE, dir, power, 1);
\r
2916 if (p_ptr->wizard)
\r
2918 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
\r
2923 msg_print(_("復讐する気が失せた。", "You are not a mood to revenge."));
\r
2925 HEX_REVENGE_POWER(p_ptr) = 0;
\r
2931 /* start casting */
\r
2932 if ((cast) && (add))
\r
2935 CASTING_HEX_FLAGS(p_ptr) |= 1L << (spell);
\r
2936 CASTING_HEX_NUM(p_ptr)++;
\r
2938 if (p_ptr->action != ACTION_SPELL) set_action(ACTION_SPELL);
\r
2941 /* Redraw status */
\r
2944 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
\r
2945 p_ptr->redraw |= (PR_EXTRA | PR_HP | PR_MANA);
\r
2953 * @brief 魔法処理のメインルーチン
\r
2954 * @param realm 魔法領域のID
\r
2955 * @param spell 各領域の魔法ID
\r
2956 * @param mode 求める処理
\r
2957 * @return 各領域魔法に各種テキストを求めた場合は文字列参照ポインタ、そうでない場合はNULLポインタを返す。
\r
2959 cptr do_spell(REALM_IDX realm, SPELL_IDX spell, BIT_FLAGS mode)
\r
2963 case REALM_LIFE: return do_life_spell(spell, mode);
\r
2964 case REALM_SORCERY: return do_sorcery_spell(spell, mode);
\r
2965 case REALM_NATURE: return do_nature_spell(spell, mode);
\r
2966 case REALM_CHAOS: return do_chaos_spell(spell, mode);
\r
2967 case REALM_DEATH: return do_death_spell(spell, mode);
\r
2968 case REALM_TRUMP: return do_trump_spell(spell, mode);
\r
2969 case REALM_ARCANE: return do_arcane_spell(spell, mode);
\r
2970 case REALM_CRAFT: return do_craft_spell(spell, mode);
\r
2971 case REALM_DAEMON: return do_daemon_spell(spell, mode);
\r
2972 case REALM_CRUSADE: return do_crusade_spell(spell, mode);
\r
2973 case REALM_MUSIC: return do_music_spell(spell, mode);
\r
2974 case REALM_HISSATSU: return do_hissatsu_spell(spell, mode);
\r
2975 case REALM_HEX: return do_hex_spell(spell, mode);
\r