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-death.h"
\r
17 #include "realm-life.h"
\r
18 #include "realm-nature.h"
\r
19 #include "realm-sorcery.h"
\r
20 #include "realm-trump.h"
\r
24 * 魔法の効果を「キャプション:ダイス+定数値」のフォーマットで出力する / Generate dice info string such as "foo 2d10"
\r
29 * @return フォーマットに従い整形された文字列
\r
31 cptr info_string_dice(cptr str, int dice, int sides, int base)
\r
35 return format("%s%d", str, base);
\r
39 return format("%s%dd%d", str, dice, sides);
\r
41 /* Dice plus base value */
\r
43 return format("%s%dd%d%+d", str, dice, sides, base);
\r
48 * @brief 魔法によるダメージを出力する / Generate damage-dice info string such as "dam 2d10"
\r
52 * @return フォーマットに従い整形された文字列
\r
54 cptr info_damage(int dice, int sides, int base)
\r
56 return info_string_dice(_("損傷:", "dam "), dice, sides, base);
\r
60 * @brief 魔法の効果時間を出力する / Generate duration info string such as "dur 20+1d20"
\r
63 * @return フォーマットに従い整形された文字列
\r
65 cptr info_duration(int base, int sides)
\r
67 return format(_("期間:%d+1d%d", "dur %d+1d%d"), base, sides);
\r
71 * @brief 魔法の効果範囲を出力する / Generate range info string such as "range 5"
\r
73 * @return フォーマットに従い整形された文字列
\r
75 cptr info_range(POSITION range)
\r
77 return format(_("範囲:%d", "range %d"), range);
\r
81 * @brief 魔法による回復量を出力する / Generate heal info string such as "heal 2d8"
\r
85 * @return フォーマットに従い整形された文字列
\r
87 cptr info_heal(int dice, int sides, int base)
\r
89 return info_string_dice(_("回復:", "heal "), dice, sides, base);
\r
93 * @brief 魔法効果発動までの遅延ターンを出力する / Generate delay info string such as "delay 15+1d15"
\r
96 * @return フォーマットに従い整形された文字列
\r
98 cptr info_delay(int base, int sides)
\r
100 return format(_("遅延:%d+1d%d", "delay %d+1d%d"), base, sides);
\r
105 * @brief 魔法によるダメージを出力する(固定値&複数回処理) / Generate multiple-damage info string such as "dam 25 each"
\r
107 * @return フォーマットに従い整形された文字列
\r
109 cptr info_multi_damage(HIT_POINT dam)
\r
111 return format(_("損傷:各%d", "dam %d each"), dam);
\r
116 * @brief 魔法によるダメージを出力する(ダイスのみ&複数回処理) / Generate multiple-damage-dice info string such as "dam 5d2 each"
\r
118 * @param sides ダイス目
\r
119 * @return フォーマットに従い整形された文字列
\r
121 cptr info_multi_damage_dice(int dice, int sides)
\r
123 return format(_("損傷:各%dd%d", "dam %dd%d each"), dice, sides);
\r
127 * @brief 魔法による一般的な効力値を出力する(固定値) / Generate power info string such as "power 100"
\r
129 * @return フォーマットに従い整形された文字列
\r
131 cptr info_power(int power)
\r
133 return format(_("効力:%d", "power %d"), power);
\r
138 * @brief 魔法による一般的な効力値を出力する(ダイス値) / Generate power info string such as "power 100"
\r
140 * @param sides ダイス目
\r
141 * @return フォーマットに従い整形された文字列
\r
144 * Generate power info string such as "power 1d100"
\r
146 cptr info_power_dice(int dice, int sides)
\r
148 return format(_("効力:%dd%d", "power %dd%d"), dice, sides);
\r
153 * @brief 魔法の効果半径を出力する / Generate radius info string such as "rad 100"
\r
155 * @return フォーマットに従い整形された文字列
\r
157 cptr info_radius(int rad)
\r
159 return format(_("半径:%d", "rad %d"), rad);
\r
164 * @brief 魔法効果の限界重量を出力する / Generate weight info string such as "max wgt 15"
\r
165 * @param weight 最大重量
\r
166 * @return フォーマットに従い整形された文字列
\r
168 cptr info_weight(int weight)
\r
171 return format("最大重量:%d.%dkg", lbtokg1(weight), lbtokg2(weight));
\r
173 return format("max wgt %d", weight/10);
\r
179 * @brief 歌の開始を処理する / Start singing if the player is a Bard
\r
180 * @param spell 領域魔法としてのID
\r
181 * @param song 魔法効果のID
\r
184 static void start_singing(SPELL_IDX spell, MAGIC_NUM1 song)
\r
186 /* Remember the song index */
\r
187 SINGING_SONG_EFFECT(p_ptr) = (MAGIC_NUM1)song;
\r
189 /* Remember the index of the spell which activated the song */
\r
190 SINGING_SONG_ID(p_ptr) = (MAGIC_NUM2)spell;
\r
193 /* Now the player is singing */
\r
194 set_action(ACTION_SING);
\r
197 /* Recalculate bonuses */
\r
198 p_ptr->update |= (PU_BONUS);
\r
200 /* Redraw status bar */
\r
201 p_ptr->redraw |= (PR_STATUS);
\r
205 * @brief 歌の停止を処理する / Stop singing if the player is a Bard
\r
208 void stop_singing(void)
\r
210 if (p_ptr->pclass != CLASS_BARD) return;
\r
212 /* Are there interupted song? */
\r
213 if (INTERUPTING_SONG_EFFECT(p_ptr))
\r
215 /* Forget interupted song */
\r
216 INTERUPTING_SONG_EFFECT(p_ptr) = MUSIC_NONE;
\r
220 /* The player is singing? */
\r
221 if (!SINGING_SONG_EFFECT(p_ptr)) return;
\r
223 /* Hack -- if called from set_action(), avoid recursive loop */
\r
224 if (p_ptr->action == ACTION_SING) set_action(ACTION_NONE);
\r
226 /* Message text of each song or etc. */
\r
227 do_spell(REALM_MUSIC, SINGING_SONG_ID(p_ptr), SPELL_STOP);
\r
229 SINGING_SONG_EFFECT(p_ptr) = MUSIC_NONE;
\r
230 SINGING_SONG_ID(p_ptr) = 0;
\r
232 /* Recalculate bonuses */
\r
233 p_ptr->update |= (PU_BONUS);
\r
235 /* Redraw status bar */
\r
236 p_ptr->redraw |= (PR_STATUS);
\r
241 * @brief 悪魔領域魔法の各処理を行う
\r
242 * @param spell 魔法ID
\r
243 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
244 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
246 static cptr do_daemon_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
248 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
249 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
250 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
251 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
252 static const char s_dam[] = _("損傷:", "dam ");
\r
255 int plev = p_ptr->lev;
\r
260 if (name) return _("マジック・ミサイル", "Magic Missile");
\r
261 if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");
\r
264 int dice = 3 + (plev - 1) / 5;
\r
267 if (info) return info_damage(dice, sides, 0);
\r
271 if (!get_aim_dir(&dir)) return NULL;
\r
273 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));
\r
279 if (name) return _("無生命感知", "Detect Unlife");
\r
280 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
\r
283 int rad = DETECT_RAD_DEFAULT;
\r
285 if (info) return info_radius(rad);
\r
289 detect_monsters_nonliving(rad);
\r
295 if (name) return _("邪なる祝福", "Evil Bless");
\r
296 if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
\r
301 if (info) return info_duration(base, base);
\r
305 set_blessed(randint1(base) + base, FALSE);
\r
311 if (name) return _("耐火炎", "Resist Fire");
\r
312 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
\r
313 "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");
\r
318 if (info) return info_duration(base, base);
\r
322 set_oppose_fire(randint1(base) + base, FALSE);
\r
328 if (name) return _("恐慌", "Horrify");
\r
329 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
\r
334 if (info) return info_power(power);
\r
338 if (!get_aim_dir(&dir)) return NULL;
\r
340 fear_monster(dir, power);
\r
341 stun_monster(dir, power);
\r
347 if (name) return _("地獄の矢", "Nether Bolt");
\r
348 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
\r
351 int dice = 6 + (plev - 5) / 4;
\r
354 if (info) return info_damage(dice, sides, 0);
\r
358 if (!get_aim_dir(&dir)) return NULL;
\r
360 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
\r
366 if (name) return _("古代の死霊召喚", "Summon Manes");
\r
367 if (desc) return _("古代の死霊を召喚する。", "Summons a manes.");
\r
372 if (!summon_specific(-1, p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET)))
\r
374 msg_print(_("古代の死霊は現れなかった。", "No Manes arrive."));
\r
381 if (name) return _("地獄の焔", "Hellish Flame");
\r
382 if (desc) return _("邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",
\r
383 "Fires a ball of evil power. Hurts good monsters greatly.");
\r
388 int rad = (plev < 30) ? 2 : 3;
\r
391 if (p_ptr->pclass == CLASS_MAGE ||
\r
392 p_ptr->pclass == CLASS_HIGH_MAGE ||
\r
393 p_ptr->pclass == CLASS_SORCERER)
\r
394 base = plev + plev / 2;
\r
396 base = plev + plev / 4;
\r
399 if (info) return info_damage(dice, sides, base);
\r
403 if (!get_aim_dir(&dir)) return NULL;
\r
405 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides) + base, rad);
\r
411 if (name) return _("デーモン支配", "Dominate Demon");
\r
412 if (desc) return _("悪魔1体を魅了する。抵抗されると無効", "Attempts to charm a demon.");
\r
417 if (info) return info_power(power);
\r
421 if (!get_aim_dir(&dir)) return NULL;
\r
423 control_one_demon(dir, power);
\r
429 if (name) return _("ビジョン", "Vision");
\r
430 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
\r
433 int rad = DETECT_RAD_MAP;
\r
435 if (info) return info_radius(rad);
\r
445 if (name) return _("耐地獄", "Resist Nether");
\r
446 if (desc) return _("一定時間、地獄への耐性を得る。", "Gives resistance to nether for a while.");
\r
451 if (info) return info_duration(base, base);
\r
455 set_tim_res_nether(randint1(base) + base, FALSE);
\r
461 if (name) return _("プラズマ・ボルト", "Plasma bolt");
\r
462 if (desc) return _("プラズマのボルトもしくはビームを放つ。", "Fires a bolt or beam of plasma.");
\r
465 int dice = 11 + (plev - 5) / 4;
\r
468 if (info) return info_damage(dice, sides, 0);
\r
472 if (!get_aim_dir(&dir)) return NULL;
\r
474 fire_bolt_or_beam(beam_chance(), GF_PLASMA, dir, damroll(dice, sides));
\r
480 if (name) return _("ファイア・ボール", "Fire Ball");
\r
481 if (desc) return _("炎の球を放つ。", "Fires a ball of fire.");
\r
484 HIT_POINT dam = plev + 55;
\r
487 if (info) return info_damage(0, 0, dam);
\r
491 if (!get_aim_dir(&dir)) return NULL;
\r
493 fire_ball(GF_FIRE, dir, dam, rad);
\r
499 if (name) return _("炎の刃", "Fire Branding");
\r
500 if (desc) return _("武器に炎の属性をつける。", "Makes current weapon fire branded.");
\r
511 if (name) return _("地獄球", "Nether Ball");
\r
512 if (desc) return _("大きな地獄の球を放つ。", "Fires a huge ball of nether.");
\r
515 HIT_POINT dam = plev * 3 / 2 + 100;
\r
516 int rad = plev / 20 + 2;
\r
518 if (info) return info_damage(0, 0, dam);
\r
522 if (!get_aim_dir(&dir)) return NULL;
\r
524 fire_ball(GF_NETHER, dir, dam, rad);
\r
530 if (name) return _("デーモン召喚", "Summon Demon");
\r
531 if (desc) return _("悪魔1体を召喚する。", "Summons a demon.");
\r
536 bool pet = !one_in_(3);
\r
539 if (pet) flg |= PM_FORCE_PET;
\r
540 else flg |= PM_NO_PET;
\r
541 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
\r
543 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, plev*2/3+randint1(plev/2), SUMMON_DEMON, flg))
\r
545 msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));
\r
549 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
\r
553 msg_print(_("「卑しき者よ、我は汝の下僕にあらず! お前の魂を頂くぞ!」",
\r
554 "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));
\r
559 msg_print(_("悪魔は現れなかった。", "No demons arrive."));
\r
567 if (name) return _("悪魔の目", "Devilish Eye");
\r
568 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
\r
574 if (info) return info_duration(base, sides);
\r
578 set_tim_esp(randint1(sides) + base, FALSE);
\r
584 if (name) return _("悪魔のクローク", "Devil Cloak");
\r
585 if (desc) return _("恐怖を取り除き、一定時間、炎と冷気の耐性、炎のオーラを得る。耐性は装備による耐性に累積する。",
\r
586 "Removes fear. Gives resistance to fire and cold, and aura of fire. These resistances can be added to which from equipment for more powerful resistances.");
\r
589 TIME_EFFECT base = 20;
\r
591 if (info) return info_duration(base, base);
\r
595 TIME_EFFECT dur = randint1(base) + base;
\r
597 set_oppose_fire(dur, FALSE);
\r
598 set_oppose_cold(dur, FALSE);
\r
599 set_tim_sh_fire(dur, FALSE);
\r
607 if (name) return _("溶岩流", "The Flow of Lava");
\r
608 if (desc) return _("自分を中心とした炎の球を作り出し、床を溶岩に変える。",
\r
609 "Generates a ball of fire centered on you which transforms floors to magma.");
\r
612 HIT_POINT dam = (55 + plev) * 2;
\r
615 if (info) return info_damage(0, 0, dam/2);
\r
619 fire_ball(GF_FIRE, 0, dam, rad);
\r
620 fire_ball_hide(GF_LAVA_FLOW, 0, 2 + randint1(2), rad);
\r
626 if (name) return _("プラズマ球", "Plasma Ball");
\r
627 if (desc) return _("プラズマの球を放つ。", "Fires a ball of plasma.");
\r
630 HIT_POINT dam = plev * 3 / 2 + 80;
\r
631 int rad = 2 + plev / 40;
\r
633 if (info) return info_damage(0, 0, dam);
\r
637 if (!get_aim_dir(&dir)) return NULL;
\r
639 fire_ball(GF_PLASMA, dir, dam, rad);
\r
645 if (name) return _("悪魔変化", "Polymorph Demon");
\r
646 if (desc) return _("一定時間、悪魔に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔としての能力を得る。",
\r
647 "Mimic a demon for a while. Loses abilities of original race and gets abilities as a demon.");
\r
650 int base = 10 + plev / 2;
\r
652 if (info) return info_duration(base, base);
\r
656 set_mimic(base + randint1(base), MIMIC_DEMON, FALSE);
\r
662 if (name) return _("地獄の波動", "Nather Wave");
\r
663 if (desc) return _("視界内の全てのモンスターにダメージを与える。善良なモンスターに特に大きなダメージを与える。",
\r
664 "Damages all monsters in sight. Hurts good monsters greatly.");
\r
667 int sides1 = plev * 2;
\r
668 int sides2 = plev * 2;
\r
670 if (info) return format("%sd%d+d%d", s_dam, sides1, sides2);
\r
674 dispel_monsters(randint1(sides1));
\r
675 dispel_good(randint1(sides2));
\r
681 if (name) return _("サキュバスの接吻", "Kiss of Succubus");
\r
682 if (desc) return _("因果混乱の球を放つ。", "Fires a ball of nexus.");
\r
685 HIT_POINT dam = 100 + plev * 2;
\r
688 if (info) return info_damage(0, 0, dam);
\r
692 if (!get_aim_dir(&dir)) return NULL;
\r
693 fire_ball(GF_NEXUS, dir, dam, rad);
\r
699 if (name) return _("破滅の手", "Doom Hand");
\r
700 if (desc) return _("破滅の手を放つ。食らったモンスターはそのときのHPの半分前後のダメージを受ける。", "Attempts to make a monster's HP almost half.");
\r
705 if (!get_aim_dir(&dir))
\r
708 msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));
\r
710 fire_ball_hide(GF_HAND_DOOM, dir, plev * 2, 0);
\r
716 if (name) return _("士気高揚", "Raise the Morale");
\r
717 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
722 if (info) return info_duration(base, base);
\r
726 set_hero(randint1(base) + base, FALSE);
\r
734 if (name) return _("不滅の肉体", "Immortal Body");
\r
735 if (desc) return _("一定時間、時間逆転への耐性を得る。", "Gives resistance to time for a while.");
\r
740 if (info) return info_duration(base, base);
\r
744 set_tim_res_time(randint1(base)+base, FALSE);
\r
750 if (name) return _("狂気の円環", "Insanity Circle");
\r
751 if (desc) return _("自分を中心としたカオスの球、混乱の球を発生させ、近くのモンスターを魅了する。",
\r
752 "Generate balls of chaos, confusion and charm centered on you.");
\r
755 HIT_POINT dam = 50 + plev;
\r
756 int power = 20 + plev;
\r
757 int rad = 3 + plev / 20;
\r
759 if (info) return format("%s%d+%d", s_dam, dam/2, dam/2);
\r
763 fire_ball(GF_CHAOS, 0, dam, rad);
\r
764 fire_ball(GF_CONFUSION, 0, dam, rad);
\r
765 fire_ball(GF_CHARM, 0, power, rad);
\r
771 if (name) return _("ペット爆破", "Explode Pets");
\r
772 if (desc) return _("全てのペットを強制的に爆破させる。", "Makes all pets explode.");
\r
777 discharge_minion();
\r
783 if (name) return _("グレーターデーモン召喚", "Summon Greater Demon");
\r
784 if (desc) return _("上級デーモンを召喚する。召喚するには人間('p','h','t'で表されるモンスター)の死体を捧げなければならない。",
\r
785 "Summons greater demon. It need to sacrifice a corpse of human ('p','h' or 't').");
\r
790 if (!cast_summon_greater_demon()) return NULL;
\r
796 if (name) return _("地獄嵐", "Nether Storm");
\r
797 if (desc) return _("超巨大な地獄の球を放つ。", "Generate a huge ball of nether.");
\r
800 HIT_POINT dam = plev * 15;
\r
801 int rad = plev / 5;
\r
803 if (info) return info_damage(0, 0, dam);
\r
807 if (!get_aim_dir(&dir)) return NULL;
\r
809 fire_ball(GF_NETHER, dir, dam, rad);
\r
815 if (name) return _("血の呪い", "Bloody Curse");
\r
816 if (desc) return _("自分がダメージを受けることによって対象に呪いをかけ、ダメージを与え様々な効果を引き起こす。",
\r
817 "Puts blood curse which damages and causes various effects on a monster. You also take damage.");
\r
820 HIT_POINT dam = 600;
\r
823 if (info) return info_damage(0, 0, dam);
\r
827 if (!get_aim_dir(&dir)) return NULL;
\r
829 fire_ball_hide(GF_BLOOD_CURSE, dir, dam, rad);
\r
830 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("血の呪い", "Blood curse"), -1);
\r
836 if (name) return _("魔王変化", "Polymorph Demonlord");
\r
837 if (desc) return _("悪魔の王に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔の王としての能力を得、壁を破壊しながら歩く。",
\r
838 "Mimic a demon lord for a while. Loses abilities of original race and gets great abilities as a demon lord. Even hard walls can't stop your walking.");
\r
843 if (info) return info_duration(base, base);
\r
847 set_mimic(base + randint1(base), MIMIC_DEMON_LORD, FALSE);
\r
857 * @brief 破邪領域魔法の各処理を行う
\r
858 * @param spell 魔法ID
\r
859 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
860 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
862 static cptr do_crusade_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
864 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
865 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
866 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
867 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
870 int plev = p_ptr->lev;
\r
875 if (name) return _("懲罰", "Punishment");
\r
876 if (desc) return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");
\r
879 int dice = 3 + (plev - 1) / 5;
\r
882 if (info) return info_damage(dice, sides, 0);
\r
886 if (!get_aim_dir(&dir)) return NULL;
\r
888 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));
\r
894 if (name) return _("邪悪存在感知", "Detect Evil");
\r
895 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
\r
898 int rad = DETECT_RAD_DEFAULT;
\r
900 if (info) return info_radius(rad);
\r
904 detect_monsters_evil(rad);
\r
910 if (name) return _("恐怖除去", "Remove Fear");
\r
911 if (desc) return _("恐怖を取り除く。", "Removes fear.");
\r
922 if (name) return _("威圧", "Scare Monster");
\r
923 if (desc) return _("モンスター1体を恐怖させる。抵抗されると無効。", "Attempts to scare a monster.");
\r
928 if (info) return info_power(power);
\r
932 if (!get_aim_dir(&dir)) return NULL;
\r
934 fear_monster(dir, power);
\r
940 if (name) return _("聖域", "Sanctuary");
\r
941 if (desc) return _("隣接した全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep monsters in the adjacent squares.");
\r
946 if (info) return info_power(power);
\r
950 sleep_monsters_touch();
\r
956 if (name) return _("入口", "Portal");
\r
957 if (desc) return _("中距離のテレポートをする。", "Teleport medium distance.");
\r
960 POSITION range = 25 + plev / 2;
\r
962 if (info) return info_range(range);
\r
966 teleport_player(range, 0L);
\r
972 if (name) return _("スターダスト", "Star Dust");
\r
973 if (desc) return _("ターゲット付近に閃光のボルトを連射する。", "Fires many bolts of light near the target.");
\r
976 int dice = 3 + (plev - 1) / 9;
\r
979 if (info) return info_multi_damage_dice(dice, sides);
\r
983 if (!get_aim_dir(&dir)) return NULL;
\r
984 fire_blast(GF_LITE, dir, dice, sides, 10, 3);
\r
990 if (name) return _("身体浄化", "Purify");
\r
991 if (desc) return _("傷、毒、朦朧から全快する。", "Heals all cut, stun and poison status.");
\r
1004 if (name) return _("邪悪飛ばし", "Scatter Evil");
\r
1005 if (desc) return _("邪悪なモンスター1体をテレポートさせる。抵抗されると無効。", "Attempts to teleport an evil monster away.");
\r
1008 int power = MAX_SIGHT * 5;
\r
1010 if (info) return info_power(power);
\r
1014 if (!get_aim_dir(&dir)) return NULL;
\r
1015 fire_ball(GF_AWAY_EVIL, dir, power, 0);
\r
1021 if (name) return _("聖なる光球", "Holy Orb");
\r
1022 if (desc) return _("聖なる力をもつ宝珠を放つ。邪悪なモンスターに対して大きなダメージを与えるが、善良なモンスターには効果がない。",
\r
1023 "Fires a ball with holy power. Hurts evil monsters greatly, but don't effect good monsters.");
\r
1028 int rad = (plev < 30) ? 2 : 3;
\r
1031 if (p_ptr->pclass == CLASS_PRIEST ||
\r
1032 p_ptr->pclass == CLASS_HIGH_MAGE ||
\r
1033 p_ptr->pclass == CLASS_SORCERER)
\r
1034 base = plev + plev / 2;
\r
1036 base = plev + plev / 4;
\r
1039 if (info) return info_damage(dice, sides, base);
\r
1043 if (!get_aim_dir(&dir)) return NULL;
\r
1045 fire_ball(GF_HOLY_FIRE, dir, damroll(dice, sides) + base, rad);
\r
1051 if (name) return _("悪魔払い", "Exorcism");
\r
1052 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与え、邪悪なモンスターを恐怖させる。",
\r
1053 "Damages all undead and demons in sight, and scares all evil monsters in sight.");
\r
1059 if (info) return info_damage(1, sides, 0);
\r
1063 dispel_undead(randint1(sides));
\r
1064 dispel_demons(randint1(sides));
\r
1071 if (name) return _("解呪", "Remove Curse");
\r
1072 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
\r
1077 if (remove_curse())
\r
1079 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
1086 if (name) return _("透明視認", "Sense Unseen");
\r
1087 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
\r
1092 if (info) return info_duration(base, base);
\r
1096 set_tim_invis(randint1(base) + base, FALSE);
\r
1102 if (name) return _("対邪悪結界", "Protection from Evil");
\r
1103 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");
\r
1107 int sides = 3 * plev;
\r
1109 if (info) return info_duration(base, sides);
\r
1113 set_protevil(randint1(sides) + base, FALSE);
\r
1119 if (name) return _("裁きの雷", "Judgment Thunder");
\r
1120 if (desc) return _("強力な電撃のボルトを放つ。", "Fires a powerful bolt of lightning.");
\r
1123 HIT_POINT dam = plev * 5;
\r
1125 if (info) return info_damage(0, 0, dam);
\r
1129 if (!get_aim_dir(&dir)) return NULL;
\r
1130 fire_bolt(GF_ELEC, dir, dam);
\r
1136 if (name) return _("聖なる御言葉", "Holy Word");
\r
1137 if (desc) return _("視界内の邪悪な存在に大きなダメージを与え、体力を回復し、毒、恐怖、朦朧状態、負傷から全快する。",
\r
1138 "Damages all evil monsters in sight, heals HP somewhat, and completely heals poison, fear, stun and cut status.");
\r
1141 int dam_sides = plev * 6;
\r
1144 if (info) return format(_("損:1d%d/回%d", "dam:d%d/h%d"), dam_sides, heal);
\r
1147 dispel_evil(randint1(dam_sides));
\r
1158 if (name) return _("開かれた道", "Unbarring Ways");
\r
1159 if (desc) return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");
\r
1164 if (!get_aim_dir(&dir)) return NULL;
\r
1166 destroy_door(dir);
\r
1172 if (name) return _("封魔", "Arrest");
\r
1173 if (desc) return _("邪悪なモンスターの動きを止める。", "Attempts to paralyze an evil monster.");
\r
1176 int power = plev * 2;
\r
1178 if (info) return info_power(power);
\r
1182 if (!get_aim_dir(&dir)) return NULL;
\r
1189 if (name) return _("聖なるオーラ", "Holy Aura");
\r
1190 if (desc) return _("一定時間、邪悪なモンスターを傷つける聖なるオーラを得る。",
\r
1191 "Gives aura of holy power which injures evil monsters which attacked you for a while.");
\r
1196 if (info) return info_duration(base, base);
\r
1200 set_tim_sh_holy(randint1(base) + base, FALSE);
\r
1206 if (name) return _("アンデッド&悪魔退散", "Dispel Undead & Demons");
\r
1207 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与える。", "Damages all undead and demons in sight.");
\r
1210 int sides = plev * 4;
\r
1212 if (info) return info_damage(1, sides, 0);
\r
1216 dispel_undead(randint1(sides));
\r
1217 dispel_demons(randint1(sides));
\r
1223 if (name) return _("邪悪退散", "Dispel Evil");
\r
1224 if (desc) return _("視界内の全ての邪悪なモンスターにダメージを与える。", "Damages all evil monsters in sight.");
\r
1227 int sides = plev * 4;
\r
1229 if (info) return info_damage(1, sides, 0);
\r
1233 dispel_evil(randint1(sides));
\r
1239 if (name) return _("聖なる刃", "Holy Blade");
\r
1240 if (desc) return _("通常の武器に滅邪の属性をつける。", "Makes current weapon especially deadly against evil monsters.");
\r
1251 if (name) return _("スターバースト", "Star Burst");
\r
1252 if (desc) return _("巨大な閃光の球を放つ。", "Fires a huge ball of powerful light.");
\r
1255 HIT_POINT dam = 100 + plev * 2;
\r
1258 if (info) return info_damage(0, 0, dam);
\r
1262 if (!get_aim_dir(&dir)) return NULL;
\r
1264 fire_ball(GF_LITE, dir, dam, rad);
\r
1270 if (name) return _("天使召喚", "Summon Angel");
\r
1271 if (desc) return _("天使を1体召喚する。", "Summons an angel.");
\r
1276 bool pet = !one_in_(3);
\r
1279 if (pet) flg |= PM_FORCE_PET;
\r
1280 else flg |= PM_NO_PET;
\r
1281 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
\r
1283 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_ANGEL, flg))
\r
1287 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
\r
1291 msg_print(_("「我は汝の下僕にあらず! 悪行者よ、悔い改めよ!」", "Mortal! Repent of thy impiousness."));
\r
1299 if (name) return _("士気高揚", "Heroism");
\r
1300 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
1305 if (info) return info_duration(base, base);
\r
1309 set_hero(randint1(base) + base, FALSE);
\r
1317 if (name) return _("呪い退散", "Dispel Curse");
\r
1318 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
\r
1323 if (remove_all_curse())
\r
1325 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
1332 if (name) return _("邪悪追放", "Banish Evil");
\r
1333 if (desc) return _("視界内の全ての邪悪なモンスターをテレポートさせる。抵抗されると無効。",
\r
1334 "Teleports all evil monsters in sight away unless resisted.");
\r
1339 if (info) return info_power(power);
\r
1343 if (banish_evil(power))
\r
1345 msg_print(_("神聖な力が邪悪を打ち払った!", "The holy power banishes evil!"));
\r
1352 if (name) return _("ハルマゲドン", "Armageddon");
\r
1353 if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroy everything in nearby area.");
\r
1361 destroy_area(p_ptr->y, p_ptr->x, base + randint1(sides), FALSE);
\r
1367 if (name) return _("目には目を", "An Eye for an Eye");
\r
1368 if (desc) return _("一定時間、自分がダメージを受けたときに攻撃を行ったモンスターに対して同等のダメージを与える。",
\r
1369 "Gives special aura for a while. When you are attacked by a monster, the monster are injured with same amount of damage as you take.");
\r
1374 if (info) return info_duration(base, base);
\r
1378 set_tim_eyeeye(randint1(base) + base, FALSE);
\r
1384 if (name) return _("神の怒り", "Wrath of the God");
\r
1385 if (desc) return _("ターゲットの周囲に分解の球を多数落とす。", "Drops many balls of disintegration near the target.");
\r
1388 HIT_POINT dam = plev * 3 + 25;
\r
1391 if (info) return info_multi_damage(dam);
\r
1395 if (!cast_wrath_of_the_god(dam, rad)) return NULL;
\r
1401 if (name) return _("神威", "Divine Intervention");
\r
1402 if (desc) return _("隣接するモンスターに聖なるダメージを与え、視界内のモンスターにダメージ、減速、朦朧、混乱、恐怖、眠りを与える。さらに体力を回復する。",
\r
1403 "Damages all adjacent monsters with holy power. Damages and attempt to slow, stun, confuse, scare and freeze all monsters in sight. And heals HP.");
\r
1406 int b_dam = plev * 11;
\r
1407 int d_dam = plev * 4;
\r
1409 int power = plev * 4;
\r
1411 if (info) return format(_("回%d/損%d+%d", "h%d/dm%d+%d"), heal, d_dam, b_dam/2);
\r
1414 project(0, 1, p_ptr->y, p_ptr->x, b_dam, GF_HOLY_FIRE, PROJECT_KILL, -1);
\r
1415 dispel_monsters(d_dam);
\r
1416 slow_monsters(plev);
\r
1417 stun_monsters(power);
\r
1418 confuse_monsters(power);
\r
1419 turn_monsters(power);
\r
1420 stasis_monsters(power);
\r
1427 if (name) return _("聖戦", "Crusade");
\r
1428 if (desc) return _("視界内の善良なモンスターをペットにしようとし、ならなかった場合及び善良でないモンスターを恐怖させる。さらに多数の加速された騎士を召喚し、ヒーロー、祝福、加速、対邪悪結界を得る。",
\r
1429 "Attempts to charm all good monsters in sight, and scare all non-charmed monsters, and summons great number of knights, and gives heroism, bless, speed and protection from evil.");
\r
1435 int sp_sides = 20 + plev;
\r
1436 int sp_base = plev;
\r
1440 for (i = 0; i < 12; i++)
\r
1443 POSITION my = 0, mx = 0;
\r
1447 scatter(&my, &mx, p_ptr->y, p_ptr->x, 4, 0);
\r
1449 /* Require empty grids */
\r
1450 if (cave_empty_bold2(my, mx)) break;
\r
1452 if (attempt < 0) continue;
\r
1453 summon_specific(-1, my, mx, plev, SUMMON_KNIGHTS, (PM_ALLOW_GROUP | PM_FORCE_PET | PM_HASTE));
\r
1455 set_hero(randint1(base) + base, FALSE);
\r
1456 set_blessed(randint1(base) + base, FALSE);
\r
1457 set_fast(randint1(sp_sides) + sp_base, FALSE);
\r
1458 set_protevil(randint1(base) + base, FALSE);
\r
1471 * @param spell 歌ID
\r
1472 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP)
\r
1473 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
\r
1475 static cptr do_music_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
1477 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
1478 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
1479 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
1480 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
1481 bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
\r
1482 bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
\r
1483 bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
\r
1484 static const char s_dam[] = _("損傷:", "dam ");
\r
1487 int plev = p_ptr->lev;
\r
1492 if (name) return _("遅鈍の歌", "Song of Holding");
\r
1493 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
\r
1495 /* Stop singing before start another */
\r
1496 if (cast || fail) stop_singing();
\r
1500 msg_print(_("ゆっくりとしたメロディを口ずさみ始めた...", "You start humming a slow, steady melody..."));
\r
1501 start_singing(spell, MUSIC_SLOW);
\r
1507 if (info) return info_power(power);
\r
1511 slow_monsters(plev);
\r
1517 if (name) return _("祝福の歌", "Song of Blessing");
\r
1518 if (desc) return _("命中率とACのボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
\r
1520 /* Stop singing before start another */
\r
1521 if (cast || fail) stop_singing();
\r
1525 msg_print(_("厳かなメロディを奏で始めた...", "The holy power of the Music of the Ainur enters you..."));
\r
1526 start_singing(spell, MUSIC_BLESS);
\r
1531 if (!p_ptr->blessed)
\r
1533 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
\r
1540 if (name) return _("崩壊の音色", "Wrecking Note");
\r
1541 if (desc) return _("轟音のボルトを放つ。", "Fires a bolt of sound.");
\r
1543 /* Stop singing before start another */
\r
1544 if (cast || fail) stop_singing();
\r
1547 int dice = 4 + (plev - 1) / 5;
\r
1550 if (info) return info_damage(dice, sides, 0);
\r
1554 if (!get_aim_dir(&dir)) return NULL;
\r
1556 fire_bolt(GF_SOUND, dir, damroll(dice, sides));
\r
1562 if (name) return _("朦朧の旋律", "Stun Pattern");
\r
1563 if (desc) return _("視界内の全てのモンスターを朦朧させる。抵抗されると無効。", "Attempts to stun all monsters in sight.");
\r
1565 /* Stop singing before start another */
\r
1566 if (cast || fail) stop_singing();
\r
1570 msg_print(_("眩惑させるメロディを奏で始めた...", "You weave a pattern of sounds to bewilder and daze..."));
\r
1571 start_singing(spell, MUSIC_STUN);
\r
1575 int dice = plev / 10;
\r
1578 if (info) return info_power_dice(dice, sides);
\r
1582 stun_monsters(damroll(dice, sides));
\r
1589 if (name) return _("生命の流れ", "Flow of Life");
\r
1590 if (desc) return _("体力を少し回復させる。", "Heals HP a little.");
\r
1592 /* Stop singing before start another */
\r
1593 if (cast || fail) stop_singing();
\r
1597 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing a song of healing..."));
\r
1598 start_singing(spell, MUSIC_L_LIFE);
\r
1605 if (info) return info_heal(dice, sides, 0);
\r
1609 hp_player(damroll(dice, sides));
\r
1616 if (name) return _("太陽の歌", "Song of the Sun");
\r
1617 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
\r
1619 /* Stop singing before start another */
\r
1620 if (cast || fail) stop_singing();
\r
1624 int sides = plev / 2;
\r
1625 int rad = plev / 10 + 1;
\r
1627 if (info) return info_damage(dice, sides, 0);
\r
1631 msg_print(_("光り輝く歌が辺りを照らした。", "Your uplifting song brings brightness to dark places..."));
\r
1632 lite_area(damroll(dice, sides), rad);
\r
1638 if (name) return _("恐怖の歌", "Song of Fear");
\r
1639 if (desc) return _("視界内の全てのモンスターを恐怖させる。抵抗されると無効。", "Attempts to scare all monsters in sight.");
\r
1641 /* Stop singing before start another */
\r
1642 if (cast || fail) stop_singing();
\r
1646 msg_print(_("おどろおどろしいメロディを奏で始めた...", "You start weaving a fearful pattern..."));
\r
1647 start_singing(spell, MUSIC_FEAR);
\r
1653 if (info) return info_power(power);
\r
1657 project_hack(GF_TURN_ALL, power);
\r
1664 if (name) return _("戦いの歌", "Heroic Ballad");
\r
1665 if (desc) return _("ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
1667 /* Stop singing before start another */
\r
1668 if (cast || fail) stop_singing();
\r
1672 msg_print(_("激しい戦いの歌を歌った...", "You start singing a song of intense fighting..."));
\r
1674 (void)hp_player(10);
\r
1675 (void)set_afraid(0);
\r
1677 /* Recalculate hitpoints */
\r
1678 p_ptr->update |= (PU_HP);
\r
1680 start_singing(spell, MUSIC_HERO);
\r
1687 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
\r
1688 /* Recalculate hitpoints */
\r
1689 p_ptr->update |= (PU_HP);
\r
1696 if (name) return _("霊的知覚", "Clairaudience");
\r
1697 if (desc) return _("近くの罠/扉/階段を感知する。レベル15で全てのモンスター、20で財宝とアイテムを感知できるようになる。レベル25で周辺の地形を感知し、40でその階全体を永久に照らし、ダンジョン内のすべてのアイテムを感知する。この効果は歌い続けることで順に起こる。",
\r
1698 "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
1700 /* Stop singing before start another */
\r
1701 if (cast || fail) stop_singing();
\r
1705 msg_print(_("静かな音楽が感覚を研ぎ澄まさせた...", "Your quiet music sharpens your sense of hearing..."));
\r
1706 /* Hack -- Initialize the turn count */
\r
1707 SINGING_COUNT(p_ptr) = 0;
\r
1708 start_singing(spell, MUSIC_DETECT);
\r
1712 int rad = DETECT_RAD_DEFAULT;
\r
1714 if (info) return info_radius(rad);
\r
1718 int count = SINGING_COUNT(p_ptr);
\r
1720 if (count >= 19) wiz_lite(FALSE);
\r
1724 if (plev > 39 && count < 19)
\r
1725 SINGING_COUNT(p_ptr) = count + 1;
\r
1729 /* There are too many hidden treasure. So... */
\r
1730 /* detect_treasure(rad); */
\r
1731 detect_objects_gold(rad);
\r
1732 detect_objects_normal(rad);
\r
1734 if (plev > 24 && count < 11)
\r
1735 SINGING_COUNT(p_ptr) = count + 1;
\r
1739 detect_monsters_invis(rad);
\r
1740 detect_monsters_normal(rad);
\r
1742 if (plev > 19 && count < 6)
\r
1743 SINGING_COUNT(p_ptr) = count + 1;
\r
1745 detect_traps(rad, TRUE);
\r
1746 detect_doors(rad);
\r
1747 detect_stairs(rad);
\r
1749 if (plev > 14 && count < 3)
\r
1750 SINGING_COUNT(p_ptr) = count + 1;
\r
1757 if (name) return _("魂の歌", "Soul Shriek");
\r
1758 if (desc) return _("視界内の全てのモンスターに対して精神攻撃を行う。", "Damages all monsters in sight with PSI damages.");
\r
1760 /* Stop singing before start another */
\r
1761 if (cast || fail) stop_singing();
\r
1765 msg_print(_("精神を捻じ曲げる歌を歌った...", "You start singing a song of soul in pain..."));
\r
1766 start_singing(spell, MUSIC_PSI);
\r
1771 int sides = plev * 3 / 2;
\r
1773 if (info) return info_damage(dice, sides, 0);
\r
1777 project_hack(GF_PSI, damroll(dice, sides));
\r
1784 if (name) return _("知識の歌", "Song of Lore");
\r
1785 if (desc) return _("自分のいるマスと隣りのマスに落ちているアイテムを鑑定する。", "Identifies all items which are in the adjacent squares.");
\r
1787 /* Stop singing before start another */
\r
1788 if (cast || fail) stop_singing();
\r
1792 msg_print(_("この世界の知識が流れ込んできた...", "You recall the rich lore of the world..."));
\r
1793 start_singing(spell, MUSIC_ID);
\r
1799 if (info) return info_radius(rad);
\r
1803 * MP不足で鑑定が発動される前に歌が中断してしまうのを防止。
\r
1807 project(0, rad, p_ptr->y, p_ptr->x, 0, GF_IDENTIFY, PROJECT_ITEM, -1);
\r
1814 if (name) return _("隠遁の歌", "Hiding Tune");
\r
1815 if (desc) return _("隠密行動能力を上昇させる。", "Gives improved stealth.");
\r
1817 /* Stop singing before start another */
\r
1818 if (cast || fail) stop_singing();
\r
1822 msg_print(_("あなたの姿が景色にとけこんでいった...", "Your song carries you beyond the sight of mortal eyes..."));
\r
1823 start_singing(spell, MUSIC_STEALTH);
\r
1828 if (!p_ptr->tim_stealth)
\r
1830 msg_print(_("姿がはっきりと見えるようになった。", "You are no longer hided."));
\r
1837 if (name) return _("幻影の旋律", "Illusion Pattern");
\r
1838 if (desc) return _("視界内の全てのモンスターを混乱させる。抵抗されると無効。", "Attempts to confuse all monsters in sight.");
\r
1840 /* Stop singing before start another */
\r
1841 if (cast || fail) stop_singing();
\r
1845 msg_print(_("辺り一面に幻影が現れた...", "You weave a pattern of sounds to beguile and confuse..."));
\r
1846 start_singing(spell, MUSIC_CONF);
\r
1850 int power = plev * 2;
\r
1852 if (info) return info_power(power);
\r
1856 confuse_monsters(power);
\r
1863 if (name) return _("破滅の叫び", "Doomcall");
\r
1864 if (desc) return _("視界内の全てのモンスターに対して轟音攻撃を行う。", "Damages all monsters in sight with booming sound.");
\r
1866 /* Stop singing before start another */
\r
1867 if (cast || fail) stop_singing();
\r
1871 msg_print(_("轟音が響いた...", "The fury of the Downfall of Numenor lashes out..."));
\r
1872 start_singing(spell, MUSIC_SOUND);
\r
1876 int dice = 10 + plev / 5;
\r
1879 if (info) return info_damage(dice, sides, 0);
\r
1883 project_hack(GF_SOUND, damroll(dice, sides));
\r
1890 if (name) return _("フィリエルの歌", "Firiel's Song");
\r
1891 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
\r
1894 /* Stop singing before start another */
\r
1895 if (cast || fail) stop_singing();
\r
1899 msg_print(_("生命と復活のテーマを奏で始めた...", "The themes of life and revival are woven into your song..."));
\r
1900 animate_dead(0, p_ptr->y, p_ptr->x);
\r
1906 if (name) return _("旅の仲間", "Fellowship Chant");
\r
1907 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
\r
1909 /* Stop singing before start another */
\r
1910 if (cast || fail) stop_singing();
\r
1914 msg_print(_("安らかなメロディを奏で始めた...", "You weave a slow, soothing melody of imploration..."));
\r
1915 start_singing(spell, MUSIC_CHARM);
\r
1919 int dice = 10 + plev / 15;
\r
1922 if (info) return info_power_dice(dice, sides);
\r
1926 charm_monsters(damroll(dice, sides));
\r
1933 if (name) return _("分解音波", "Sound of disintegration");
\r
1934 if (desc) return _("壁を掘り進む。自分の足元のアイテムは蒸発する。", "Makes you be able to burrow into walls. Objects under your feet evaporate.");
\r
1936 /* Stop singing before start another */
\r
1937 if (cast || fail) stop_singing();
\r
1941 msg_print(_("粉砕するメロディを奏で始めた...", "You weave a violent pattern of sounds to break wall."));
\r
1942 start_singing(spell, MUSIC_WALL);
\r
1948 * MP不足で効果が発動される前に歌が中断してしまうのを防止。
\r
1952 project(0, 0, p_ptr->y, p_ptr->x,
\r
1953 0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1);
\r
1959 if (name) return _("元素耐性", "Finrod's Resistance");
\r
1960 if (desc) return _("酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
\r
1961 "Gives resistance to fire, cold, electricity, acid and poison. These resistances can be added to which from equipment for more powerful resistances.");
\r
1963 /* Stop singing before start another */
\r
1964 if (cast || fail) stop_singing();
\r
1968 msg_print(_("元素の力に対する忍耐の歌を歌った。", "You sing a song of perseverance against powers..."));
\r
1969 start_singing(spell, MUSIC_RESIST);
\r
1974 if (!p_ptr->oppose_acid)
\r
1976 msg_print(_("酸への耐性が薄れた気がする。", "You feel less resistant to acid."));
\r
1979 if (!p_ptr->oppose_elec)
\r
1981 msg_print(_("電撃への耐性が薄れた気がする。", "You feel less resistant to elec."));
\r
1984 if (!p_ptr->oppose_fire)
\r
1986 msg_print(_("火への耐性が薄れた気がする。", "You feel less resistant to fire."));
\r
1989 if (!p_ptr->oppose_cold)
\r
1991 msg_print(_("冷気への耐性が薄れた気がする。", "You feel less resistant to cold."));
\r
1994 if (!p_ptr->oppose_pois)
\r
1996 msg_print(_("毒への耐性が薄れた気がする。", "You feel less resistant to pois."));
\r
2003 if (name) return _("ホビットのメロディ", "Hobbit Melodies");
\r
2004 if (desc) return _("加速する。", "Hastes you.");
\r
2006 /* Stop singing before start another */
\r
2007 if (cast || fail) stop_singing();
\r
2011 msg_print(_("軽快な歌を口ずさみ始めた...", "You start singing joyful pop song..."));
\r
2012 start_singing(spell, MUSIC_SPEED);
\r
2019 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
\r
2026 if (name) return _("歪んだ世界", "World Contortion");
\r
2027 if (desc) return _("近くのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all nearby monsters away unless resisted.");
\r
2030 int rad = plev / 15 + 1;
\r
2031 int power = plev * 3 + 1;
\r
2033 if (info) return info_radius(rad);
\r
2035 /* Stop singing before start another */
\r
2036 if (cast || fail) stop_singing();
\r
2040 msg_print(_("歌が空間を歪めた...", "Reality whirls wildly as you sing a dizzying melody..."));
\r
2041 project(0, rad, p_ptr->y, p_ptr->x, power, GF_AWAY_ALL, PROJECT_KILL, -1);
\r
2047 if (name) return _("退散の歌", "Dispelling chant");
\r
2048 if (desc) return _("視界内の全てのモンスターにダメージを与える。邪悪なモンスターに特に大きなダメージを与える。",
\r
2049 "Damages all monsters in sight. Hurts evil monsters greatly.");
\r
2051 /* Stop singing before start another */
\r
2052 if (cast || fail) stop_singing();
\r
2056 msg_print(_("耐えられない不協和音が敵を責め立てた...", "You cry out in an ear-wracking voice..."));
\r
2057 start_singing(spell, MUSIC_DISPEL);
\r
2061 int m_sides = plev * 3;
\r
2062 int e_sides = plev * 3;
\r
2064 if (info) return format("%s1d%d+1d%d", s_dam, m_sides, e_sides);
\r
2068 dispel_monsters(randint1(m_sides));
\r
2069 dispel_evil(randint1(e_sides));
\r
2075 if (name) return _("サルマンの甘言", "The Voice of Saruman");
\r
2076 if (desc) return _("視界内の全てのモンスターを減速させ、眠らせようとする。抵抗されると無効。", "Attempts to slow and sleep all monsters in sight.");
\r
2078 /* Stop singing before start another */
\r
2079 if (cast || fail) stop_singing();
\r
2083 msg_print(_("優しく、魅力的な歌を口ずさみ始めた...", "You start humming a gentle and attractive song..."));
\r
2084 start_singing(spell, MUSIC_SARUMAN);
\r
2090 if (info) return info_power(power);
\r
2094 slow_monsters(plev);
\r
2095 sleep_monsters(plev);
\r
2102 if (name) return _("嵐の音色", "Song of the Tempest");
\r
2103 if (desc) return _("轟音のビームを放つ。", "Fires a beam of sound.");
\r
2106 int dice = 15 + (plev - 1) / 2;
\r
2109 if (info) return info_damage(dice, sides, 0);
\r
2111 /* Stop singing before start another */
\r
2112 if (cast || fail) stop_singing();
\r
2116 if (!get_aim_dir(&dir)) return NULL;
\r
2118 fire_beam(GF_SOUND, dir, damroll(dice, sides));
\r
2124 if (name) return _("もう一つの世界", "Ambarkanta");
\r
2125 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
\r
2131 if (info) return info_delay(base, sides);
\r
2133 /* Stop singing before start another */
\r
2134 if (cast || fail) stop_singing();
\r
2138 msg_print(_("周囲が変化し始めた...", "You sing of the primeval shaping of Middle-earth..."));
\r
2145 if (name) return _("破壊の旋律", "Wrecking Pattern");
\r
2146 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
\r
2147 "Shakes dungeon structure, and results in random swapping of floors and walls.");
\r
2149 /* Stop singing before start another */
\r
2150 if (cast || fail) stop_singing();
\r
2154 msg_print(_("破壊的な歌が響きわたった...", "You weave a pattern of sounds to contort and shatter..."));
\r
2155 start_singing(spell, MUSIC_QUAKE);
\r
2161 if (info) return info_radius(rad);
\r
2165 earthquake(p_ptr->y, p_ptr->x, 10);
\r
2173 if (name) return _("停滞の歌", "Stationary Shriek");
\r
2174 if (desc) return _("視界内の全てのモンスターを麻痺させようとする。抵抗されると無効。", "Attempts to freeze all monsters in sight.");
\r
2176 /* Stop singing before start another */
\r
2177 if (cast || fail) stop_singing();
\r
2181 msg_print(_("ゆっくりとしたメロディを奏で始めた...", "You weave a very slow pattern which is almost likely to stop..."));
\r
2182 start_singing(spell, MUSIC_STASIS);
\r
2186 int power = plev * 4;
\r
2188 if (info) return info_power(power);
\r
2192 stasis_monsters(power);
\r
2199 if (name) return _("守りの歌", "Endurance");
\r
2200 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。",
\r
2201 "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
2204 /* Stop singing before start another */
\r
2205 if (cast || fail) stop_singing();
\r
2209 msg_print(_("歌が神聖な場を作り出した...", "The holy power of the Music is creating sacred field..."));
\r
2216 if (name) return _("英雄の詩", "The Hero's Poem");
\r
2217 if (desc) return _("加速し、ヒーロー気分になり、視界内の全てのモンスターにダメージを与える。",
\r
2218 "Hastes you. Gives heroism. Damages all monsters in sight.");
\r
2220 /* Stop singing before start another */
\r
2221 if (cast || fail) stop_singing();
\r
2225 msg_print(_("英雄の歌を口ずさんだ...", "You chant a powerful, heroic call to arms..."));
\r
2226 (void)hp_player(10);
\r
2227 (void)set_afraid(0);
\r
2229 /* Recalculate hitpoints */
\r
2230 p_ptr->update |= (PU_HP);
\r
2232 start_singing(spell, MUSIC_SHERO);
\r
2239 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
\r
2240 /* Recalculate hitpoints */
\r
2241 p_ptr->update |= (PU_HP);
\r
2246 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
\r
2252 int sides = plev * 3;
\r
2254 if (info) return info_damage(dice, sides, 0);
\r
2258 dispel_monsters(damroll(dice, sides));
\r
2264 if (name) return _("ヤヴァンナの助け", "Relief of Yavanna");
\r
2265 if (desc) return _("強力な回復の歌で、負傷と朦朧状態も全快する。", "Powerful healing song. Also heals cut and stun completely.");
\r
2267 /* Stop singing before start another */
\r
2268 if (cast || fail) stop_singing();
\r
2272 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing the song..."));
\r
2273 start_singing(spell, MUSIC_H_LIFE);
\r
2280 if (info) return info_heal(dice, sides, 0);
\r
2284 hp_player(damroll(dice, sides));
\r
2293 if (name) return _("再生の歌", "Goddess' rebirth");
\r
2294 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
\r
2297 /* Stop singing before start another */
\r
2298 if (cast || fail) stop_singing();
\r
2302 msg_print(_("暗黒の中に光と美をふりまいた。体が元の活力を取り戻した。",
\r
2303 "You strewed light and beauty in the dark as you sing. You feel refreshed."));
\r
2304 (void)do_res_stat(A_STR);
\r
2305 (void)do_res_stat(A_INT);
\r
2306 (void)do_res_stat(A_WIS);
\r
2307 (void)do_res_stat(A_DEX);
\r
2308 (void)do_res_stat(A_CON);
\r
2309 (void)do_res_stat(A_CHR);
\r
2310 (void)restore_level();
\r
2316 if (name) return _("サウロンの魔術", "Wizardry of Sauron");
\r
2317 if (desc) return _("非常に強力でごく小さい轟音の球を放つ。", "Fires an extremely powerful tiny ball of sound.");
\r
2320 int dice = 50 + plev;
\r
2324 if (info) return info_damage(dice, sides, 0);
\r
2326 /* Stop singing before start another */
\r
2327 if (cast || fail) stop_singing();
\r
2331 if (!get_aim_dir(&dir)) return NULL;
\r
2333 fire_ball(GF_SOUND, dir, damroll(dice, sides), rad);
\r
2339 if (name) return _("フィンゴルフィンの挑戦", "Fingolfin's Challenge");
\r
2340 if (desc) return _("ダメージを受けなくなるバリアを張る。",
\r
2341 "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks.");
\r
2343 /* Stop singing before start another */
\r
2344 if (cast || fail) stop_singing();
\r
2348 msg_print(_("フィンゴルフィンの冥王への挑戦を歌った...",
\r
2349 "You recall the valor of Fingolfin's challenge to the Dark Lord..."));
\r
2352 p_ptr->redraw |= (PR_MAP);
\r
2354 /* Update monsters */
\r
2355 p_ptr->update |= (PU_MONSTERS);
\r
2357 /* Window stuff */
\r
2358 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
\r
2360 start_singing(spell, MUSIC_INVULN);
\r
2365 if (!p_ptr->invuln)
\r
2367 msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));
\r
2369 p_ptr->redraw |= (PR_MAP);
\r
2371 /* Update monsters */
\r
2372 p_ptr->update |= (PU_MONSTERS);
\r
2374 /* Window stuff */
\r
2375 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
\r
2386 * @brief 剣術の各処理を行う
\r
2387 * @param spell 剣術ID
\r
2388 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_CAST)
\r
2389 * @return SPELL_NAME / SPELL_DESC 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
2391 static cptr do_hissatsu_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
2393 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
2394 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
2395 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
2398 int plev = p_ptr->lev;
\r
2403 if (name) return _("飛飯綱", "Tobi-Izuna");
\r
2404 if (desc) return _("2マス離れたところにいるモンスターを攻撃する。", "Attacks a two squares distant monster.");
\r
2408 project_length = 2;
\r
2409 if (!get_aim_dir(&dir)) return NULL;
\r
2411 project_hook(GF_ATTACK, dir, HISSATSU_2, PROJECT_STOP | PROJECT_KILL);
\r
2416 if (name) return _("五月雨斬り", "3-Way Attack");
\r
2417 if (desc) return _("3方向に対して攻撃する。", "Attacks in 3 directions in one time.");
\r
2424 if (!get_rep_dir2(&dir)) return NULL;
\r
2425 if (dir == 5) return NULL;
\r
2427 for (cdir = 0;cdir < 8; cdir++)
\r
2429 if (cdd[cdir] == dir) break;
\r
2432 if (cdir == 8) return NULL;
\r
2434 y = p_ptr->y + ddy_cdd[cdir];
\r
2435 x = p_ptr->x + ddx_cdd[cdir];
\r
2436 if (cave[y][x].m_idx)
\r
2437 py_attack(y, x, 0);
\r
2439 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
\r
2441 y = p_ptr->y + ddy_cdd[(cdir + 7) % 8];
\r
2442 x = p_ptr->x + ddx_cdd[(cdir + 7) % 8];
\r
2443 if (cave[y][x].m_idx)
\r
2444 py_attack(y, x, 0);
\r
2446 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
\r
2448 y = p_ptr->y + ddy_cdd[(cdir + 1) % 8];
\r
2449 x = p_ptr->x + ddx_cdd[(cdir + 1) % 8];
\r
2450 if (cave[y][x].m_idx)
\r
2451 py_attack(y, x, 0);
\r
2453 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
\r
2458 if (name) return _("ブーメラン", "Boomerang");
\r
2459 if (desc) return _("武器を手元に戻ってくるように投げる。戻ってこないこともある。",
\r
2460 "Throws current weapon. And it'll return to your hand unless failed.");
\r
2464 if (!do_cmd_throw(1, TRUE, -1)) return NULL;
\r
2469 if (name) return _("焔霊", "Burning Strike");
\r
2470 if (desc) return _("火炎耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to fire.");
\r
2476 if (!get_rep_dir2(&dir)) return NULL;
\r
2477 if (dir == 5) return NULL;
\r
2479 y = p_ptr->y + ddy[dir];
\r
2480 x = p_ptr->x + ddx[dir];
\r
2482 if (cave[y][x].m_idx)
\r
2483 py_attack(y, x, HISSATSU_FIRE);
\r
2486 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
2493 if (name) return _("殺気感知", "Detect Ferocity");
\r
2494 if (desc) return _("近くの思考することができるモンスターを感知する。", "Detects all monsters except mindless in your vicinity.");
\r
2498 detect_monsters_mind(DETECT_RAD_DEFAULT);
\r
2503 if (name) return _("みね打ち", "Strike to Stun");
\r
2504 if (desc) return _("相手にダメージを与えないが、朦朧とさせる。", "Attempts to stun a monster in the adjacent.");
\r
2510 if (!get_rep_dir2(&dir)) return NULL;
\r
2511 if (dir == 5) return NULL;
\r
2513 y = p_ptr->y + ddy[dir];
\r
2514 x = p_ptr->x + ddx[dir];
\r
2516 if (cave[y][x].m_idx)
\r
2517 py_attack(y, x, HISSATSU_MINEUCHI);
\r
2520 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
2527 if (name) return _("カウンター", "Counter");
\r
2528 if (desc) return _("相手に攻撃されたときに反撃する。反撃するたびにMPを消費。",
\r
2529 "Prepares to counterattack. When attack by a monster, strikes back using SP each time.");
\r
2533 if (p_ptr->riding)
\r
2535 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
\r
2538 msg_print(_("相手の攻撃に対して身構えた。", "You prepare to counter blow."));
\r
2539 p_ptr->counter = TRUE;
\r
2544 if (name) return _("払い抜け", "Harainuke");
\r
2545 if (desc) return _("攻撃した後、反対側に抜ける。",
\r
2546 "Attacks monster with your weapons normally, then move through counter side of the monster.");
\r
2552 if (p_ptr->riding)
\r
2554 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
\r
2558 if (!get_rep_dir2(&dir)) return NULL;
\r
2560 if (dir == 5) return NULL;
\r
2561 y = p_ptr->y + ddy[dir];
\r
2562 x = p_ptr->x + ddx[dir];
\r
2564 if (!cave[y][x].m_idx)
\r
2566 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
2570 py_attack(y, x, 0);
\r
2572 if (!player_can_enter(cave[y][x].feat, 0) || is_trap(cave[y][x].feat))
\r
2578 if (player_can_enter(cave[y][x].feat, 0) && !is_trap(cave[y][x].feat) && !cave[y][x].m_idx)
\r
2582 /* Move the player */
\r
2583 (void)move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);
\r
2589 if (name) return _("サーペンツタン", "Serpent's Tongue");
\r
2590 if (desc) return _("毒耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to poison.");
\r
2596 if (!get_rep_dir2(&dir)) return NULL;
\r
2597 if (dir == 5) return NULL;
\r
2599 y = p_ptr->y + ddy[dir];
\r
2600 x = p_ptr->x + ddx[dir];
\r
2602 if (cave[y][x].m_idx)
\r
2603 py_attack(y, x, HISSATSU_POISON);
\r
2606 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
2613 if (name) return _("斬魔剣弐の太刀", "Zammaken");
\r
2614 if (desc) return _("生命のない邪悪なモンスターに大ダメージを与えるが、他のモンスターには全く効果がない。",
\r
2615 "Attacks an evil unliving monster with great damage. No effect to other monsters.");
\r
2621 if (!get_rep_dir2(&dir)) return NULL;
\r
2622 if (dir == 5) return NULL;
\r
2624 y = p_ptr->y + ddy[dir];
\r
2625 x = p_ptr->x + ddx[dir];
\r
2627 if (cave[y][x].m_idx)
\r
2628 py_attack(y, x, HISSATSU_ZANMA);
\r
2631 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
2638 if (name) return _("裂風剣", "Wind Blast");
\r
2639 if (desc) return _("攻撃した相手を後方へ吹き飛ばす。", "Attacks an adjacent monster, and blow it away.");
\r
2645 if (!get_rep_dir2(&dir)) return NULL;
\r
2646 if (dir == 5) return NULL;
\r
2648 y = p_ptr->y + ddy[dir];
\r
2649 x = p_ptr->x + ddx[dir];
\r
2651 if (cave[y][x].m_idx)
\r
2652 py_attack(y, x, 0);
\r
2655 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
2658 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
\r
2662 if (cave[y][x].m_idx)
\r
2665 POSITION ty = y, tx = x;
\r
2666 POSITION oy = y, ox = x;
\r
2667 MONSTER_IDX m_idx = cave[y][x].m_idx;
\r
2668 monster_type *m_ptr = &m_list[m_idx];
\r
2671 monster_desc(m_name, m_ptr, 0);
\r
2673 for (i = 0; i < 5; i++)
\r
2677 if (cave_empty_bold(y, x))
\r
2684 if ((ty != oy) || (tx != ox))
\r
2686 msg_format(_("%sを吹き飛ばした!", "You blow %s away!"), m_name);
\r
2687 cave[oy][ox].m_idx = 0;
\r
2688 cave[ty][tx].m_idx = m_idx;
\r
2692 update_mon(m_idx, TRUE);
\r
2693 lite_spot(oy, ox);
\r
2694 lite_spot(ty, tx);
\r
2696 if (r_info[m_ptr->r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))
\r
2697 p_ptr->update |= (PU_MON_LITE);
\r
2704 if (name) return _("刀匠の目利き", "Judge");
\r
2705 if (desc) return _("武器・防具を1つ識別する。レベル45以上で武器・防具の能力を完全に知ることができる。",
\r
2706 "Identifies a weapon or armor. Or *identifies* these at level 45.");
\r
2712 if (!identify_fully(TRUE)) return NULL;
\r
2716 if (!ident_spell(TRUE)) return NULL;
\r
2722 if (name) return _("破岩斬", "Rock Smash");
\r
2723 if (desc) return _("岩を壊し、岩石系のモンスターに大ダメージを与える。", "Breaks rock. Or greatly damage a monster made by rocks.");
\r
2729 if (!get_rep_dir2(&dir)) return NULL;
\r
2730 if (dir == 5) return NULL;
\r
2732 y = p_ptr->y + ddy[dir];
\r
2733 x = p_ptr->x + ddx[dir];
\r
2735 if (cave[y][x].m_idx)
\r
2736 py_attack(y, x, HISSATSU_HAGAN);
\r
2738 if (!cave_have_flag_bold(y, x, FF_HURT_ROCK)) break;
\r
2740 /* Destroy the feature */
\r
2741 cave_alter_feat(y, x, FF_HURT_ROCK);
\r
2743 /* Update some things */
\r
2744 p_ptr->update |= (PU_FLOW);
\r
2749 if (name) return _("乱れ雪月花", "Midare-Setsugekka");
\r
2750 if (desc) return _("攻撃回数が増え、冷気耐性のないモンスターに大ダメージを与える。",
\r
2751 "Attacks a monster with increased number of attacks and more damage unless it has resistance to cold.");
\r
2757 if (!get_rep_dir2(&dir)) return NULL;
\r
2758 if (dir == 5) return NULL;
\r
2760 y = p_ptr->y + ddy[dir];
\r
2761 x = p_ptr->x + ddx[dir];
\r
2763 if (cave[y][x].m_idx)
\r
2764 py_attack(y, x, HISSATSU_COLD);
\r
2767 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
2774 if (name) return _("急所突き", "Spot Aiming");
\r
2775 if (desc) return _("モンスターを一撃で倒す攻撃を繰り出す。失敗すると1点しかダメージを与えられない。",
\r
2776 "Attempts to kill a monster instantly. If failed cause only 1HP of damage.");
\r
2782 if (!get_rep_dir2(&dir)) return NULL;
\r
2783 if (dir == 5) return NULL;
\r
2785 y = p_ptr->y + ddy[dir];
\r
2786 x = p_ptr->x + ddx[dir];
\r
2788 if (cave[y][x].m_idx)
\r
2789 py_attack(y, x, HISSATSU_KYUSHO);
\r
2792 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
2799 if (name) return _("魔神斬り", "Majingiri");
\r
2800 if (desc) return _("会心の一撃で攻撃する。攻撃がかわされやすい。",
\r
2801 "Attempts to attack with critical hit. But this attack is easy to evade for a monster.");
\r
2807 if (!get_rep_dir2(&dir)) return NULL;
\r
2808 if (dir == 5) return NULL;
\r
2810 y = p_ptr->y + ddy[dir];
\r
2811 x = p_ptr->x + ddx[dir];
\r
2813 if (cave[y][x].m_idx)
\r
2814 py_attack(y, x, HISSATSU_MAJIN);
\r
2817 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
2824 if (name) return _("捨て身", "Desperate Attack");
\r
2825 if (desc) return _("強力な攻撃を繰り出す。次のターンまでの間、食らうダメージが増える。",
\r
2826 "Attacks with all of your power. But all damages you take will be doubled for one turn.");
\r
2832 if (!get_rep_dir2(&dir)) return NULL;
\r
2833 if (dir == 5) return NULL;
\r
2835 y = p_ptr->y + ddy[dir];
\r
2836 x = p_ptr->x + ddx[dir];
\r
2838 if (cave[y][x].m_idx)
\r
2839 py_attack(y, x, HISSATSU_SUTEMI);
\r
2842 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
2845 p_ptr->sutemi = TRUE;
\r
2850 if (name) return _("雷撃鷲爪斬", "Lightning Eagle");
\r
2851 if (desc) return _("電撃耐性のないモンスターに非常に大きいダメージを与える。",
\r
2852 "Attacks a monster with more damage unless it has resistance to electricity.");
\r
2858 if (!get_rep_dir2(&dir)) return NULL;
\r
2859 if (dir == 5) return NULL;
\r
2861 y = p_ptr->y + ddy[dir];
\r
2862 x = p_ptr->x + ddx[dir];
\r
2864 if (cave[y][x].m_idx)
\r
2865 py_attack(y, x, HISSATSU_ELEC);
\r
2868 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
2875 if (name) return _("入身", "Rush Attack");
\r
2876 if (desc) return _("素早く相手に近寄り攻撃する。", "Steps close to a monster and attacks at a time.");
\r
2880 if (!rush_attack(NULL)) return NULL;
\r
2885 if (name) return _("赤流渦", "Bloody Maelstrom");
\r
2886 if (desc) return _("自分自身も傷を作りつつ、その傷が深いほど大きい威力で全方向の敵を攻撃できる。生きていないモンスターには効果がない。",
\r
2887 "Attacks all adjacent monsters with power corresponding to your cut status. Then increases your cut status. No effect to unliving monsters.");
\r
2894 monster_type *m_ptr;
\r
2896 if (p_ptr->cut < 300)
\r
2897 set_cut(p_ptr->cut + 300);
\r
2899 set_cut(p_ptr->cut * 2);
\r
2901 for (dir = 0; dir < 8; dir++)
\r
2903 y = p_ptr->y + ddy_ddd[dir];
\r
2904 x = p_ptr->x + ddx_ddd[dir];
\r
2905 c_ptr = &cave[y][x];
\r
2907 /* Get the monster */
\r
2908 m_ptr = &m_list[c_ptr->m_idx];
\r
2910 /* Hack -- attack monsters */
\r
2911 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
\r
2913 if (!monster_living(&r_info[m_ptr->r_idx]))
\r
2917 monster_desc(m_name, m_ptr, 0);
\r
2918 msg_format(_("%sには効果がない!", "%s is unharmed!"), m_name);
\r
2920 else py_attack(y, x, HISSATSU_SEKIRYUKA);
\r
2927 if (name) return _("激震撃", "Earthquake Blow");
\r
2928 if (desc) return _("地震を起こす。", "Shakes dungeon structure, and results in random swapping of floors and walls.");
\r
2934 if (!get_rep_dir2(&dir)) return NULL;
\r
2935 if (dir == 5) return NULL;
\r
2937 y = p_ptr->y + ddy[dir];
\r
2938 x = p_ptr->x + ddx[dir];
\r
2940 if (cave[y][x].m_idx)
\r
2941 py_attack(y, x, HISSATSU_QUAKE);
\r
2943 earthquake(p_ptr->y, p_ptr->x, 10);
\r
2948 if (name) return _("地走り", "Crack");
\r
2949 if (desc) return _("衝撃波のビームを放つ。", "Fires a beam of shock wave.");
\r
2953 int total_damage = 0, basedam, i;
\r
2954 u32b flgs[TR_FLAG_SIZE];
\r
2955 object_type *o_ptr;
\r
2956 if (!get_aim_dir(&dir)) return NULL;
\r
2957 msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
\r
2958 for (i = 0; i < 2; i++)
\r
2962 if (!buki_motteruka(INVEN_RARM+i)) break;
\r
2963 o_ptr = &inventory[INVEN_RARM+i];
\r
2964 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
\r
2965 damage = o_ptr->to_d * 100;
\r
2966 object_flags(o_ptr, flgs);
\r
2967 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
\r
2969 /* vorpal blade */
\r
2973 else if (have_flag(flgs, TR_VORPAL))
\r
2975 /* vorpal flag only */
\r
2979 damage += basedam;
\r
2980 damage *= p_ptr->num_blow[i];
\r
2981 total_damage += damage / 200;
\r
2982 if (i) total_damage = total_damage*7/10;
\r
2984 fire_beam(GF_FORCE, dir, total_damage);
\r
2989 if (name) return _("気迫の雄叫び", "War Cry");
\r
2990 if (desc) return _("視界内の全モンスターに対して轟音の攻撃を行う。さらに、近くにいるモンスターを怒らせる。",
\r
2991 "Damages all monsters in sight with sound. Aggravate nearby monsters.");
\r
2995 msg_print(_("雄叫びをあげた!", "You roar out!"));
\r
2996 project_hack(GF_SOUND, randint1(plev * 3));
\r
2997 aggravate_monsters(0);
\r
3002 if (name) return _("無双三段", "Musou-Sandan");
\r
3003 if (desc) return _("強力な3段攻撃を繰り出す。", "Attacks with powerful 3 strikes.");
\r
3009 if (!get_rep_dir2(&dir)) return NULL;
\r
3010 if (dir == 5) return NULL;
\r
3012 for (i = 0; i < 3; i++)
\r
3016 MONSTER_IDX m_idx;
\r
3018 monster_type *m_ptr;
\r
3020 y = p_ptr->y + ddy[dir];
\r
3021 x = p_ptr->x + ddx[dir];
\r
3022 c_ptr = &cave[y][x];
\r
3025 py_attack(y, x, HISSATSU_3DAN);
\r
3028 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
3032 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
\r
3037 /* Monster is dead? */
\r
3038 if (!c_ptr->m_idx) break;
\r
3040 ny = y + ddy[dir];
\r
3041 nx = x + ddx[dir];
\r
3042 m_idx = c_ptr->m_idx;
\r
3043 m_ptr = &m_list[m_idx];
\r
3045 /* Monster cannot move back? */
\r
3046 if (!monster_can_enter(ny, nx, &r_info[m_ptr->r_idx], 0))
\r
3049 if (i < 2) msg_print(NULL);
\r
3054 cave[ny][nx].m_idx = m_idx;
\r
3058 update_mon(m_idx, TRUE);
\r
3060 /* Redraw the old spot */
\r
3063 /* Redraw the new spot */
\r
3064 lite_spot(ny, nx);
\r
3066 /* Player can move forward? */
\r
3067 if (player_can_enter(c_ptr->feat, 0))
\r
3069 /* Move the player */
\r
3070 if (!move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP)) break;
\r
3078 if (i < 2) msg_print(NULL);
\r
3084 if (name) return _("吸血鬼の牙", "Vampire's Fang");
\r
3085 if (desc) return _("攻撃した相手の体力を吸いとり、自分の体力を回復させる。生命を持たないモンスターには通じない。",
\r
3086 "Attacks with vampiric strikes which absorbs HP from a monster and gives them to you. No effect to unliving monsters.");
\r
3092 if (!get_rep_dir2(&dir)) return NULL;
\r
3093 if (dir == 5) return NULL;
\r
3095 y = p_ptr->y + ddy[dir];
\r
3096 x = p_ptr->x + ddx[dir];
\r
3098 if (cave[y][x].m_idx)
\r
3099 py_attack(y, x, HISSATSU_DRAIN);
\r
3102 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
3109 if (name) return _("幻惑", "Moon Dazzling");
\r
3110 if (desc) return _("視界内の起きている全モンスターに朦朧、混乱、眠りを与えようとする。", "Attempts to stun, confuse and sleep all waking monsters.");
\r
3114 msg_print(_("武器を不規則に揺らした...", "You irregularly wave your weapon..."));
\r
3115 project_hack(GF_ENGETSU, plev * 4);
\r
3116 project_hack(GF_ENGETSU, plev * 4);
\r
3117 project_hack(GF_ENGETSU, plev * 4);
\r
3122 if (name) return _("百人斬り", "Hundred Slaughter");
\r
3123 if (desc) return _("連続して入身でモンスターを攻撃する。攻撃するたびにMPを消費。MPがなくなるか、モンスターを倒せなかったら百人斬りは終了する。",
\r
3124 "Performs a series of rush attacks. The series continues while killing each monster in a time and SP remains.");
\r
3128 const int mana_cost_per_monster = 8;
\r
3129 bool is_new = TRUE;
\r
3134 if (!rush_attack(&mdeath)) break;
\r
3137 /* Reserve needed mana point */
\r
3138 p_ptr->csp -= technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
\r
3142 p_ptr->csp -= mana_cost_per_monster;
\r
3144 if (!mdeath) break;
\r
3147 p_ptr->redraw |= PR_MANA;
\r
3150 while (p_ptr->csp > mana_cost_per_monster);
\r
3152 if (is_new) return NULL;
\r
3154 /* Restore reserved mana */
\r
3155 p_ptr->csp += technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
\r
3160 if (name) return _("天翔龍閃", "Dragonic Flash");
\r
3161 if (desc) return _("視界内の場所を指定して、その場所と自分の間にいる全モンスターを攻撃し、その場所に移動する。",
\r
3162 "Runs toward given location while attacking all monsters on the path.");
\r
3168 if (!tgt_pt(&x, &y)) return NULL;
\r
3170 if (!cave_player_teleportable_bold(y, x, 0L) ||
\r
3171 (distance(y, x, p_ptr->y, p_ptr->x) > MAX_SIGHT / 2) ||
\r
3172 !projectable(p_ptr->y, p_ptr->x, y, x))
\r
3174 msg_print(_("失敗!", "You cannot move to that place!"));
\r
3177 if (p_ptr->anti_tele)
\r
3179 msg_print(_("不思議な力がテレポートを防いだ!", "A mysterious force prevents you from teleporting!"));
\r
3182 project(0, 0, y, x, HISSATSU_ISSEN, GF_ATTACK, PROJECT_BEAM | PROJECT_KILL, -1);
\r
3183 teleport_player_to(y, x, 0L);
\r
3188 if (name) return _("二重の剣撃", "Twin Slash");
\r
3189 if (desc) return _("1ターンで2度攻撃を行う。", "double attacks at a time.");
\r
3195 if (!get_rep_dir(&dir, FALSE)) return NULL;
\r
3197 y = p_ptr->y + ddy[dir];
\r
3198 x = p_ptr->x + ddx[dir];
\r
3200 if (cave[y][x].m_idx)
\r
3202 py_attack(y, x, 0);
\r
3203 if (cave[y][x].m_idx)
\r
3206 py_attack(y, x, 0);
\r
3211 msg_print(_("その方向にはモンスターはいません。", "You don't see any monster in this direction"));
\r
3218 if (name) return _("虎伏絶刀勢", "Kofuku-Zettousei");
\r
3219 if (desc) return _("強力な攻撃を行い、近くの場所にも効果が及ぶ。", "Performs a powerful attack which even effect nearby monsters.");
\r
3223 int total_damage = 0, basedam, i;
\r
3225 u32b flgs[TR_FLAG_SIZE];
\r
3226 object_type *o_ptr;
\r
3228 if (!get_rep_dir2(&dir)) return NULL;
\r
3229 if (dir == 5) return NULL;
\r
3231 y = p_ptr->y + ddy[dir];
\r
3232 x = p_ptr->x + ddx[dir];
\r
3234 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
\r
3236 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));
\r
3239 msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
\r
3240 for (i = 0; i < 2; i++)
\r
3243 if (!buki_motteruka(INVEN_RARM+i)) break;
\r
3244 o_ptr = &inventory[INVEN_RARM+i];
\r
3245 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
\r
3246 damage = o_ptr->to_d * 100;
\r
3247 object_flags(o_ptr, flgs);
\r
3248 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
\r
3250 /* vorpal blade */
\r
3254 else if (have_flag(flgs, TR_VORPAL))
\r
3256 /* vorpal flag only */
\r
3260 damage += basedam;
\r
3261 damage += p_ptr->to_d[i] * 100;
\r
3262 damage *= p_ptr->num_blow[i];
\r
3263 total_damage += (damage / 100);
\r
3265 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
3270 if (name) return _("慶雲鬼忍剣", "Keiun-Kininken");
\r
3271 if (desc) return _("自分もダメージをくらうが、相手に非常に大きなダメージを与える。アンデッドには特に効果がある。",
\r
3272 "Attacks a monster with extremely powerful damage. But you also takes some damages. Hurts a undead monster greatly.");
\r
3278 if (!get_rep_dir2(&dir)) return NULL;
\r
3279 if (dir == 5) return NULL;
\r
3281 y = p_ptr->y + ddy[dir];
\r
3282 x = p_ptr->x + ddx[dir];
\r
3284 if (cave[y][x].m_idx)
\r
3285 py_attack(y, x, HISSATSU_UNDEAD);
\r
3288 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
3291 take_hit(DAMAGE_NOESCAPE, 100 + randint1(100), _("慶雲鬼忍剣を使った衝撃", "exhaustion on using Keiun-Kininken"), -1);
\r
3296 if (name) return _("切腹", "Harakiri");
\r
3297 if (desc) return _("「武士道とは、死ぬことと見つけたり。」", "'Busido is found in death'");
\r
3302 if (!get_check(_("本当に自殺しますか?", "Do you really want to commit suicide? "))) return NULL;
\r
3303 /* Special Verification for suicide */
\r
3304 prt(_("確認のため '@' を押して下さい。", "Please verify SUICIDE by typing the '@' sign: "), 0, 0);
\r
3309 if (i != '@') return NULL;
\r
3310 if (p_ptr->total_winner)
\r
3312 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
\r
3313 p_ptr->total_winner = TRUE;
\r
3317 msg_print(_("武士道とは、死ぬことと見つけたり。", "Meaning of Bushi-do is found in the death."));
\r
3318 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
\r
3328 * @brief 呪術領域の武器呪縛の対象にできる武器かどうかを返す。 / An "item_tester_hook" for offer
\r
3329 * @param o_ptr オブジェクト構造体の参照ポインタ
\r
3330 * @return 呪縛可能な武器ならばTRUEを返す
\r
3332 static bool item_tester_hook_weapon_except_bow(object_type *o_ptr)
\r
3334 switch (o_ptr->tval)
\r
3349 * @brief 呪術領域の各処理に使える呪われた装備かどうかを返す。 / An "item_tester_hook" for offer
\r
3350 * @param o_ptr オブジェクト構造体の参照ポインタ
\r
3351 * @return 使える装備ならばTRUEを返す
\r
3353 static bool item_tester_hook_cursed(object_type *o_ptr)
\r
3355 return (bool)(object_is_cursed(o_ptr));
\r
3359 * @brief 呪術領域魔法の各処理を行う
\r
3360 * @param spell 魔法ID
\r
3361 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_CONT / SPELL_STOP)
\r
3362 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
\r
3364 static cptr do_hex_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
3366 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
3367 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
3368 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
3369 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
3370 bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
\r
3371 bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
\r
3375 PLAYER_LEVEL plev = p_ptr->lev;
\r
3380 /*** 1st book (0-7) ***/
\r
3382 if (name) return _("邪なる祝福", "Evily blessing");
\r
3383 if (desc) return _("祝福により攻撃精度と防御力が上がる。", "Attempts to increase +to_hit of a weapon and AC");
\r
3386 if (!p_ptr->blessed)
\r
3388 msg_print(_("高潔な気分になった!", "You feel righteous!"));
\r
3393 if (!p_ptr->blessed)
\r
3395 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
\r
3401 if (name) return _("軽傷の治癒", "Cure light wounds");
\r
3402 if (desc) return _("HPや傷を少し回復させる。", "Heals cut and HP a little.");
\r
3403 if (info) return info_heal(1, 10, 0);
\r
3406 msg_print(_("気分が良くなってくる。", "You feel better and better."));
\r
3410 hp_player(damroll(1, 10));
\r
3411 set_cut(p_ptr->cut - 10);
\r
3416 if (name) return _("悪魔のオーラ", "Demonic aura");
\r
3417 if (desc) return _("炎のオーラを身にまとい、回復速度が速くなる。", "Gives fire aura and regeneration.");
\r
3420 msg_print(_("体が炎のオーラで覆われた。", "You have enveloped by fiery aura!"));
\r
3424 msg_print(_("炎のオーラが消え去った。", "Fiery aura disappeared."));
\r
3429 if (name) return _("悪臭霧", "Stinking mist");
\r
3430 if (desc) return _("視界内のモンスターに微弱量の毒のダメージを与える。", "Deals few damages of poison to all monsters in your sight.");
\r
3431 power = plev / 2 + 5;
\r
3432 if (info) return info_damage(1, power, 0);
\r
3435 project_hack(GF_POIS, randint1(power));
\r
3440 if (name) return _("腕力強化", "Extra might");
\r
3441 if (desc) return _("術者の腕力を上昇させる。", "Attempts to increase your strength.");
\r
3444 msg_print(_("何だか力が湧いて来る。", "You feel you get stronger."));
\r
3449 if (name) return _("武器呪縛", "Curse weapon");
\r
3450 if (desc) return _("装備している武器を呪う。", "Curses your weapon.");
\r
3455 char o_name[MAX_NLEN];
\r
3456 object_type *o_ptr;
\r
3457 u32b f[TR_FLAG_SIZE];
\r
3459 item_tester_hook = item_tester_hook_weapon_except_bow;
\r
3460 q = _("どれを呪いますか?", "Which weapon do you curse?");
\r
3461 s = _("武器を装備していない。", "You wield no weapons.");
\r
3463 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
\r
3465 o_ptr = &inventory[item];
\r
3466 object_desc(o_name, o_ptr, OD_NAME_ONLY);
\r
3467 object_flags(o_ptr, f);
\r
3469 if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
\r
3471 if (!one_in_(3) &&
\r
3472 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
\r
3474 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
\r
3477 if (o_ptr->to_d > 0)
\r
3479 o_ptr->to_d -= randint1(3) % 2;
\r
3480 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
\r
3482 if (o_ptr->to_h > 0)
\r
3484 o_ptr->to_h -= randint1(3) % 2;
\r
3485 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
\r
3487 if (o_ptr->to_a > 0)
\r
3489 o_ptr->to_a -= randint1(3) % 2;
\r
3490 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
\r
3492 msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
\r
3497 int curse_rank = 0;
\r
3498 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
\r
3499 o_ptr->curse_flags |= (TRC_CURSED);
\r
3501 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
\r
3504 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
\r
3507 o_ptr->curse_flags |= (TRC_TY_CURSE);
\r
3508 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
\r
3510 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
\r
3511 add_flag(o_ptr->art_flags, TR_VORPAL);
\r
3512 add_flag(o_ptr->art_flags, TR_VAMPIRIC);
\r
3513 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
\r
3518 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);
\r
3521 p_ptr->update |= (PU_BONUS);
\r
3527 if (name) return _("邪悪感知", "Evil detection");
\r
3528 if (desc) return _("周囲の邪悪なモンスターを感知する。", "Detects evil monsters.");
\r
3529 if (info) return info_range(MAX_SIGHT);
\r
3532 msg_print(_("邪悪な生物の存在を感じ取ろうとした。", "You attend to the presence of evil creatures."));
\r
3537 if (name) return _("我慢", "Patience");
\r
3538 if (desc) return _("数ターン攻撃を耐えた後、受けたダメージを地獄の業火として周囲に放出する。",
\r
3539 "Bursts hell fire strongly after patients any damage while few turns.");
\r
3540 power = MIN(200, (HEX_REVENGE_POWER(p_ptr) * 2));
\r
3541 if (info) return info_damage(0, 0, power);
\r
3544 int a = 3 - (p_ptr->pspeed - 100) / 10;
\r
3545 MAGIC_NUM2 r = 3 + randint1(3) + MAX(0, MIN(3, a));
\r
3547 if (HEX_REVENGE_TURN(p_ptr) > 0)
\r
3549 msg_print(_("すでに我慢をしている。", "You are already patienting."));
\r
3553 HEX_REVENGE_TYPE(p_ptr) = 1;
\r
3554 HEX_REVENGE_TURN(p_ptr) = r;
\r
3555 HEX_REVENGE_POWER(p_ptr) = 0;
\r
3556 msg_print(_("じっと耐えることにした。", "You decide to patient all damages."));
\r
3561 int rad = 2 + (power / 50);
\r
3563 HEX_REVENGE_TURN(p_ptr)--;
\r
3565 if ((HEX_REVENGE_TURN(p_ptr) <= 0) || (power >= 200))
\r
3567 msg_print(_("我慢が解かれた!", "Time for end of patioence!"));
\r
3570 project(0, rad, p_ptr->y, p_ptr->x, power, GF_HELL_FIRE,
\r
3571 (PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);
\r
3573 if (p_ptr->wizard)
\r
3575 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
\r
3579 HEX_REVENGE_TYPE(p_ptr) = 0;
\r
3580 HEX_REVENGE_TURN(p_ptr) = 0;
\r
3581 HEX_REVENGE_POWER(p_ptr) = 0;
\r
3586 /*** 2nd book (8-15) ***/
\r
3588 if (name) return _("氷の鎧", "Ice armor");
\r
3589 if (desc) return _("氷のオーラを身にまとい、防御力が上昇する。", "Gives fire aura and bonus to AC.");
\r
3592 msg_print(_("体が氷の鎧で覆われた。", "You have enveloped by ice armor!"));
\r
3596 msg_print(_("氷の鎧が消え去った。", "Ice armor disappeared."));
\r
3601 if (name) return _("重傷の治癒", "Cure serious wounds");
\r
3602 if (desc) return _("体力や傷を多少回復させる。", "Heals cut and HP more.");
\r
3603 if (info) return info_heal(2, 10, 0);
\r
3606 msg_print(_("気分が良くなってくる。", "You feel better and better."));
\r
3610 hp_player(damroll(2, 10));
\r
3611 set_cut((p_ptr->cut / 2) - 10);
\r
3616 if (name) return _("薬品吸入", "Inhail potion");
\r
3617 if (desc) return _("呪文詠唱を中止することなく、薬の効果を得ることができる。", "Quaffs a potion without canceling of casting a spell.");
\r
3620 CASTING_HEX_FLAGS(p_ptr) |= (1L << HEX_INHAIL);
\r
3621 do_cmd_quaff_potion();
\r
3622 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_INHAIL);
\r
3628 if (name) return _("衰弱の霧", "Hypodynamic mist");
\r
3629 if (desc) return _("視界内のモンスターに微弱量の衰弱属性のダメージを与える。",
\r
3630 "Deals few damages of hypodynamia to all monsters in your sight.");
\r
3631 power = (plev / 2) + 5;
\r
3632 if (info) return info_damage(1, power, 0);
\r
3635 project_hack(GF_HYPODYNAMIA, randint1(power));
\r
3640 if (name) return _("魔剣化", "Swords to runeswords");
\r
3641 if (desc) return _("武器の攻撃力を上げる。切れ味を得、呪いに応じて与えるダメージが上昇し、善良なモンスターに対するダメージが2倍になる。",
\r
3642 "Gives vorpal ability to your weapon. Increases damages by your weapon acccording to curse of your weapon.");
\r
3646 msg_print("あなたの武器が黒く輝いた。");
\r
3648 if (!empty_hands(FALSE))
\r
3649 msg_print("Your weapons glow bright black.");
\r
3651 msg_print("Your weapon glows bright black.");
\r
3657 msg_print("武器の輝きが消え去った。");
\r
3659 msg_format("Brightness of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
\r
3665 if (name) return _("混乱の手", "Touch of confusion");
\r
3666 if (desc) return _("攻撃した際モンスターを混乱させる。", "Confuses a monster when you attack.");
\r
3669 msg_print(_("あなたの手が赤く輝き始めた。", "Your hands glow bright red."));
\r
3673 msg_print(_("手の輝きがなくなった。", "Brightness on your hands disappeard."));
\r
3678 if (name) return _("肉体強化", "Building up");
\r
3679 if (desc) return _("術者の腕力、器用さ、耐久力を上昇させる。攻撃回数の上限を 1 増加させる。",
\r
3680 "Attempts to increases your strength, dexterity and constitusion.");
\r
3683 msg_print(_("身体が強くなった気がした。", "You feel your body is developed more now."));
\r
3688 if (name) return _("反テレポート結界", "Anti teleport barrier");
\r
3689 if (desc) return _("視界内のモンスターのテレポートを阻害するバリアを張る。", "Obstructs all teleportations by monsters in your sight.");
\r
3690 power = plev * 3 / 2;
\r
3691 if (info) return info_power(power);
\r
3694 msg_print(_("テレポートを防ぐ呪いをかけた。", "You feel anyone can not teleport except you."));
\r
3698 /*** 3rd book (16-23) ***/
\r
3700 if (name) return _("衝撃のクローク", "Cloak of shock");
\r
3701 if (desc) return _("電気のオーラを身にまとい、動きが速くなる。", "Gives lightning aura and a bonus to speed.");
\r
3704 msg_print(_("体が稲妻のオーラで覆われた。", "You have enveloped by electrical aura!"));
\r
3708 msg_print(_("稲妻のオーラが消え去った。", "Electrical aura disappeared."));
\r
3713 if (name) return _("致命傷の治癒", "Cure critical wounds");
\r
3714 if (desc) return _("体力や傷を回復させる。", "Heals cut and HP greatry.");
\r
3715 if (info) return info_heal(4, 10, 0);
\r
3718 msg_print(_("気分が良くなってくる。", "You feel better and better."));
\r
3722 hp_player(damroll(4, 10));
\r
3730 if (name) return _("呪力封入", "Recharging");
\r
3731 if (desc) return _("魔法の道具に魔力を再充填する。", "Recharges a magic device.");
\r
3733 if (info) return info_power(power);
\r
3736 if (!recharge(power)) return NULL;
\r
3742 if (name) return _("死者復活", "Animate Dead");
\r
3743 if (desc) return _("死体を蘇らせてペットにする。", "Raises corpses and skeletons from dead.");
\r
3746 msg_print(_("死者への呼びかけを始めた。", "You start to call deads.!"));
\r
3750 animate_dead(0, p_ptr->y, p_ptr->x);
\r
3755 if (name) return _("防具呪縛", "Curse armor");
\r
3756 if (desc) return _("装備している防具に呪いをかける。", "Curse a piece of armour that you wielding.");
\r
3761 char o_name[MAX_NLEN];
\r
3762 object_type *o_ptr;
\r
3763 u32b f[TR_FLAG_SIZE];
\r
3765 item_tester_hook = object_is_armour;
\r
3766 q = _("どれを呪いますか?", "Which piece of armour do you curse?");
\r
3767 s = _("防具を装備していない。", "You wield no piece of armours.");
\r
3769 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
\r
3771 o_ptr = &inventory[item];
\r
3772 object_desc(o_name, o_ptr, OD_NAME_ONLY);
\r
3773 object_flags(o_ptr, f);
\r
3775 if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
\r
3777 if (!one_in_(3) &&
\r
3778 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
\r
3780 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
\r
3783 if (o_ptr->to_d > 0)
\r
3785 o_ptr->to_d -= randint1(3) % 2;
\r
3786 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
\r
3788 if (o_ptr->to_h > 0)
\r
3790 o_ptr->to_h -= randint1(3) % 2;
\r
3791 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
\r
3793 if (o_ptr->to_a > 0)
\r
3795 o_ptr->to_a -= randint1(3) % 2;
\r
3796 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
\r
3798 msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
\r
3803 int curse_rank = 0;
\r
3804 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
\r
3805 o_ptr->curse_flags |= (TRC_CURSED);
\r
3807 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
\r
3810 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
\r
3813 o_ptr->curse_flags |= (TRC_TY_CURSE);
\r
3814 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
\r
3816 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
\r
3817 add_flag(o_ptr->art_flags, TR_RES_POIS);
\r
3818 add_flag(o_ptr->art_flags, TR_RES_DARK);
\r
3819 add_flag(o_ptr->art_flags, TR_RES_NETHER);
\r
3820 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
\r
3825 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);
\r
3828 p_ptr->update |= (PU_BONUS);
\r
3834 if (name) return _("影のクローク", "Cloak of shadow");
\r
3835 if (desc) return _("影のオーラを身にまとい、敵に影のダメージを与える。", "Gives aura of shadow.");
\r
3838 object_type *o_ptr = &inventory[INVEN_OUTER];
\r
3840 if (!o_ptr->k_idx)
\r
3842 msg_print(_("クロークを身につけていない!", "You don't ware any cloak."));
\r
3845 else if (!object_is_cursed(o_ptr))
\r
3847 msg_print(_("クロークは呪われていない!", "Your cloak is not cursed."));
\r
3852 msg_print(_("影のオーラを身にまとった。", "You have enveloped by shadow aura!"));
\r
3857 object_type *o_ptr = &inventory[INVEN_OUTER];
\r
3859 if ((!o_ptr->k_idx) || (!object_is_cursed(o_ptr)))
\r
3861 do_spell(REALM_HEX, spell, SPELL_STOP);
\r
3862 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << spell);
\r
3863 CASTING_HEX_NUM(p_ptr)--;
\r
3864 if (!SINGING_SONG_ID(p_ptr)) set_action(ACTION_NONE);
\r
3869 msg_print(_("影のオーラが消え去った。", "Shadow aura disappeared."));
\r
3874 if (name) return _("苦痛を魔力に", "Pains to mana");
\r
3875 if (desc) return _("視界内のモンスターに精神ダメージ与え、魔力を吸い取る。", "Deals psychic damages to all monsters in sight, and drains some mana.");
\r
3876 power = plev * 3 / 2;
\r
3877 if (info) return info_damage(1, power, 0);
\r
3880 project_hack(GF_PSI_DRAIN, randint1(power));
\r
3885 if (name) return _("目には目を", "Eye for an eye");
\r
3886 if (desc) return _("打撃や魔法で受けたダメージを、攻撃元のモンスターにも与える。", "Returns same damage which you got to the monster which damaged you.");
\r
3889 msg_print(_("復讐したい欲望にかられた。", "You wish strongly you want to revenge anything."));
\r
3893 /*** 4th book (24-31) ***/
\r
3895 if (name) return _("反増殖結界", "Anti multiply barrier");
\r
3896 if (desc) return _("その階の増殖するモンスターの増殖を阻止する。", "Obstructs all multiplying by monsters in entire floor.");
\r
3899 msg_print(_("増殖を阻止する呪いをかけた。", "You feel anyone can not already multiply."));
\r
3904 if (name) return _("全復活", "Restoration");
\r
3905 if (desc) return _("経験値を徐々に復活し、減少した能力値を回復させる。", "Restores experience and status.");
\r
3908 msg_print(_("体が元の活力を取り戻し始めた。", "You feel your lost status starting to return."));
\r
3912 bool flag = FALSE;
\r
3913 int d = (p_ptr->max_exp - p_ptr->exp);
\r
3914 int r = (p_ptr->exp / 20);
\r
3920 p_ptr->exp = p_ptr->max_exp;
\r
3924 /* Check the experience */
\r
3925 check_experience();
\r
3929 for (i = A_STR; i < 6; i ++)
\r
3931 if (p_ptr->stat_cur[i] < p_ptr->stat_max[i])
\r
3933 if (p_ptr->stat_cur[i] < 18)
\r
3934 p_ptr->stat_cur[i]++;
\r
3936 p_ptr->stat_cur[i] += 10;
\r
3938 if (p_ptr->stat_cur[i] > p_ptr->stat_max[i])
\r
3939 p_ptr->stat_cur[i] = p_ptr->stat_max[i];
\r
3941 /* Recalculate bonuses */
\r
3942 p_ptr->update |= (PU_BONUS);
\r
3950 msg_format(_("%sの呪文の詠唱をやめた。", "Finish casting '%^s'."), do_spell(REALM_HEX, HEX_RESTORE, SPELL_NAME));
\r
3951 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_RESTORE);
\r
3952 if (cont) CASTING_HEX_NUM(p_ptr)--;
\r
3953 if (CASTING_HEX_NUM(p_ptr)) p_ptr->action = ACTION_NONE;
\r
3955 /* Redraw status */
\r
3956 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
\r
3957 p_ptr->redraw |= (PR_EXTRA);
\r
3965 if (name) return _("呪力吸収", "Drain curse power");
\r
3966 if (desc) return _("呪われた武器の呪いを吸収して魔力を回復する。", "Drains curse on your weapon and heals SP a little.");
\r
3971 u32b f[TR_FLAG_SIZE];
\r
3972 object_type *o_ptr;
\r
3974 item_tester_hook = item_tester_hook_cursed;
\r
3975 q = _("どの装備品から吸収しますか?", "Which cursed equipment do you drain mana from?");
\r
3976 s = _("呪われたアイテムを装備していない。", "You have no cursed equipment.");
\r
3978 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
\r
3980 o_ptr = &inventory[item];
\r
3981 object_flags(o_ptr, f);
\r
3983 p_ptr->csp += (p_ptr->lev / 5) + randint1(p_ptr->lev / 5);
\r
3984 if (have_flag(f, TR_TY_CURSE) || (o_ptr->curse_flags & TRC_TY_CURSE)) p_ptr->csp += randint1(5);
\r
3985 if (p_ptr->csp > p_ptr->msp) p_ptr->csp = p_ptr->msp;
\r
3987 if (o_ptr->curse_flags & TRC_PERMA_CURSE)
\r
3991 else if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
\r
3995 msg_print(_("呪いを全て吸い取った。", "Heavy curse vanished away."));
\r
3996 o_ptr->curse_flags = 0L;
\r
3999 else if ((o_ptr->curse_flags & (TRC_CURSED)) && one_in_(3))
\r
4001 msg_print(_("呪いを全て吸い取った。", "Curse vanished away."));
\r
4002 o_ptr->curse_flags = 0L;
\r
4010 if (name) return _("吸血の刃", "Swords to vampires");
\r
4011 if (desc) return _("吸血属性で攻撃する。", "Gives vampiric ability to your weapon.");
\r
4015 msg_print("あなたの武器が血を欲している。");
\r
4017 if (!empty_hands(FALSE))
\r
4018 msg_print("Your weapons want more blood now.");
\r
4020 msg_print("Your weapon wants more blood now.");
\r
4026 msg_print("武器の渇望が消え去った。");
\r
4028 msg_format("Thirsty of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
\r
4034 if (name) return _("朦朧の言葉", "Word of stun");
\r
4035 if (desc) return _("視界内のモンスターを朦朧とさせる。", "Stuns all monsters in your sight.");
\r
4037 if (info) return info_power(power);
\r
4040 stun_monsters(power);
\r
4045 if (name) return _("影移動", "Moving into shadow");
\r
4046 if (desc) return _("モンスターの隣のマスに瞬間移動する。", "Teleports you close to a monster.");
\r
4053 for (i = 0; i < 3; i++)
\r
4055 if (!tgt_pt(&x, &y)) return FALSE;
\r
4059 for (dir = 0; dir < 8; dir++)
\r
4061 int dy = y + ddy_ddd[dir];
\r
4062 int dx = x + ddx_ddd[dir];
\r
4063 if (dir == 5) continue;
\r
4064 if(cave[dy][dx].m_idx) flag = TRUE;
\r
4067 if (!cave_empty_bold(y, x) || (cave[y][x].info & CAVE_ICKY) ||
\r
4068 (distance(y, x, p_ptr->y, p_ptr->x) > plev + 2))
\r
4070 msg_print(_("そこには移動できない。", "Can not teleport to there."));
\r
4076 if (flag && randint0(plev * plev / 2))
\r
4078 teleport_player_to(y, x, 0L);
\r
4082 msg_print(_("おっと!", "Oops!"));
\r
4083 teleport_player(30, 0L);
\r
4091 if (name) return _("反魔法結界", "Anti magic barrier");
\r
4092 if (desc) return _("視界内のモンスターの魔法を阻害するバリアを張る。", "Obstructs all magic spell of monsters in your sight.");
\r
4093 power = plev * 3 / 2;
\r
4094 if (info) return info_power(power);
\r
4097 msg_print(_("魔法を防ぐ呪いをかけた。", "You feel anyone can not cast spells except you."));
\r
4102 if (name) return _("復讐の宣告", "Revenge sentence");
\r
4103 if (desc) return _("数ターン後にそれまで受けたダメージに応じた威力の地獄の劫火の弾を放つ。",
\r
4104 "Fires a ball of hell fire to try revenging after few turns.");
\r
4105 power = HEX_REVENGE_POWER(p_ptr);
\r
4106 if (info) return info_damage(0, 0, power);
\r
4110 int a = 3 - (p_ptr->pspeed - 100) / 10;
\r
4111 r = 1 + randint1(2) + MAX(0, MIN(3, a));
\r
4113 if (HEX_REVENGE_TURN(p_ptr) > 0)
\r
4115 msg_print(_("すでに復讐は宣告済みだ。", "You already pronounced your revenge."));
\r
4119 HEX_REVENGE_TYPE(p_ptr) = 2;
\r
4120 HEX_REVENGE_TURN(p_ptr) = r;
\r
4121 msg_format(_("あなたは復讐を宣告した。あと %d ターン。", "You pronounce your revenge. %d turns left."), r);
\r
4126 HEX_REVENGE_TURN(p_ptr)--;
\r
4128 if (HEX_REVENGE_TURN(p_ptr) <= 0)
\r
4138 msg_print(_("復讐の時だ!", "Time to revenge!"));
\r
4140 while (!get_aim_dir(&dir));
\r
4142 fire_ball(GF_HELL_FIRE, dir, power, 1);
\r
4144 if (p_ptr->wizard)
\r
4146 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
\r
4151 msg_print(_("復讐する気が失せた。", "You are not a mood to revenge."));
\r
4153 HEX_REVENGE_POWER(p_ptr) = 0;
\r
4159 /* start casting */
\r
4160 if ((cast) && (add))
\r
4163 CASTING_HEX_FLAGS(p_ptr) |= 1L << (spell);
\r
4164 CASTING_HEX_NUM(p_ptr)++;
\r
4166 if (p_ptr->action != ACTION_SPELL) set_action(ACTION_SPELL);
\r
4169 /* Redraw status */
\r
4172 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
\r
4173 p_ptr->redraw |= (PR_EXTRA | PR_HP | PR_MANA);
\r
4181 * @brief 魔法処理のメインルーチン
\r
4182 * @param realm 魔法領域のID
\r
4183 * @param spell 各領域の魔法ID
\r
4184 * @param mode 求める処理
\r
4185 * @return 各領域魔法に各種テキストを求めた場合は文字列参照ポインタ、そうでない場合はNULLポインタを返す。
\r
4187 cptr do_spell(REALM_IDX realm, SPELL_IDX spell, BIT_FLAGS mode)
\r
4191 case REALM_LIFE: return do_life_spell(spell, mode);
\r
4192 case REALM_SORCERY: return do_sorcery_spell(spell, mode);
\r
4193 case REALM_NATURE: return do_nature_spell(spell, mode);
\r
4194 case REALM_CHAOS: return do_chaos_spell(spell, mode);
\r
4195 case REALM_DEATH: return do_death_spell(spell, mode);
\r
4196 case REALM_TRUMP: return do_trump_spell(spell, mode);
\r
4197 case REALM_ARCANE: return do_arcane_spell(spell, mode);
\r
4198 case REALM_CRAFT: return do_craft_spell(spell, mode);
\r
4199 case REALM_DAEMON: return do_daemon_spell(spell, mode);
\r
4200 case REALM_CRUSADE: return do_crusade_spell(spell, mode);
\r
4201 case REALM_MUSIC: return do_music_spell(spell, mode);
\r
4202 case REALM_HISSATSU: return do_hissatsu_spell(spell, mode);
\r
4203 case REALM_HEX: return do_hex_spell(spell, mode);
\r