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-life.h"
\r
16 #include "realm-nature.h"
\r
17 #include "realm-sorcery.h"
\r
21 * 魔法の効果を「キャプション:ダイス+定数値」のフォーマットで出力する / Generate dice info string such as "foo 2d10"
\r
26 * @return フォーマットに従い整形された文字列
\r
28 cptr info_string_dice(cptr str, int dice, int sides, int base)
\r
32 return format("%s%d", str, base);
\r
36 return format("%s%dd%d", str, dice, sides);
\r
38 /* Dice plus base value */
\r
40 return format("%s%dd%d%+d", str, dice, sides, base);
\r
45 * @brief 魔法によるダメージを出力する / Generate damage-dice info string such as "dam 2d10"
\r
49 * @return フォーマットに従い整形された文字列
\r
51 cptr info_damage(int dice, int sides, int base)
\r
53 return info_string_dice(_("損傷:", "dam "), dice, sides, base);
\r
57 * @brief 魔法の効果時間を出力する / Generate duration info string such as "dur 20+1d20"
\r
60 * @return フォーマットに従い整形された文字列
\r
62 cptr info_duration(int base, int sides)
\r
64 return format(_("期間:%d+1d%d", "dur %d+1d%d"), base, sides);
\r
68 * @brief 魔法の効果範囲を出力する / Generate range info string such as "range 5"
\r
70 * @return フォーマットに従い整形された文字列
\r
72 cptr info_range(POSITION range)
\r
74 return format(_("範囲:%d", "range %d"), range);
\r
78 * @brief 魔法による回復量を出力する / Generate heal info string such as "heal 2d8"
\r
82 * @return フォーマットに従い整形された文字列
\r
84 cptr info_heal(int dice, int sides, int base)
\r
86 return info_string_dice(_("回復:", "heal "), dice, sides, base);
\r
90 * @brief 魔法効果発動までの遅延ターンを出力する / Generate delay info string such as "delay 15+1d15"
\r
93 * @return フォーマットに従い整形された文字列
\r
95 cptr info_delay(int base, int sides)
\r
97 return format(_("遅延:%d+1d%d", "delay %d+1d%d"), base, sides);
\r
102 * @brief 魔法によるダメージを出力する(固定値&複数回処理) / Generate multiple-damage info string such as "dam 25 each"
\r
104 * @return フォーマットに従い整形された文字列
\r
106 cptr info_multi_damage(HIT_POINT dam)
\r
108 return format(_("損傷:各%d", "dam %d each"), dam);
\r
113 * @brief 魔法によるダメージを出力する(ダイスのみ&複数回処理) / Generate multiple-damage-dice info string such as "dam 5d2 each"
\r
115 * @param sides ダイス目
\r
116 * @return フォーマットに従い整形された文字列
\r
118 cptr info_multi_damage_dice(int dice, int sides)
\r
120 return format(_("損傷:各%dd%d", "dam %dd%d each"), dice, sides);
\r
124 * @brief 魔法による一般的な効力値を出力する(固定値) / Generate power info string such as "power 100"
\r
126 * @return フォーマットに従い整形された文字列
\r
128 cptr info_power(int power)
\r
130 return format(_("効力:%d", "power %d"), power);
\r
135 * @brief 魔法による一般的な効力値を出力する(ダイス値) / Generate power info string such as "power 100"
\r
137 * @param sides ダイス目
\r
138 * @return フォーマットに従い整形された文字列
\r
141 * Generate power info string such as "power 1d100"
\r
143 cptr info_power_dice(int dice, int sides)
\r
145 return format(_("効力:%dd%d", "power %dd%d"), dice, sides);
\r
150 * @brief 魔法の効果半径を出力する / Generate radius info string such as "rad 100"
\r
152 * @return フォーマットに従い整形された文字列
\r
154 cptr info_radius(int rad)
\r
156 return format(_("半径:%d", "rad %d"), rad);
\r
161 * @brief 魔法効果の限界重量を出力する / Generate weight info string such as "max wgt 15"
\r
162 * @param weight 最大重量
\r
163 * @return フォーマットに従い整形された文字列
\r
165 cptr info_weight(int weight)
\r
168 return format("最大重量:%d.%dkg", lbtokg1(weight), lbtokg2(weight));
\r
170 return format("max wgt %d", weight/10);
\r
176 * @brief 歌の開始を処理する / Start singing if the player is a Bard
\r
177 * @param spell 領域魔法としてのID
\r
178 * @param song 魔法効果のID
\r
181 static void start_singing(SPELL_IDX spell, MAGIC_NUM1 song)
\r
183 /* Remember the song index */
\r
184 SINGING_SONG_EFFECT(p_ptr) = (MAGIC_NUM1)song;
\r
186 /* Remember the index of the spell which activated the song */
\r
187 SINGING_SONG_ID(p_ptr) = (MAGIC_NUM2)spell;
\r
190 /* Now the player is singing */
\r
191 set_action(ACTION_SING);
\r
194 /* Recalculate bonuses */
\r
195 p_ptr->update |= (PU_BONUS);
\r
197 /* Redraw status bar */
\r
198 p_ptr->redraw |= (PR_STATUS);
\r
202 * @brief 歌の停止を処理する / Stop singing if the player is a Bard
\r
205 void stop_singing(void)
\r
207 if (p_ptr->pclass != CLASS_BARD) return;
\r
209 /* Are there interupted song? */
\r
210 if (INTERUPTING_SONG_EFFECT(p_ptr))
\r
212 /* Forget interupted song */
\r
213 INTERUPTING_SONG_EFFECT(p_ptr) = MUSIC_NONE;
\r
217 /* The player is singing? */
\r
218 if (!SINGING_SONG_EFFECT(p_ptr)) return;
\r
220 /* Hack -- if called from set_action(), avoid recursive loop */
\r
221 if (p_ptr->action == ACTION_SING) set_action(ACTION_NONE);
\r
223 /* Message text of each song or etc. */
\r
224 do_spell(REALM_MUSIC, SINGING_SONG_ID(p_ptr), SPELL_STOP);
\r
226 SINGING_SONG_EFFECT(p_ptr) = MUSIC_NONE;
\r
227 SINGING_SONG_ID(p_ptr) = 0;
\r
229 /* Recalculate bonuses */
\r
230 p_ptr->update |= (PU_BONUS);
\r
232 /* Redraw status bar */
\r
233 p_ptr->redraw |= (PR_STATUS);
\r
243 * @brief 暗黒領域魔法の各処理を行う
\r
244 * @param spell 魔法ID
\r
245 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
246 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
248 static cptr do_death_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
250 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
251 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
252 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
253 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
255 static const char s_dam[] = _("損傷:", "dam ");
\r
256 static const char s_random[] = _("ランダム", "random");
\r
259 int plev = p_ptr->lev;
\r
264 if (name) return _("無生命感知", "Detect Unlife");
\r
265 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
\r
268 int rad = DETECT_RAD_DEFAULT;
\r
270 if (info) return info_radius(rad);
\r
274 detect_monsters_nonliving(rad);
\r
280 if (name) return _("呪殺弾", "Malediction");
\r
281 if (desc) return _("ごく小さな邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",
\r
282 "Fires a tiny ball of evil power which hurts good monsters greatly.");
\r
285 int dice = 3 + (plev - 1) / 5;
\r
289 if (info) return info_damage(dice, sides, 0);
\r
293 if (!get_aim_dir(&dir)) return NULL;
\r
296 * A radius-0 ball may (1) be aimed at
\r
297 * objects etc., and will affect them;
\r
298 * (2) may be aimed at ANY visible
\r
299 * monster, unlike a 'bolt' which must
\r
300 * travel to the monster.
\r
303 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides), rad);
\r
307 /* Special effect first */
\r
308 int effect = randint1(1000);
\r
311 fire_ball_hide(GF_DEATH_RAY, dir, plev * 200, 0);
\r
312 else if (effect < 500)
\r
313 fire_ball_hide(GF_TURN_ALL, dir, plev, 0);
\r
314 else if (effect < 800)
\r
315 fire_ball_hide(GF_OLD_CONF, dir, plev, 0);
\r
317 fire_ball_hide(GF_STUN, dir, plev, 0);
\r
324 if (name) return _("邪悪感知", "Detect Evil");
\r
325 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
\r
328 int rad = DETECT_RAD_DEFAULT;
\r
330 if (info) return info_radius(rad);
\r
334 detect_monsters_evil(rad);
\r
340 if (name) return _("悪臭雲", "Stinking Cloud");
\r
341 if (desc) return _("毒の球を放つ。", "Fires a ball of poison.");
\r
344 HIT_POINT dam = 10 + plev / 2;
\r
347 if (info) return info_damage(0, 0, dam);
\r
351 if (!get_aim_dir(&dir)) return NULL;
\r
353 fire_ball(GF_POIS, dir, dam, rad);
\r
359 if (name) return _("黒い眠り", "Black Sleep");
\r
360 if (desc) return _("1体のモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep a monster.");
\r
365 if (info) return info_power(power);
\r
369 if (!get_aim_dir(&dir)) return NULL;
\r
371 sleep_monster(dir, plev);
\r
377 if (name) return _("耐毒", "Resist Poison");
\r
378 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",
\r
379 "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");
\r
384 if (info) return info_duration(base, base);
\r
388 set_oppose_pois(randint1(base) + base, FALSE);
\r
394 if (name) return _("恐慌", "Horrify");
\r
395 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
\r
400 if (info) return info_power(power);
\r
404 if (!get_aim_dir(&dir)) return NULL;
\r
406 fear_monster(dir, power);
\r
407 stun_monster(dir, power);
\r
413 if (name) return _("アンデッド従属", "Enslave Undead");
\r
414 if (desc) return _("アンデッド1体を魅了する。抵抗されると無効。", "Attempts to charm an undead monster.");
\r
419 if (info) return info_power(power);
\r
423 if (!get_aim_dir(&dir)) return NULL;
\r
425 control_one_undead(dir, power);
\r
431 if (name) return _("エントロピーの球", "Orb of Entropy");
\r
432 if (desc) return _("生命のある者のHPと最大HP双方にダメージを与える効果のある球を放つ。", "Fires a ball which damages to both HP and MaxHP of living monsters.");
\r
437 int rad = (plev < 30) ? 2 : 3;
\r
440 if (p_ptr->pclass == CLASS_MAGE ||
\r
441 p_ptr->pclass == CLASS_HIGH_MAGE ||
\r
442 p_ptr->pclass == CLASS_SORCERER)
\r
443 base = plev + plev / 2;
\r
445 base = plev + plev / 4;
\r
448 if (info) return info_damage(dice, sides, base);
\r
452 if (!get_aim_dir(&dir)) return NULL;
\r
454 fire_ball(GF_HYPODYNAMIA, dir, damroll(dice, sides) + base, rad);
\r
460 if (name) return _("地獄の矢", "Nether Bolt");
\r
461 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
\r
464 int dice = 8 + (plev - 5) / 4;
\r
467 if (info) return info_damage(dice, sides, 0);
\r
471 if (!get_aim_dir(&dir)) return NULL;
\r
473 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
\r
479 if (name) return _("殺戮雲", "Cloud kill");
\r
480 if (desc) return _("自分を中心とした毒の球を発生させる。", "Generate a ball of poison centered on you.");
\r
483 HIT_POINT dam = (30 + plev) * 2;
\r
484 int rad = plev / 10 + 2;
\r
486 if (info) return info_damage(0, 0, dam/2);
\r
490 project(0, rad, p_ptr->y, p_ptr->x, dam, GF_POIS, PROJECT_KILL | PROJECT_ITEM, -1);
\r
496 if (name) return _("モンスター消滅", "Genocide One");
\r
497 if (desc) return _("モンスター1体を消し去る。経験値やアイテムは手に入らない。抵抗されると無効。", "Attempts to vanish a monster.");
\r
500 int power = plev + 50;
\r
502 if (info) return info_power(power);
\r
506 if (!get_aim_dir(&dir)) return NULL;
\r
508 fire_ball_hide(GF_GENOCIDE, dir, power, 0);
\r
514 if (name) return _("毒の刃", "Poison Branding");
\r
515 if (desc) return _("武器に毒の属性をつける。", "Makes current weapon poison branded.");
\r
526 if (name) return _("吸血の矢", "Vampiric Bolt");
\r
527 if (desc) return _("ボルトによりモンスター1体から生命力を吸いとる。吸いとった生命力によって満腹度が上がる。",
\r
528 "Absorbs some HP from a monster and gives them to you by bolt. You will also gain nutritional sustenance from this.");
\r
532 int sides = plev * 2;
\r
533 int base = plev * 2;
\r
535 if (info) return info_damage(dice, sides, base);
\r
539 HIT_POINT dam = base + damroll(dice, sides);
\r
541 if (!get_aim_dir(&dir)) return NULL;
\r
543 if (hypodynamic_bolt(dir, dam))
\r
545 chg_virtue(V_SACRIFICE, -1);
\r
546 chg_virtue(V_VITALITY, -1);
\r
551 * Gain nutritional sustenance:
\r
554 * A Food ration gives 5000
\r
555 * food points (by contrast)
\r
556 * Don't ever get more than
\r
557 * "Full" this way But if we
\r
558 * ARE Gorged, it won't cure
\r
561 dam = p_ptr->food + MIN(5000, 100 * dam);
\r
563 /* Not gorged already */
\r
564 if (p_ptr->food < PY_FOOD_MAX)
\r
565 set_food(dam >= PY_FOOD_MAX ? PY_FOOD_MAX - 1 : dam);
\r
572 if (name) return _("反魂の術", "Animate dead");
\r
573 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
\r
578 animate_dead(0, p_ptr->y, p_ptr->x);
\r
584 if (name) return _("抹殺", "Genocide");
\r
585 if (desc) return _("指定した文字のモンスターを現在の階から消し去る。抵抗されると無効。",
\r
586 "Eliminates an entire class of monster, exhausting you. Powerful or unique monsters may resist.");
\r
589 int power = plev+50;
\r
591 if (info) return info_power(power);
\r
595 symbol_genocide(power, TRUE);
\r
601 if (name) return _("狂戦士化", "Berserk");
\r
602 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");
\r
607 if (info) return info_duration(base, base);
\r
611 set_shero(randint1(base) + base, FALSE);
\r
619 if (name) return _("悪霊召喚", "Invoke Spirits");
\r
620 if (desc) return _("ランダムで様々な効果が起こる。", "Causes random effects.");
\r
623 if (info) return s_random;
\r
627 if (!get_aim_dir(&dir)) return NULL;
\r
629 cast_invoke_spirits(dir);
\r
635 if (name) return _("暗黒の矢", "Dark Bolt");
\r
636 if (desc) return _("暗黒のボルトもしくはビームを放つ。", "Fires a bolt or beam of darkness.");
\r
639 int dice = 4 + (plev - 5) / 4;
\r
642 if (info) return info_damage(dice, sides, 0);
\r
646 if (!get_aim_dir(&dir)) return NULL;
\r
648 fire_bolt_or_beam(beam_chance(), GF_DARK, dir, damroll(dice, sides));
\r
654 if (name) return _("狂乱戦士", "Battle Frenzy");
\r
655 if (desc) return _("狂戦士化し、恐怖を除去し、加速する。",
\r
656 "Gives another bonus to hit and HP, immunity to fear for a while. Hastes you. But decreases AC.");
\r
660 int sp_base = plev / 2;
\r
661 int sp_sides = 20 + plev / 2;
\r
663 if (info) return info_duration(b_base, b_base);
\r
667 set_shero(randint1(25) + 25, FALSE);
\r
670 set_fast(randint1(sp_sides) + sp_base, FALSE);
\r
676 if (name) return _("吸血の刃", "Vampiric Branding");
\r
677 if (desc) return _("武器に吸血の属性をつける。", "Makes current weapon Vampiric.");
\r
688 if (name) return _("吸血の連矢", "Vampiric Bolts");
\r
689 if (desc) return _("3連射のボルトによりモンスター1体から生命力を吸いとる。吸いとった生命力によって体力が回復する。",
\r
690 "Fires 3 bolts. Each of the bolts absorbs some HP from a monster and gives them to you.");
\r
692 HIT_POINT dam = 100;
\r
694 if (info) return format("%s3*%d", s_dam, dam);
\r
700 if (!get_aim_dir(&dir)) return NULL;
\r
702 chg_virtue(V_SACRIFICE, -1);
\r
703 chg_virtue(V_VITALITY, -1);
\r
705 for (i = 0; i < 3; i++)
\r
707 if (hypodynamic_bolt(dir, dam))
\r
715 if (name) return _("死の言魂", "Nether Wave");
\r
716 if (desc) return _("視界内の生命のあるモンスターにダメージを与える。", "Damages all living monsters in sight.");
\r
719 int sides = plev * 3;
\r
721 if (info) return info_damage(1, sides, 0);
\r
725 dispel_living(randint1(sides));
\r
731 if (name) return _("暗黒の嵐", "Darkness Storm");
\r
732 if (desc) return _("巨大な暗黒の球を放つ。", "Fires a huge ball of darkness.");
\r
735 HIT_POINT dam = 100 + plev * 2;
\r
738 if (info) return info_damage(0, 0, dam);
\r
742 if (!get_aim_dir(&dir)) return NULL;
\r
744 fire_ball(GF_DARK, dir, dam, rad);
\r
750 if (name) return _("死の光線", "Death Ray");
\r
751 if (desc) return _("死の光線を放つ。", "Fires a beam of death.");
\r
756 if (!get_aim_dir(&dir)) return NULL;
\r
758 death_ray(dir, plev);
\r
764 if (name) return _("死者召喚", "Raise the Dead");
\r
765 if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");
\r
771 bool pet = one_in_(3);
\r
774 type = (plev > 47 ? SUMMON_HI_UNDEAD : SUMMON_UNDEAD);
\r
776 if (!pet || (pet && (plev > 24) && one_in_(3)))
\r
777 flg |= PM_ALLOW_GROUP;
\r
779 if (pet) flg |= PM_FORCE_PET;
\r
780 else flg |= (PM_ALLOW_UNIQUE | PM_NO_PET);
\r
782 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, type, flg))
\r
784 msg_print(_("冷たい風があなたの周りに吹き始めた。それは腐敗臭を運んでいる...",
\r
785 "Cold winds begin to blow around you, carrying with them the stench of decay..."));
\r
790 msg_print(_("古えの死せる者共があなたに仕えるため土から甦った!",
\r
791 "Ancient, long-dead forms arise from the ground to serve you!"));
\r
795 msg_print(_("死者が甦った。眠りを妨げるあなたを罰するために!",
\r
796 "'The dead arise... to punish you for disturbing them!'"));
\r
799 chg_virtue(V_UNLIFE, 1);
\r
806 if (name) return _("死者の秘伝", "Esoteria");
\r
807 if (desc) return _("アイテムを1つ識別する。レベルが高いとアイテムの能力を完全に知ることができる。",
\r
808 "Identifies an item. Or *identifies* an item at higher level.");
\r
813 if (randint1(50) > plev)
\r
815 if (!ident_spell(FALSE)) return NULL;
\r
819 if (!identify_fully(FALSE)) return NULL;
\r
826 if (name) return _("吸血鬼変化", "Polymorph Vampire");
\r
827 if (desc) return _("一定時間、吸血鬼に変化する。変化している間は本来の種族の能力を失い、代わりに吸血鬼としての能力を得る。",
\r
828 "Mimic a vampire for a while. Loses abilities of original race and gets abilities as a vampire.");
\r
831 int base = 10 + plev / 2;
\r
833 if (info) return info_duration(base, base);
\r
837 set_mimic(base + randint1(base), MIMIC_VAMPIRE, FALSE);
\r
843 if (name) return _("経験値復活", "Restore Life");
\r
844 if (desc) return _("失った経験値を回復する。", "Restore lost experience.");
\r
855 if (name) return _("周辺抹殺", "Mass Genocide");
\r
856 if (desc) return _("自分の周囲にいるモンスターを現在の階から消し去る。抵抗されると無効。",
\r
857 "Eliminates all nearby monsters, exhausting you. Powerful or unique monsters may be able to resist.");
\r
860 int power = plev + 50;
\r
862 if (info) return info_power(power);
\r
866 mass_genocide(power, TRUE);
\r
872 if (name) return _("地獄の劫火", "Hellfire");
\r
873 if (desc) return _("邪悪な力を持つ宝珠を放つ。善良なモンスターには大きなダメージを与える。",
\r
874 "Fires a powerful ball of evil power. Hurts good monsters greatly.");
\r
877 HIT_POINT dam = 666;
\r
880 if (info) return info_damage(0, 0, dam);
\r
884 if (!get_aim_dir(&dir)) return NULL;
\r
886 fire_ball(GF_HELL_FIRE, dir, dam, rad);
\r
887 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("地獄の劫火の呪文を唱えた疲労", "the strain of casting Hellfire"), -1);
\r
893 if (name) return _("幽体化", "Wraithform");
\r
894 if (desc) return _("一定時間、壁を通り抜けることができ受けるダメージが軽減される幽体の状態に変身する。",
\r
895 "Becomes wraith form which gives ability to pass walls and makes all damages half.");
\r
898 int base = plev / 2;
\r
900 if (info) return info_duration(base, base);
\r
904 set_wraith_form(randint1(base) + base, FALSE);
\r
915 * @brief トランプ領域魔法の各処理を行う
\r
916 * @param spell 魔法ID
\r
917 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
918 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
920 static cptr do_trump_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
922 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
923 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
924 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
925 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
926 bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
\r
927 static const char s_random[] = _("ランダム", "random");
\r
930 int plev = p_ptr->lev;
\r
935 if (name) return _("ショート・テレポート", "Phase Door");
\r
936 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");
\r
939 POSITION range = 10;
\r
941 if (info) return info_range(range);
\r
945 teleport_player(range, 0L);
\r
951 if (name) return _("蜘蛛のカード", "Trump Spiders");
\r
952 if (desc) return _("蜘蛛を召喚する。", "Summons spiders.");
\r
957 msg_print(_("あなたは蜘蛛のカードに集中する...", "You concentrate on the trump of an spider..."));
\r
958 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_SPIDER, PM_ALLOW_GROUP))
\r
962 msg_print(_("召喚された蜘蛛は怒っている!", "The summoned spiders get angry!"));
\r
970 if (name) return _("シャッフル", "Shuffle");
\r
971 if (desc) return _("カードの占いをする。", "Causes random effects.");
\r
974 if (info) return s_random;
\r
984 if (name) return _("フロア・リセット", "Reset Recall");
\r
985 if (desc) return _("最深階を変更する。", "Resets the 'deepest' level for recall spell.");
\r
990 if (!reset_recall()) return NULL;
\r
996 if (name) return _("テレポート", "Teleport");
\r
997 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
\r
1000 POSITION range = plev * 4;
\r
1002 if (info) return info_range(range);
\r
1006 teleport_player(range, 0L);
\r
1012 if (name) return _("感知のカード", "Trump Spying");
\r
1013 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
\r
1019 if (info) return info_duration(base, sides);
\r
1023 set_tim_esp(randint1(sides) + base, FALSE);
\r
1029 if (name) return _("テレポート・モンスター", "Teleport Away");
\r
1030 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
\r
1035 if (info) return info_power(power);
\r
1039 if (!get_aim_dir(&dir)) return NULL;
\r
1041 fire_beam(GF_AWAY_ALL, dir, power);
\r
1047 if (name) return _("動物のカード", "Trump Animals");
\r
1048 if (desc) return _("1体の動物を召喚する。", "Summons an animal.");
\r
1053 int type = (!fail ? SUMMON_ANIMAL_RANGER : SUMMON_ANIMAL);
\r
1054 msg_print(_("あなたは動物のカードに集中する...", "You concentrate on the trump of an animal..."));
\r
1055 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, type, 0L))
\r
1059 msg_print(_("召喚された動物は怒っている!", "The summoned animal gets angry!"));
\r
1067 if (name) return _("移動のカード", "Trump Reach");
\r
1068 if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");
\r
1071 int weight = plev * 15;
\r
1073 if (info) return info_weight(weight);
\r
1077 if (!get_aim_dir(&dir)) return NULL;
\r
1079 fetch(dir, weight, FALSE);
\r
1085 if (name) return _("カミカゼのカード", "Trump Kamikaze");
\r
1086 if (desc) return _("複数の爆発するモンスターを召喚する。", "Summons monsters which explode by itself.");
\r
1096 if (!target_set(TARGET_KILL)) return NULL;
\r
1102 /* Summons near player when failed */
\r
1107 if (p_ptr->pclass == CLASS_BEASTMASTER)
\r
1108 type = SUMMON_KAMIKAZE_LIVING;
\r
1110 type = SUMMON_KAMIKAZE;
\r
1112 msg_print(_("あなたはカミカゼのカードに集中する...", "You concentrate on several trumps at once..."));
\r
1113 if (trump_summoning(2 + randint0(plev / 7), !fail, y, x, 0, type, 0L))
\r
1117 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
\r
1125 if (name) return _("幻霊召喚", "Phantasmal Servant");
\r
1126 if (desc) return _("1体の幽霊を召喚する。", "Summons a ghost.");
\r
1129 /* Phantasmal Servant is not summoned as enemy when failed */
\r
1132 int summon_lev = plev * 2 / 3 + randint1(plev / 2);
\r
1134 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, (summon_lev * 3 / 2), SUMMON_PHANTOM, 0L))
\r
1136 msg_print(_("御用でございますか、御主人様?", "'Your wish, master?'"));
\r
1143 if (name) return _("スピード・モンスター", "Haste Monster");
\r
1144 if (desc) return _("モンスター1体を加速させる。", "Hastes a monster.");
\r
1151 /* Temporary enable target_pet option */
\r
1152 bool old_target_pet = target_pet;
\r
1153 target_pet = TRUE;
\r
1155 result = get_aim_dir(&dir);
\r
1157 /* Restore target_pet option */
\r
1158 target_pet = old_target_pet;
\r
1160 if (!result) return NULL;
\r
1162 speed_monster(dir, plev);
\r
1168 if (name) return _("テレポート・レベル", "Teleport Level");
\r
1169 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");
\r
1174 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
\r
1175 teleport_level(0);
\r
1181 if (name) return _("次元の扉", "Dimension Door");
\r
1182 if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleport to given location.");
\r
1185 POSITION range = plev / 2 + 10;
\r
1187 if (info) return info_range(range);
\r
1191 msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));
\r
1192 if (!dimension_door()) return NULL;
\r
1198 if (name) return _("帰還の呪文", "Word of Recall");
\r
1199 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
\r
1200 "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
\r
1206 if (info) return info_delay(base, sides);
\r
1210 if (!word_of_recall()) return NULL;
\r
1216 if (name) return _("怪物追放", "Banish");
\r
1217 if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");
\r
1220 int power = plev * 4;
\r
1222 if (info) return info_power(power);
\r
1226 banish_monsters(power);
\r
1232 if (name) return _("位置交換のカード", "Swap Position");
\r
1233 if (desc) return _("1体のモンスターと位置を交換する。", "Swap positions of you and a monster.");
\r
1240 /* HACK -- No range limit */
\r
1241 project_length = -1;
\r
1243 result = get_aim_dir(&dir);
\r
1245 /* Restore range to default */
\r
1246 project_length = 0;
\r
1248 if (!result) return NULL;
\r
1250 teleport_swap(dir);
\r
1256 if (name) return _("アンデッドのカード", "Trump Undead");
\r
1257 if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");
\r
1262 msg_print(_("あなたはアンデッドのカードに集中する...", "You concentrate on the trump of an undead creature..."));
\r
1263 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_UNDEAD, 0L))
\r
1267 msg_print(_("召喚されたアンデッドは怒っている!", "The summoned undead creature gets angry!"));
\r
1275 if (name) return _("爬虫類のカード", "Trump Reptiles");
\r
1276 if (desc) return _("1体のヒドラを召喚する。", "Summons a hydra.");
\r
1281 msg_print(_("あなたは爬虫類のカードに集中する...", "You concentrate on the trump of a reptile..."));
\r
1282 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HYDRA, 0L))
\r
1286 msg_print(_("召喚された爬虫類は怒っている!", "The summoned reptile gets angry!"));
\r
1294 if (name) return _("モンスターのカード", "Trump Monsters");
\r
1295 if (desc) return _("複数のモンスターを召喚する。", "Summons some monsters.");
\r
1301 msg_print(_("あなたはモンスターのカードに集中する...", "You concentrate on several trumps at once..."));
\r
1302 if (p_ptr->pclass == CLASS_BEASTMASTER)
\r
1303 type = SUMMON_LIVING;
\r
1307 if (trump_summoning((1 + (plev - 15)/ 10), !fail, p_ptr->y, p_ptr->x, 0, type, 0L))
\r
1311 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
\r
1320 if (name) return _("ハウンドのカード", "Trump Hounds");
\r
1321 if (desc) return _("1グループのハウンドを召喚する。", "Summons a group of hounds.");
\r
1326 msg_print(_("あなたはハウンドのカードに集中する...", "You concentrate on the trump of a hound..."));
\r
1327 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HOUND, PM_ALLOW_GROUP))
\r
1331 msg_print(_("召喚されたハウンドは怒っている!", "The summoned hounds get angry!"));
\r
1339 if (name) return _("トランプの刃", "Trump Branding");
\r
1340 if (desc) return _("武器にトランプの属性をつける。", "Makes current weapon a Trump weapon.");
\r
1351 if (name) return _("人間トランプ", "Living Trump");
\r
1352 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",
\r
1353 "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");
\r
1361 /* Teleport control */
\r
1364 /* Random teleportation (uncontrolled) */
\r
1367 /* Gain the mutation */
\r
1368 if (gain_random_mutation(mutation))
\r
1370 msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));
\r
1377 if (name) return _("サイバーデーモンのカード", "Trump Cyberdemon");
\r
1378 if (desc) return _("1体のサイバーデーモンを召喚する。", "Summons a cyber demon.");
\r
1383 msg_print(_("あなたはサイバーデーモンのカードに集中する...", "You concentrate on the trump of a Cyberdemon..."));
\r
1384 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_CYBER, 0L))
\r
1388 msg_print(_("召喚されたサイバーデーモンは怒っている!", "The summoned Cyberdemon gets angry!"));
\r
1396 if (name) return _("予見のカード", "Trump Divination");
\r
1397 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
\r
1398 "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
\r
1401 int rad = DETECT_RAD_DEFAULT;
\r
1403 if (info) return info_radius(rad);
\r
1413 if (name) return _("知識のカード", "Trump Lore");
\r
1414 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
\r
1419 if (!identify_fully(FALSE)) return NULL;
\r
1425 if (name) return _("回復モンスター", "Heal Monster");
\r
1426 if (desc) return _("モンスター1体の体力を回復させる。", "Heal a monster.");
\r
1429 int heal = plev * 10 + 200;
\r
1431 if (info) return info_heal(0, 0, heal);
\r
1437 /* Temporary enable target_pet option */
\r
1438 bool old_target_pet = target_pet;
\r
1439 target_pet = TRUE;
\r
1441 result = get_aim_dir(&dir);
\r
1443 /* Restore target_pet option */
\r
1444 target_pet = old_target_pet;
\r
1446 if (!result) return NULL;
\r
1448 heal_monster(dir, heal);
\r
1454 if (name) return _("ドラゴンのカード", "Trump Dragon");
\r
1455 if (desc) return _("1体のドラゴンを召喚する。", "Summons a dragon.");
\r
1460 msg_print(_("あなたはドラゴンのカードに集中する...", "You concentrate on the trump of a dragon..."));
\r
1461 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_DRAGON, 0L))
\r
1465 msg_print(_("召喚されたドラゴンは怒っている!", "The summoned dragon gets angry!"));
\r
1473 if (name) return _("隕石のカード", "Trump Meteor");
\r
1474 if (desc) return _("自分の周辺に隕石を落とす。", "Makes meteor balls fall down to nearby random locations.");
\r
1477 HIT_POINT dam = plev * 2;
\r
1480 if (info) return info_multi_damage(dam);
\r
1484 cast_meteor(dam, rad);
\r
1490 if (name) return _("デーモンのカード", "Trump Demon");
\r
1491 if (desc) return _("1体の悪魔を召喚する。", "Summons a demon.");
\r
1496 msg_print(_("あなたはデーモンのカードに集中する...", "You concentrate on the trump of a demon..."));
\r
1497 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_DEMON, 0L))
\r
1501 msg_print(_("召喚されたデーモンは怒っている!", "The summoned demon gets angry!"));
\r
1509 if (name) return _("地獄のカード", "Trump Greater Undead");
\r
1510 if (desc) return _("1体の上級アンデッドを召喚する。", "Summons a greater undead.");
\r
1515 msg_print(_("あなたは強力なアンデッドのカードに集中する...", "You concentrate on the trump of a greater undead being..."));
\r
1516 /* May allow unique depend on level and dice roll */
\r
1517 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HI_UNDEAD, PM_ALLOW_UNIQUE))
\r
1521 msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead creature gets angry!"));
\r
1529 if (name) return _("古代ドラゴンのカード", "Trump Ancient Dragon");
\r
1530 if (desc) return _("1体の古代ドラゴンを召喚する。", "Summons an ancient dragon.");
\r
1537 if (p_ptr->pclass == CLASS_BEASTMASTER)
\r
1538 type = SUMMON_HI_DRAGON_LIVING;
\r
1540 type = SUMMON_HI_DRAGON;
\r
1542 msg_print(_("あなたは古代ドラゴンのカードに集中する...", "You concentrate on the trump of an ancient dragon..."));
\r
1543 /* May allow unique depend on level and dice roll */
\r
1544 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, type, PM_ALLOW_UNIQUE))
\r
1548 msg_print(_("召喚された古代ドラゴンは怒っている!", "The summoned ancient dragon gets angry!"));
\r
1561 * @brief 匠領域魔法の各処理を行う
\r
1562 * @param spell 魔法ID
\r
1563 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
1564 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
1566 static cptr do_craft_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
1568 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
1569 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
1570 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
1571 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
1573 int plev = p_ptr->lev;
\r
1578 if (name) return _("赤外線視力", "Infravision");
\r
1579 if (desc) return _("一定時間、赤外線視力が増強される。", "Gives infravision for a while.");
\r
1584 if (info) return info_duration(base, base);
\r
1588 set_tim_infra(base + randint1(base), FALSE);
\r
1594 if (name) return _("回復力強化", "Regeneration");
\r
1595 if (desc) return _("一定時間、回復力が増強される。", "Gives regeneration ability for a while.");
\r
1600 if (info) return info_duration(base, base);
\r
1604 set_tim_regen(base + randint1(base), FALSE);
\r
1610 if (name) return _("空腹充足", "Satisfy Hunger");
\r
1611 if (desc) return _("満腹になる。", "Satisfies hunger.");
\r
1616 set_food(PY_FOOD_MAX - 1);
\r
1622 if (name) return _("耐冷気", "Resist Cold");
\r
1623 if (desc) return _("一定時間、冷気への耐性を得る。装備による耐性に累積する。",
\r
1624 "Gives resistance to cold. This resistance can be added to which from equipment for more powerful resistance.");
\r
1629 if (info) return info_duration(base, base);
\r
1633 set_oppose_cold(randint1(base) + base, FALSE);
\r
1639 if (name) return _("耐火炎", "Resist Fire");
\r
1640 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
\r
1641 "Gives resistance to fire. This resistance can be added to which from equipment for more powerful resistance.");
\r
1646 if (info) return info_duration(base, base);
\r
1650 set_oppose_fire(randint1(base) + base, FALSE);
\r
1656 if (name) return _("士気高揚", "Heroism");
\r
1657 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
1662 if (info) return info_duration(base, base);
\r
1666 set_hero(randint1(base) + base, FALSE);
\r
1674 if (name) return _("耐電撃", "Resist Lightning");
\r
1675 if (desc) return _("一定時間、電撃への耐性を得る。装備による耐性に累積する。",
\r
1676 "Gives resistance to electricity. This resistance can be added to which from equipment for more powerful resistance.");
\r
1681 if (info) return info_duration(base, base);
\r
1685 set_oppose_elec(randint1(base) + base, FALSE);
\r
1691 if (name) return _("耐酸", "Resist Acid");
\r
1692 if (desc) return _("一定時間、酸への耐性を得る。装備による耐性に累積する。",
\r
1693 "Gives resistance to acid. This resistance can be added to which from equipment for more powerful resistance.");
\r
1698 if (info) return info_duration(base, base);
\r
1702 set_oppose_acid(randint1(base) + base, FALSE);
\r
1708 if (name) return _("透明視認", "See Invisibility");
\r
1709 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
\r
1714 if (info) return info_duration(base, base);
\r
1718 set_tim_invis(randint1(base) + base, FALSE);
\r
1724 if (name) return _("解呪", "Remove Curse");
\r
1725 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
\r
1730 if (remove_curse())
\r
1732 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
1739 if (name) return _("耐毒", "Resist Poison");
\r
1740 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",
\r
1741 "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");
\r
1746 if (info) return info_duration(base, base);
\r
1750 set_oppose_pois(randint1(base) + base, FALSE);
\r
1756 if (name) return _("狂戦士化", "Berserk");
\r
1757 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");
\r
1762 if (info) return info_duration(base, base);
\r
1766 set_shero(randint1(base) + base, FALSE);
\r
1774 if (name) return _("自己分析", "Self Knowledge");
\r
1775 if (desc) return _("現在の自分の状態を完全に知る。",
\r
1776 "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");
\r
1787 if (name) return _("対邪悪結界", "Protection from Evil");
\r
1788 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");
\r
1791 int base = 3 * plev;
\r
1794 if (info) return info_duration(base, sides);
\r
1798 set_protevil(randint1(sides) + base, FALSE);
\r
1804 if (name) return _("癒し", "Cure");
\r
1805 if (desc) return _("毒、朦朧状態、負傷を全快させ、幻覚を直す。", "Heals poison, stun, cut and hallucination completely.");
\r
1819 if (name) return _("魔法剣", "Mana Branding");
\r
1820 if (desc) return _("一定時間、武器に冷気、炎、電撃、酸、毒のいずれかの属性をつける。武器を持たないと使えない。",
\r
1821 "Makes current weapon some elemental branded. You must wield weapons.");
\r
1824 int base = plev / 2;
\r
1826 if (info) return info_duration(base, base);
\r
1830 if (!choose_ele_attack()) return NULL;
\r
1836 if (name) return _("テレパシー", "Telepathy");
\r
1837 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
\r
1843 if (info) return info_duration(base, sides);
\r
1847 set_tim_esp(randint1(sides) + base, FALSE);
\r
1853 if (name) return _("肌石化", "Stone Skin");
\r
1854 if (desc) return _("一定時間、ACを上昇させる。", "Gives bonus to AC for a while.");
\r
1860 if (info) return info_duration(base, sides);
\r
1864 set_shield(randint1(sides) + base, FALSE);
\r
1870 if (name) return _("全耐性", "Resistance");
\r
1871 if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
\r
1872 "Gives resistance to fire, cold, electricity, acid and poison for a while. These resistances can be added to which from equipment for more powerful resistances.");
\r
1877 if (info) return info_duration(base, base);
\r
1881 set_oppose_acid(randint1(base) + base, FALSE);
\r
1882 set_oppose_elec(randint1(base) + base, FALSE);
\r
1883 set_oppose_fire(randint1(base) + base, FALSE);
\r
1884 set_oppose_cold(randint1(base) + base, FALSE);
\r
1885 set_oppose_pois(randint1(base) + base, FALSE);
\r
1891 if (name) return _("スピード", "Haste Self");
\r
1892 if (desc) return _("一定時間、加速する。", "Hastes you for a while.");
\r
1896 int sides = 20 + plev;
\r
1898 if (info) return info_duration(base, sides);
\r
1902 set_fast(randint1(sides) + base, FALSE);
\r
1908 if (name) return _("壁抜け", "Walk through Wall");
\r
1909 if (desc) return _("一定時間、半物質化し壁を通り抜けられるようになる。", "Gives ability to pass walls for a while.");
\r
1912 int base = plev / 2;
\r
1914 if (info) return info_duration(base, base);
\r
1918 set_kabenuke(randint1(base) + base, FALSE);
\r
1924 if (name) return _("盾磨き", "Polish Shield");
\r
1925 if (desc) return _("盾に反射の属性をつける。", "Makes a shield a shield of reflection.");
\r
1936 if (name) return _("ゴーレム製造", "Create Golem");
\r
1937 if (desc) return _("1体のゴーレムを製造する。", "Creates a golem.");
\r
1942 if (summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_GOLEM, PM_FORCE_PET))
\r
1944 msg_print(_("ゴーレムを作った。", "You make a golem."));
\r
1948 msg_print(_("うまくゴーレムを作れなかった。", "No Golems arrive."));
\r
1955 if (name) return _("魔法の鎧", "Magical armor");
\r
1956 if (desc) return _("一定時間、魔法防御力とACが上がり、混乱と盲目の耐性、反射能力、麻痺知らず、浮遊を得る。",
\r
1957 "Gives resistance to magic, bonus to AC, resistance to confusion, blindness, reflection, free action and levitation for a while.");
\r
1962 if (info) return info_duration(base, base);
\r
1966 set_magicdef(randint1(base) + base, FALSE);
\r
1972 if (name) return _("装備無力化", "Remove Enchantment");
\r
1973 if (desc) return _("武器・防具にかけられたあらゆる魔力を完全に解除する。", "Removes all magics completely from any weapon or armor.");
\r
1978 if (!mundane_spell(TRUE)) return NULL;
\r
1984 if (name) return _("呪い粉砕", "Remove All Curse");
\r
1985 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
\r
1990 if (remove_all_curse())
\r
1992 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
1999 if (name) return _("完全なる知識", "Knowledge True");
\r
2000 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
\r
2005 if (!identify_fully(FALSE)) return NULL;
\r
2011 if (name) return _("武器強化", "Enchant Weapon");
\r
2012 if (desc) return _("武器の命中率修正とダメージ修正を強化する。", "Attempts to increase +to-hit, +to-dam of a weapon.");
\r
2017 if (!enchant_spell(randint0(4) + 1, randint0(4) + 1, 0)) return NULL;
\r
2023 if (name) return _("防具強化", "Enchant Armor");
\r
2024 if (desc) return _("鎧の防御修正を強化する。", "Attempts to increase +AC of an armor.");
\r
2029 if (!enchant_spell(0, 0, randint0(3) + 2)) return NULL;
\r
2035 if (name) return _("武器属性付与", "Brand Weapon");
\r
2036 if (desc) return _("武器にランダムに属性をつける。", "Makes current weapon a random ego weapon.");
\r
2041 brand_weapon(randint0(18));
\r
2047 if (name) return _("人間トランプ", "Living Trump");
\r
2048 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",
\r
2049 "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");
\r
2057 /* Teleport control */
\r
2060 /* Random teleportation (uncontrolled) */
\r
2063 /* Gain the mutation */
\r
2064 if (gain_random_mutation(mutation))
\r
2066 msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));
\r
2073 if (name) return _("属性への免疫", "Immunity");
\r
2074 if (desc) return _("一定時間、冷気、炎、電撃、酸のいずれかに対する免疫を得る。",
\r
2075 "Gives an immunity to fire, cold, electricity or acid for a while.");
\r
2080 if (info) return info_duration(base, base);
\r
2084 if (!choose_ele_immune(base + randint1(base))) return NULL;
\r
2094 * @brief 悪魔領域魔法の各処理を行う
\r
2095 * @param spell 魔法ID
\r
2096 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
2097 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
2099 static cptr do_daemon_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
2101 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
2102 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
2103 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
2104 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
2105 static const char s_dam[] = _("損傷:", "dam ");
\r
2108 int plev = p_ptr->lev;
\r
2113 if (name) return _("マジック・ミサイル", "Magic Missile");
\r
2114 if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");
\r
2117 int dice = 3 + (plev - 1) / 5;
\r
2120 if (info) return info_damage(dice, sides, 0);
\r
2124 if (!get_aim_dir(&dir)) return NULL;
\r
2126 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));
\r
2132 if (name) return _("無生命感知", "Detect Unlife");
\r
2133 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
\r
2136 int rad = DETECT_RAD_DEFAULT;
\r
2138 if (info) return info_radius(rad);
\r
2142 detect_monsters_nonliving(rad);
\r
2148 if (name) return _("邪なる祝福", "Evil Bless");
\r
2149 if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
\r
2154 if (info) return info_duration(base, base);
\r
2158 set_blessed(randint1(base) + base, FALSE);
\r
2164 if (name) return _("耐火炎", "Resist Fire");
\r
2165 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
\r
2166 "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");
\r
2171 if (info) return info_duration(base, base);
\r
2175 set_oppose_fire(randint1(base) + base, FALSE);
\r
2181 if (name) return _("恐慌", "Horrify");
\r
2182 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
\r
2187 if (info) return info_power(power);
\r
2191 if (!get_aim_dir(&dir)) return NULL;
\r
2193 fear_monster(dir, power);
\r
2194 stun_monster(dir, power);
\r
2200 if (name) return _("地獄の矢", "Nether Bolt");
\r
2201 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
\r
2204 int dice = 6 + (plev - 5) / 4;
\r
2207 if (info) return info_damage(dice, sides, 0);
\r
2211 if (!get_aim_dir(&dir)) return NULL;
\r
2213 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
\r
2219 if (name) return _("古代の死霊召喚", "Summon Manes");
\r
2220 if (desc) return _("古代の死霊を召喚する。", "Summons a manes.");
\r
2225 if (!summon_specific(-1, p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET)))
\r
2227 msg_print(_("古代の死霊は現れなかった。", "No Manes arrive."));
\r
2234 if (name) return _("地獄の焔", "Hellish Flame");
\r
2235 if (desc) return _("邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",
\r
2236 "Fires a ball of evil power. Hurts good monsters greatly.");
\r
2241 int rad = (plev < 30) ? 2 : 3;
\r
2244 if (p_ptr->pclass == CLASS_MAGE ||
\r
2245 p_ptr->pclass == CLASS_HIGH_MAGE ||
\r
2246 p_ptr->pclass == CLASS_SORCERER)
\r
2247 base = plev + plev / 2;
\r
2249 base = plev + plev / 4;
\r
2252 if (info) return info_damage(dice, sides, base);
\r
2256 if (!get_aim_dir(&dir)) return NULL;
\r
2258 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides) + base, rad);
\r
2264 if (name) return _("デーモン支配", "Dominate Demon");
\r
2265 if (desc) return _("悪魔1体を魅了する。抵抗されると無効", "Attempts to charm a demon.");
\r
2270 if (info) return info_power(power);
\r
2274 if (!get_aim_dir(&dir)) return NULL;
\r
2276 control_one_demon(dir, power);
\r
2282 if (name) return _("ビジョン", "Vision");
\r
2283 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
\r
2286 int rad = DETECT_RAD_MAP;
\r
2288 if (info) return info_radius(rad);
\r
2298 if (name) return _("耐地獄", "Resist Nether");
\r
2299 if (desc) return _("一定時間、地獄への耐性を得る。", "Gives resistance to nether for a while.");
\r
2304 if (info) return info_duration(base, base);
\r
2308 set_tim_res_nether(randint1(base) + base, FALSE);
\r
2314 if (name) return _("プラズマ・ボルト", "Plasma bolt");
\r
2315 if (desc) return _("プラズマのボルトもしくはビームを放つ。", "Fires a bolt or beam of plasma.");
\r
2318 int dice = 11 + (plev - 5) / 4;
\r
2321 if (info) return info_damage(dice, sides, 0);
\r
2325 if (!get_aim_dir(&dir)) return NULL;
\r
2327 fire_bolt_or_beam(beam_chance(), GF_PLASMA, dir, damroll(dice, sides));
\r
2333 if (name) return _("ファイア・ボール", "Fire Ball");
\r
2334 if (desc) return _("炎の球を放つ。", "Fires a ball of fire.");
\r
2337 HIT_POINT dam = plev + 55;
\r
2340 if (info) return info_damage(0, 0, dam);
\r
2344 if (!get_aim_dir(&dir)) return NULL;
\r
2346 fire_ball(GF_FIRE, dir, dam, rad);
\r
2352 if (name) return _("炎の刃", "Fire Branding");
\r
2353 if (desc) return _("武器に炎の属性をつける。", "Makes current weapon fire branded.");
\r
2364 if (name) return _("地獄球", "Nether Ball");
\r
2365 if (desc) return _("大きな地獄の球を放つ。", "Fires a huge ball of nether.");
\r
2368 HIT_POINT dam = plev * 3 / 2 + 100;
\r
2369 int rad = plev / 20 + 2;
\r
2371 if (info) return info_damage(0, 0, dam);
\r
2375 if (!get_aim_dir(&dir)) return NULL;
\r
2377 fire_ball(GF_NETHER, dir, dam, rad);
\r
2383 if (name) return _("デーモン召喚", "Summon Demon");
\r
2384 if (desc) return _("悪魔1体を召喚する。", "Summons a demon.");
\r
2389 bool pet = !one_in_(3);
\r
2392 if (pet) flg |= PM_FORCE_PET;
\r
2393 else flg |= PM_NO_PET;
\r
2394 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
\r
2396 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, plev*2/3+randint1(plev/2), SUMMON_DEMON, flg))
\r
2398 msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));
\r
2402 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
\r
2406 msg_print(_("「卑しき者よ、我は汝の下僕にあらず! お前の魂を頂くぞ!」",
\r
2407 "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));
\r
2412 msg_print(_("悪魔は現れなかった。", "No demons arrive."));
\r
2420 if (name) return _("悪魔の目", "Devilish Eye");
\r
2421 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
\r
2427 if (info) return info_duration(base, sides);
\r
2431 set_tim_esp(randint1(sides) + base, FALSE);
\r
2437 if (name) return _("悪魔のクローク", "Devil Cloak");
\r
2438 if (desc) return _("恐怖を取り除き、一定時間、炎と冷気の耐性、炎のオーラを得る。耐性は装備による耐性に累積する。",
\r
2439 "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
2442 TIME_EFFECT base = 20;
\r
2444 if (info) return info_duration(base, base);
\r
2448 TIME_EFFECT dur = randint1(base) + base;
\r
2450 set_oppose_fire(dur, FALSE);
\r
2451 set_oppose_cold(dur, FALSE);
\r
2452 set_tim_sh_fire(dur, FALSE);
\r
2460 if (name) return _("溶岩流", "The Flow of Lava");
\r
2461 if (desc) return _("自分を中心とした炎の球を作り出し、床を溶岩に変える。",
\r
2462 "Generates a ball of fire centered on you which transforms floors to magma.");
\r
2465 HIT_POINT dam = (55 + plev) * 2;
\r
2468 if (info) return info_damage(0, 0, dam/2);
\r
2472 fire_ball(GF_FIRE, 0, dam, rad);
\r
2473 fire_ball_hide(GF_LAVA_FLOW, 0, 2 + randint1(2), rad);
\r
2479 if (name) return _("プラズマ球", "Plasma Ball");
\r
2480 if (desc) return _("プラズマの球を放つ。", "Fires a ball of plasma.");
\r
2483 HIT_POINT dam = plev * 3 / 2 + 80;
\r
2484 int rad = 2 + plev / 40;
\r
2486 if (info) return info_damage(0, 0, dam);
\r
2490 if (!get_aim_dir(&dir)) return NULL;
\r
2492 fire_ball(GF_PLASMA, dir, dam, rad);
\r
2498 if (name) return _("悪魔変化", "Polymorph Demon");
\r
2499 if (desc) return _("一定時間、悪魔に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔としての能力を得る。",
\r
2500 "Mimic a demon for a while. Loses abilities of original race and gets abilities as a demon.");
\r
2503 int base = 10 + plev / 2;
\r
2505 if (info) return info_duration(base, base);
\r
2509 set_mimic(base + randint1(base), MIMIC_DEMON, FALSE);
\r
2515 if (name) return _("地獄の波動", "Nather Wave");
\r
2516 if (desc) return _("視界内の全てのモンスターにダメージを与える。善良なモンスターに特に大きなダメージを与える。",
\r
2517 "Damages all monsters in sight. Hurts good monsters greatly.");
\r
2520 int sides1 = plev * 2;
\r
2521 int sides2 = plev * 2;
\r
2523 if (info) return format("%sd%d+d%d", s_dam, sides1, sides2);
\r
2527 dispel_monsters(randint1(sides1));
\r
2528 dispel_good(randint1(sides2));
\r
2534 if (name) return _("サキュバスの接吻", "Kiss of Succubus");
\r
2535 if (desc) return _("因果混乱の球を放つ。", "Fires a ball of nexus.");
\r
2538 HIT_POINT dam = 100 + plev * 2;
\r
2541 if (info) return info_damage(0, 0, dam);
\r
2545 if (!get_aim_dir(&dir)) return NULL;
\r
2546 fire_ball(GF_NEXUS, dir, dam, rad);
\r
2552 if (name) return _("破滅の手", "Doom Hand");
\r
2553 if (desc) return _("破滅の手を放つ。食らったモンスターはそのときのHPの半分前後のダメージを受ける。", "Attempts to make a monster's HP almost half.");
\r
2558 if (!get_aim_dir(&dir))
\r
2561 msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));
\r
2563 fire_ball_hide(GF_HAND_DOOM, dir, plev * 2, 0);
\r
2569 if (name) return _("士気高揚", "Raise the Morale");
\r
2570 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
2575 if (info) return info_duration(base, base);
\r
2579 set_hero(randint1(base) + base, FALSE);
\r
2587 if (name) return _("不滅の肉体", "Immortal Body");
\r
2588 if (desc) return _("一定時間、時間逆転への耐性を得る。", "Gives resistance to time for a while.");
\r
2593 if (info) return info_duration(base, base);
\r
2597 set_tim_res_time(randint1(base)+base, FALSE);
\r
2603 if (name) return _("狂気の円環", "Insanity Circle");
\r
2604 if (desc) return _("自分を中心としたカオスの球、混乱の球を発生させ、近くのモンスターを魅了する。",
\r
2605 "Generate balls of chaos, confusion and charm centered on you.");
\r
2608 HIT_POINT dam = 50 + plev;
\r
2609 int power = 20 + plev;
\r
2610 int rad = 3 + plev / 20;
\r
2612 if (info) return format("%s%d+%d", s_dam, dam/2, dam/2);
\r
2616 fire_ball(GF_CHAOS, 0, dam, rad);
\r
2617 fire_ball(GF_CONFUSION, 0, dam, rad);
\r
2618 fire_ball(GF_CHARM, 0, power, rad);
\r
2624 if (name) return _("ペット爆破", "Explode Pets");
\r
2625 if (desc) return _("全てのペットを強制的に爆破させる。", "Makes all pets explode.");
\r
2630 discharge_minion();
\r
2636 if (name) return _("グレーターデーモン召喚", "Summon Greater Demon");
\r
2637 if (desc) return _("上級デーモンを召喚する。召喚するには人間('p','h','t'で表されるモンスター)の死体を捧げなければならない。",
\r
2638 "Summons greater demon. It need to sacrifice a corpse of human ('p','h' or 't').");
\r
2643 if (!cast_summon_greater_demon()) return NULL;
\r
2649 if (name) return _("地獄嵐", "Nether Storm");
\r
2650 if (desc) return _("超巨大な地獄の球を放つ。", "Generate a huge ball of nether.");
\r
2653 HIT_POINT dam = plev * 15;
\r
2654 int rad = plev / 5;
\r
2656 if (info) return info_damage(0, 0, dam);
\r
2660 if (!get_aim_dir(&dir)) return NULL;
\r
2662 fire_ball(GF_NETHER, dir, dam, rad);
\r
2668 if (name) return _("血の呪い", "Bloody Curse");
\r
2669 if (desc) return _("自分がダメージを受けることによって対象に呪いをかけ、ダメージを与え様々な効果を引き起こす。",
\r
2670 "Puts blood curse which damages and causes various effects on a monster. You also take damage.");
\r
2673 HIT_POINT dam = 600;
\r
2676 if (info) return info_damage(0, 0, dam);
\r
2680 if (!get_aim_dir(&dir)) return NULL;
\r
2682 fire_ball_hide(GF_BLOOD_CURSE, dir, dam, rad);
\r
2683 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("血の呪い", "Blood curse"), -1);
\r
2689 if (name) return _("魔王変化", "Polymorph Demonlord");
\r
2690 if (desc) return _("悪魔の王に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔の王としての能力を得、壁を破壊しながら歩く。",
\r
2691 "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
2696 if (info) return info_duration(base, base);
\r
2700 set_mimic(base + randint1(base), MIMIC_DEMON_LORD, FALSE);
\r
2710 * @brief 破邪領域魔法の各処理を行う
\r
2711 * @param spell 魔法ID
\r
2712 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
2713 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
2715 static cptr do_crusade_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
2717 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
2718 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
2719 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
2720 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
2723 int plev = p_ptr->lev;
\r
2728 if (name) return _("懲罰", "Punishment");
\r
2729 if (desc) return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");
\r
2732 int dice = 3 + (plev - 1) / 5;
\r
2735 if (info) return info_damage(dice, sides, 0);
\r
2739 if (!get_aim_dir(&dir)) return NULL;
\r
2741 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));
\r
2747 if (name) return _("邪悪存在感知", "Detect Evil");
\r
2748 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
\r
2751 int rad = DETECT_RAD_DEFAULT;
\r
2753 if (info) return info_radius(rad);
\r
2757 detect_monsters_evil(rad);
\r
2763 if (name) return _("恐怖除去", "Remove Fear");
\r
2764 if (desc) return _("恐怖を取り除く。", "Removes fear.");
\r
2775 if (name) return _("威圧", "Scare Monster");
\r
2776 if (desc) return _("モンスター1体を恐怖させる。抵抗されると無効。", "Attempts to scare a monster.");
\r
2781 if (info) return info_power(power);
\r
2785 if (!get_aim_dir(&dir)) return NULL;
\r
2787 fear_monster(dir, power);
\r
2793 if (name) return _("聖域", "Sanctuary");
\r
2794 if (desc) return _("隣接した全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep monsters in the adjacent squares.");
\r
2799 if (info) return info_power(power);
\r
2803 sleep_monsters_touch();
\r
2809 if (name) return _("入口", "Portal");
\r
2810 if (desc) return _("中距離のテレポートをする。", "Teleport medium distance.");
\r
2813 POSITION range = 25 + plev / 2;
\r
2815 if (info) return info_range(range);
\r
2819 teleport_player(range, 0L);
\r
2825 if (name) return _("スターダスト", "Star Dust");
\r
2826 if (desc) return _("ターゲット付近に閃光のボルトを連射する。", "Fires many bolts of light near the target.");
\r
2829 int dice = 3 + (plev - 1) / 9;
\r
2832 if (info) return info_multi_damage_dice(dice, sides);
\r
2836 if (!get_aim_dir(&dir)) return NULL;
\r
2837 fire_blast(GF_LITE, dir, dice, sides, 10, 3);
\r
2843 if (name) return _("身体浄化", "Purify");
\r
2844 if (desc) return _("傷、毒、朦朧から全快する。", "Heals all cut, stun and poison status.");
\r
2857 if (name) return _("邪悪飛ばし", "Scatter Evil");
\r
2858 if (desc) return _("邪悪なモンスター1体をテレポートさせる。抵抗されると無効。", "Attempts to teleport an evil monster away.");
\r
2861 int power = MAX_SIGHT * 5;
\r
2863 if (info) return info_power(power);
\r
2867 if (!get_aim_dir(&dir)) return NULL;
\r
2868 fire_ball(GF_AWAY_EVIL, dir, power, 0);
\r
2874 if (name) return _("聖なる光球", "Holy Orb");
\r
2875 if (desc) return _("聖なる力をもつ宝珠を放つ。邪悪なモンスターに対して大きなダメージを与えるが、善良なモンスターには効果がない。",
\r
2876 "Fires a ball with holy power. Hurts evil monsters greatly, but don't effect good monsters.");
\r
2881 int rad = (plev < 30) ? 2 : 3;
\r
2884 if (p_ptr->pclass == CLASS_PRIEST ||
\r
2885 p_ptr->pclass == CLASS_HIGH_MAGE ||
\r
2886 p_ptr->pclass == CLASS_SORCERER)
\r
2887 base = plev + plev / 2;
\r
2889 base = plev + plev / 4;
\r
2892 if (info) return info_damage(dice, sides, base);
\r
2896 if (!get_aim_dir(&dir)) return NULL;
\r
2898 fire_ball(GF_HOLY_FIRE, dir, damroll(dice, sides) + base, rad);
\r
2904 if (name) return _("悪魔払い", "Exorcism");
\r
2905 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与え、邪悪なモンスターを恐怖させる。",
\r
2906 "Damages all undead and demons in sight, and scares all evil monsters in sight.");
\r
2912 if (info) return info_damage(1, sides, 0);
\r
2916 dispel_undead(randint1(sides));
\r
2917 dispel_demons(randint1(sides));
\r
2924 if (name) return _("解呪", "Remove Curse");
\r
2925 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
\r
2930 if (remove_curse())
\r
2932 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
2939 if (name) return _("透明視認", "Sense Unseen");
\r
2940 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
\r
2945 if (info) return info_duration(base, base);
\r
2949 set_tim_invis(randint1(base) + base, FALSE);
\r
2955 if (name) return _("対邪悪結界", "Protection from Evil");
\r
2956 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");
\r
2960 int sides = 3 * plev;
\r
2962 if (info) return info_duration(base, sides);
\r
2966 set_protevil(randint1(sides) + base, FALSE);
\r
2972 if (name) return _("裁きの雷", "Judgment Thunder");
\r
2973 if (desc) return _("強力な電撃のボルトを放つ。", "Fires a powerful bolt of lightning.");
\r
2976 HIT_POINT dam = plev * 5;
\r
2978 if (info) return info_damage(0, 0, dam);
\r
2982 if (!get_aim_dir(&dir)) return NULL;
\r
2983 fire_bolt(GF_ELEC, dir, dam);
\r
2989 if (name) return _("聖なる御言葉", "Holy Word");
\r
2990 if (desc) return _("視界内の邪悪な存在に大きなダメージを与え、体力を回復し、毒、恐怖、朦朧状態、負傷から全快する。",
\r
2991 "Damages all evil monsters in sight, heals HP somewhat, and completely heals poison, fear, stun and cut status.");
\r
2994 int dam_sides = plev * 6;
\r
2997 if (info) return format(_("損:1d%d/回%d", "dam:d%d/h%d"), dam_sides, heal);
\r
3000 dispel_evil(randint1(dam_sides));
\r
3011 if (name) return _("開かれた道", "Unbarring Ways");
\r
3012 if (desc) return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");
\r
3017 if (!get_aim_dir(&dir)) return NULL;
\r
3019 destroy_door(dir);
\r
3025 if (name) return _("封魔", "Arrest");
\r
3026 if (desc) return _("邪悪なモンスターの動きを止める。", "Attempts to paralyze an evil monster.");
\r
3029 int power = plev * 2;
\r
3031 if (info) return info_power(power);
\r
3035 if (!get_aim_dir(&dir)) return NULL;
\r
3042 if (name) return _("聖なるオーラ", "Holy Aura");
\r
3043 if (desc) return _("一定時間、邪悪なモンスターを傷つける聖なるオーラを得る。",
\r
3044 "Gives aura of holy power which injures evil monsters which attacked you for a while.");
\r
3049 if (info) return info_duration(base, base);
\r
3053 set_tim_sh_holy(randint1(base) + base, FALSE);
\r
3059 if (name) return _("アンデッド&悪魔退散", "Dispel Undead & Demons");
\r
3060 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与える。", "Damages all undead and demons in sight.");
\r
3063 int sides = plev * 4;
\r
3065 if (info) return info_damage(1, sides, 0);
\r
3069 dispel_undead(randint1(sides));
\r
3070 dispel_demons(randint1(sides));
\r
3076 if (name) return _("邪悪退散", "Dispel Evil");
\r
3077 if (desc) return _("視界内の全ての邪悪なモンスターにダメージを与える。", "Damages all evil monsters in sight.");
\r
3080 int sides = plev * 4;
\r
3082 if (info) return info_damage(1, sides, 0);
\r
3086 dispel_evil(randint1(sides));
\r
3092 if (name) return _("聖なる刃", "Holy Blade");
\r
3093 if (desc) return _("通常の武器に滅邪の属性をつける。", "Makes current weapon especially deadly against evil monsters.");
\r
3104 if (name) return _("スターバースト", "Star Burst");
\r
3105 if (desc) return _("巨大な閃光の球を放つ。", "Fires a huge ball of powerful light.");
\r
3108 HIT_POINT dam = 100 + plev * 2;
\r
3111 if (info) return info_damage(0, 0, dam);
\r
3115 if (!get_aim_dir(&dir)) return NULL;
\r
3117 fire_ball(GF_LITE, dir, dam, rad);
\r
3123 if (name) return _("天使召喚", "Summon Angel");
\r
3124 if (desc) return _("天使を1体召喚する。", "Summons an angel.");
\r
3129 bool pet = !one_in_(3);
\r
3132 if (pet) flg |= PM_FORCE_PET;
\r
3133 else flg |= PM_NO_PET;
\r
3134 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
\r
3136 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_ANGEL, flg))
\r
3140 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
\r
3144 msg_print(_("「我は汝の下僕にあらず! 悪行者よ、悔い改めよ!」", "Mortal! Repent of thy impiousness."));
\r
3152 if (name) return _("士気高揚", "Heroism");
\r
3153 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
3158 if (info) return info_duration(base, base);
\r
3162 set_hero(randint1(base) + base, FALSE);
\r
3170 if (name) return _("呪い退散", "Dispel Curse");
\r
3171 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
\r
3176 if (remove_all_curse())
\r
3178 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
3185 if (name) return _("邪悪追放", "Banish Evil");
\r
3186 if (desc) return _("視界内の全ての邪悪なモンスターをテレポートさせる。抵抗されると無効。",
\r
3187 "Teleports all evil monsters in sight away unless resisted.");
\r
3192 if (info) return info_power(power);
\r
3196 if (banish_evil(power))
\r
3198 msg_print(_("神聖な力が邪悪を打ち払った!", "The holy power banishes evil!"));
\r
3205 if (name) return _("ハルマゲドン", "Armageddon");
\r
3206 if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroy everything in nearby area.");
\r
3214 destroy_area(p_ptr->y, p_ptr->x, base + randint1(sides), FALSE);
\r
3220 if (name) return _("目には目を", "An Eye for an Eye");
\r
3221 if (desc) return _("一定時間、自分がダメージを受けたときに攻撃を行ったモンスターに対して同等のダメージを与える。",
\r
3222 "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
3227 if (info) return info_duration(base, base);
\r
3231 set_tim_eyeeye(randint1(base) + base, FALSE);
\r
3237 if (name) return _("神の怒り", "Wrath of the God");
\r
3238 if (desc) return _("ターゲットの周囲に分解の球を多数落とす。", "Drops many balls of disintegration near the target.");
\r
3241 HIT_POINT dam = plev * 3 + 25;
\r
3244 if (info) return info_multi_damage(dam);
\r
3248 if (!cast_wrath_of_the_god(dam, rad)) return NULL;
\r
3254 if (name) return _("神威", "Divine Intervention");
\r
3255 if (desc) return _("隣接するモンスターに聖なるダメージを与え、視界内のモンスターにダメージ、減速、朦朧、混乱、恐怖、眠りを与える。さらに体力を回復する。",
\r
3256 "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
3259 int b_dam = plev * 11;
\r
3260 int d_dam = plev * 4;
\r
3262 int power = plev * 4;
\r
3264 if (info) return format(_("回%d/損%d+%d", "h%d/dm%d+%d"), heal, d_dam, b_dam/2);
\r
3267 project(0, 1, p_ptr->y, p_ptr->x, b_dam, GF_HOLY_FIRE, PROJECT_KILL, -1);
\r
3268 dispel_monsters(d_dam);
\r
3269 slow_monsters(plev);
\r
3270 stun_monsters(power);
\r
3271 confuse_monsters(power);
\r
3272 turn_monsters(power);
\r
3273 stasis_monsters(power);
\r
3280 if (name) return _("聖戦", "Crusade");
\r
3281 if (desc) return _("視界内の善良なモンスターをペットにしようとし、ならなかった場合及び善良でないモンスターを恐怖させる。さらに多数の加速された騎士を召喚し、ヒーロー、祝福、加速、対邪悪結界を得る。",
\r
3282 "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
3288 int sp_sides = 20 + plev;
\r
3289 int sp_base = plev;
\r
3293 for (i = 0; i < 12; i++)
\r
3296 POSITION my = 0, mx = 0;
\r
3300 scatter(&my, &mx, p_ptr->y, p_ptr->x, 4, 0);
\r
3302 /* Require empty grids */
\r
3303 if (cave_empty_bold2(my, mx)) break;
\r
3305 if (attempt < 0) continue;
\r
3306 summon_specific(-1, my, mx, plev, SUMMON_KNIGHTS, (PM_ALLOW_GROUP | PM_FORCE_PET | PM_HASTE));
\r
3308 set_hero(randint1(base) + base, FALSE);
\r
3309 set_blessed(randint1(base) + base, FALSE);
\r
3310 set_fast(randint1(sp_sides) + sp_base, FALSE);
\r
3311 set_protevil(randint1(base) + base, FALSE);
\r
3324 * @param spell 歌ID
\r
3325 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP)
\r
3326 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
\r
3328 static cptr do_music_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
3330 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
3331 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
3332 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
3333 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
3334 bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
\r
3335 bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
\r
3336 bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
\r
3337 static const char s_dam[] = _("損傷:", "dam ");
\r
3340 int plev = p_ptr->lev;
\r
3345 if (name) return _("遅鈍の歌", "Song of Holding");
\r
3346 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
\r
3348 /* Stop singing before start another */
\r
3349 if (cast || fail) stop_singing();
\r
3353 msg_print(_("ゆっくりとしたメロディを口ずさみ始めた...", "You start humming a slow, steady melody..."));
\r
3354 start_singing(spell, MUSIC_SLOW);
\r
3360 if (info) return info_power(power);
\r
3364 slow_monsters(plev);
\r
3370 if (name) return _("祝福の歌", "Song of Blessing");
\r
3371 if (desc) return _("命中率とACのボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
\r
3373 /* Stop singing before start another */
\r
3374 if (cast || fail) stop_singing();
\r
3378 msg_print(_("厳かなメロディを奏で始めた...", "The holy power of the Music of the Ainur enters you..."));
\r
3379 start_singing(spell, MUSIC_BLESS);
\r
3384 if (!p_ptr->blessed)
\r
3386 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
\r
3393 if (name) return _("崩壊の音色", "Wrecking Note");
\r
3394 if (desc) return _("轟音のボルトを放つ。", "Fires a bolt of sound.");
\r
3396 /* Stop singing before start another */
\r
3397 if (cast || fail) stop_singing();
\r
3400 int dice = 4 + (plev - 1) / 5;
\r
3403 if (info) return info_damage(dice, sides, 0);
\r
3407 if (!get_aim_dir(&dir)) return NULL;
\r
3409 fire_bolt(GF_SOUND, dir, damroll(dice, sides));
\r
3415 if (name) return _("朦朧の旋律", "Stun Pattern");
\r
3416 if (desc) return _("視界内の全てのモンスターを朦朧させる。抵抗されると無効。", "Attempts to stun all monsters in sight.");
\r
3418 /* Stop singing before start another */
\r
3419 if (cast || fail) stop_singing();
\r
3423 msg_print(_("眩惑させるメロディを奏で始めた...", "You weave a pattern of sounds to bewilder and daze..."));
\r
3424 start_singing(spell, MUSIC_STUN);
\r
3428 int dice = plev / 10;
\r
3431 if (info) return info_power_dice(dice, sides);
\r
3435 stun_monsters(damroll(dice, sides));
\r
3442 if (name) return _("生命の流れ", "Flow of Life");
\r
3443 if (desc) return _("体力を少し回復させる。", "Heals HP a little.");
\r
3445 /* Stop singing before start another */
\r
3446 if (cast || fail) stop_singing();
\r
3450 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing a song of healing..."));
\r
3451 start_singing(spell, MUSIC_L_LIFE);
\r
3458 if (info) return info_heal(dice, sides, 0);
\r
3462 hp_player(damroll(dice, sides));
\r
3469 if (name) return _("太陽の歌", "Song of the Sun");
\r
3470 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
\r
3472 /* Stop singing before start another */
\r
3473 if (cast || fail) stop_singing();
\r
3477 int sides = plev / 2;
\r
3478 int rad = plev / 10 + 1;
\r
3480 if (info) return info_damage(dice, sides, 0);
\r
3484 msg_print(_("光り輝く歌が辺りを照らした。", "Your uplifting song brings brightness to dark places..."));
\r
3485 lite_area(damroll(dice, sides), rad);
\r
3491 if (name) return _("恐怖の歌", "Song of Fear");
\r
3492 if (desc) return _("視界内の全てのモンスターを恐怖させる。抵抗されると無効。", "Attempts to scare all monsters in sight.");
\r
3494 /* Stop singing before start another */
\r
3495 if (cast || fail) stop_singing();
\r
3499 msg_print(_("おどろおどろしいメロディを奏で始めた...", "You start weaving a fearful pattern..."));
\r
3500 start_singing(spell, MUSIC_FEAR);
\r
3506 if (info) return info_power(power);
\r
3510 project_hack(GF_TURN_ALL, power);
\r
3517 if (name) return _("戦いの歌", "Heroic Ballad");
\r
3518 if (desc) return _("ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
3520 /* Stop singing before start another */
\r
3521 if (cast || fail) stop_singing();
\r
3525 msg_print(_("激しい戦いの歌を歌った...", "You start singing a song of intense fighting..."));
\r
3527 (void)hp_player(10);
\r
3528 (void)set_afraid(0);
\r
3530 /* Recalculate hitpoints */
\r
3531 p_ptr->update |= (PU_HP);
\r
3533 start_singing(spell, MUSIC_HERO);
\r
3540 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
\r
3541 /* Recalculate hitpoints */
\r
3542 p_ptr->update |= (PU_HP);
\r
3549 if (name) return _("霊的知覚", "Clairaudience");
\r
3550 if (desc) return _("近くの罠/扉/階段を感知する。レベル15で全てのモンスター、20で財宝とアイテムを感知できるようになる。レベル25で周辺の地形を感知し、40でその階全体を永久に照らし、ダンジョン内のすべてのアイテムを感知する。この効果は歌い続けることで順に起こる。",
\r
3551 "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
3553 /* Stop singing before start another */
\r
3554 if (cast || fail) stop_singing();
\r
3558 msg_print(_("静かな音楽が感覚を研ぎ澄まさせた...", "Your quiet music sharpens your sense of hearing..."));
\r
3559 /* Hack -- Initialize the turn count */
\r
3560 SINGING_COUNT(p_ptr) = 0;
\r
3561 start_singing(spell, MUSIC_DETECT);
\r
3565 int rad = DETECT_RAD_DEFAULT;
\r
3567 if (info) return info_radius(rad);
\r
3571 int count = SINGING_COUNT(p_ptr);
\r
3573 if (count >= 19) wiz_lite(FALSE);
\r
3577 if (plev > 39 && count < 19)
\r
3578 SINGING_COUNT(p_ptr) = count + 1;
\r
3582 /* There are too many hidden treasure. So... */
\r
3583 /* detect_treasure(rad); */
\r
3584 detect_objects_gold(rad);
\r
3585 detect_objects_normal(rad);
\r
3587 if (plev > 24 && count < 11)
\r
3588 SINGING_COUNT(p_ptr) = count + 1;
\r
3592 detect_monsters_invis(rad);
\r
3593 detect_monsters_normal(rad);
\r
3595 if (plev > 19 && count < 6)
\r
3596 SINGING_COUNT(p_ptr) = count + 1;
\r
3598 detect_traps(rad, TRUE);
\r
3599 detect_doors(rad);
\r
3600 detect_stairs(rad);
\r
3602 if (plev > 14 && count < 3)
\r
3603 SINGING_COUNT(p_ptr) = count + 1;
\r
3610 if (name) return _("魂の歌", "Soul Shriek");
\r
3611 if (desc) return _("視界内の全てのモンスターに対して精神攻撃を行う。", "Damages all monsters in sight with PSI damages.");
\r
3613 /* Stop singing before start another */
\r
3614 if (cast || fail) stop_singing();
\r
3618 msg_print(_("精神を捻じ曲げる歌を歌った...", "You start singing a song of soul in pain..."));
\r
3619 start_singing(spell, MUSIC_PSI);
\r
3624 int sides = plev * 3 / 2;
\r
3626 if (info) return info_damage(dice, sides, 0);
\r
3630 project_hack(GF_PSI, damroll(dice, sides));
\r
3637 if (name) return _("知識の歌", "Song of Lore");
\r
3638 if (desc) return _("自分のいるマスと隣りのマスに落ちているアイテムを鑑定する。", "Identifies all items which are in the adjacent squares.");
\r
3640 /* Stop singing before start another */
\r
3641 if (cast || fail) stop_singing();
\r
3645 msg_print(_("この世界の知識が流れ込んできた...", "You recall the rich lore of the world..."));
\r
3646 start_singing(spell, MUSIC_ID);
\r
3652 if (info) return info_radius(rad);
\r
3656 * MP不足で鑑定が発動される前に歌が中断してしまうのを防止。
\r
3660 project(0, rad, p_ptr->y, p_ptr->x, 0, GF_IDENTIFY, PROJECT_ITEM, -1);
\r
3667 if (name) return _("隠遁の歌", "Hiding Tune");
\r
3668 if (desc) return _("隠密行動能力を上昇させる。", "Gives improved stealth.");
\r
3670 /* Stop singing before start another */
\r
3671 if (cast || fail) stop_singing();
\r
3675 msg_print(_("あなたの姿が景色にとけこんでいった...", "Your song carries you beyond the sight of mortal eyes..."));
\r
3676 start_singing(spell, MUSIC_STEALTH);
\r
3681 if (!p_ptr->tim_stealth)
\r
3683 msg_print(_("姿がはっきりと見えるようになった。", "You are no longer hided."));
\r
3690 if (name) return _("幻影の旋律", "Illusion Pattern");
\r
3691 if (desc) return _("視界内の全てのモンスターを混乱させる。抵抗されると無効。", "Attempts to confuse all monsters in sight.");
\r
3693 /* Stop singing before start another */
\r
3694 if (cast || fail) stop_singing();
\r
3698 msg_print(_("辺り一面に幻影が現れた...", "You weave a pattern of sounds to beguile and confuse..."));
\r
3699 start_singing(spell, MUSIC_CONF);
\r
3703 int power = plev * 2;
\r
3705 if (info) return info_power(power);
\r
3709 confuse_monsters(power);
\r
3716 if (name) return _("破滅の叫び", "Doomcall");
\r
3717 if (desc) return _("視界内の全てのモンスターに対して轟音攻撃を行う。", "Damages all monsters in sight with booming sound.");
\r
3719 /* Stop singing before start another */
\r
3720 if (cast || fail) stop_singing();
\r
3724 msg_print(_("轟音が響いた...", "The fury of the Downfall of Numenor lashes out..."));
\r
3725 start_singing(spell, MUSIC_SOUND);
\r
3729 int dice = 10 + plev / 5;
\r
3732 if (info) return info_damage(dice, sides, 0);
\r
3736 project_hack(GF_SOUND, damroll(dice, sides));
\r
3743 if (name) return _("フィリエルの歌", "Firiel's Song");
\r
3744 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
\r
3747 /* Stop singing before start another */
\r
3748 if (cast || fail) stop_singing();
\r
3752 msg_print(_("生命と復活のテーマを奏で始めた...", "The themes of life and revival are woven into your song..."));
\r
3753 animate_dead(0, p_ptr->y, p_ptr->x);
\r
3759 if (name) return _("旅の仲間", "Fellowship Chant");
\r
3760 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
\r
3762 /* Stop singing before start another */
\r
3763 if (cast || fail) stop_singing();
\r
3767 msg_print(_("安らかなメロディを奏で始めた...", "You weave a slow, soothing melody of imploration..."));
\r
3768 start_singing(spell, MUSIC_CHARM);
\r
3772 int dice = 10 + plev / 15;
\r
3775 if (info) return info_power_dice(dice, sides);
\r
3779 charm_monsters(damroll(dice, sides));
\r
3786 if (name) return _("分解音波", "Sound of disintegration");
\r
3787 if (desc) return _("壁を掘り進む。自分の足元のアイテムは蒸発する。", "Makes you be able to burrow into walls. Objects under your feet evaporate.");
\r
3789 /* Stop singing before start another */
\r
3790 if (cast || fail) stop_singing();
\r
3794 msg_print(_("粉砕するメロディを奏で始めた...", "You weave a violent pattern of sounds to break wall."));
\r
3795 start_singing(spell, MUSIC_WALL);
\r
3801 * MP不足で効果が発動される前に歌が中断してしまうのを防止。
\r
3805 project(0, 0, p_ptr->y, p_ptr->x,
\r
3806 0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1);
\r
3812 if (name) return _("元素耐性", "Finrod's Resistance");
\r
3813 if (desc) return _("酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
\r
3814 "Gives resistance to fire, cold, electricity, acid and poison. These resistances can be added to which from equipment for more powerful resistances.");
\r
3816 /* Stop singing before start another */
\r
3817 if (cast || fail) stop_singing();
\r
3821 msg_print(_("元素の力に対する忍耐の歌を歌った。", "You sing a song of perseverance against powers..."));
\r
3822 start_singing(spell, MUSIC_RESIST);
\r
3827 if (!p_ptr->oppose_acid)
\r
3829 msg_print(_("酸への耐性が薄れた気がする。", "You feel less resistant to acid."));
\r
3832 if (!p_ptr->oppose_elec)
\r
3834 msg_print(_("電撃への耐性が薄れた気がする。", "You feel less resistant to elec."));
\r
3837 if (!p_ptr->oppose_fire)
\r
3839 msg_print(_("火への耐性が薄れた気がする。", "You feel less resistant to fire."));
\r
3842 if (!p_ptr->oppose_cold)
\r
3844 msg_print(_("冷気への耐性が薄れた気がする。", "You feel less resistant to cold."));
\r
3847 if (!p_ptr->oppose_pois)
\r
3849 msg_print(_("毒への耐性が薄れた気がする。", "You feel less resistant to pois."));
\r
3856 if (name) return _("ホビットのメロディ", "Hobbit Melodies");
\r
3857 if (desc) return _("加速する。", "Hastes you.");
\r
3859 /* Stop singing before start another */
\r
3860 if (cast || fail) stop_singing();
\r
3864 msg_print(_("軽快な歌を口ずさみ始めた...", "You start singing joyful pop song..."));
\r
3865 start_singing(spell, MUSIC_SPEED);
\r
3872 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
\r
3879 if (name) return _("歪んだ世界", "World Contortion");
\r
3880 if (desc) return _("近くのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all nearby monsters away unless resisted.");
\r
3883 int rad = plev / 15 + 1;
\r
3884 int power = plev * 3 + 1;
\r
3886 if (info) return info_radius(rad);
\r
3888 /* Stop singing before start another */
\r
3889 if (cast || fail) stop_singing();
\r
3893 msg_print(_("歌が空間を歪めた...", "Reality whirls wildly as you sing a dizzying melody..."));
\r
3894 project(0, rad, p_ptr->y, p_ptr->x, power, GF_AWAY_ALL, PROJECT_KILL, -1);
\r
3900 if (name) return _("退散の歌", "Dispelling chant");
\r
3901 if (desc) return _("視界内の全てのモンスターにダメージを与える。邪悪なモンスターに特に大きなダメージを与える。",
\r
3902 "Damages all monsters in sight. Hurts evil monsters greatly.");
\r
3904 /* Stop singing before start another */
\r
3905 if (cast || fail) stop_singing();
\r
3909 msg_print(_("耐えられない不協和音が敵を責め立てた...", "You cry out in an ear-wracking voice..."));
\r
3910 start_singing(spell, MUSIC_DISPEL);
\r
3914 int m_sides = plev * 3;
\r
3915 int e_sides = plev * 3;
\r
3917 if (info) return format("%s1d%d+1d%d", s_dam, m_sides, e_sides);
\r
3921 dispel_monsters(randint1(m_sides));
\r
3922 dispel_evil(randint1(e_sides));
\r
3928 if (name) return _("サルマンの甘言", "The Voice of Saruman");
\r
3929 if (desc) return _("視界内の全てのモンスターを減速させ、眠らせようとする。抵抗されると無効。", "Attempts to slow and sleep all monsters in sight.");
\r
3931 /* Stop singing before start another */
\r
3932 if (cast || fail) stop_singing();
\r
3936 msg_print(_("優しく、魅力的な歌を口ずさみ始めた...", "You start humming a gentle and attractive song..."));
\r
3937 start_singing(spell, MUSIC_SARUMAN);
\r
3943 if (info) return info_power(power);
\r
3947 slow_monsters(plev);
\r
3948 sleep_monsters(plev);
\r
3955 if (name) return _("嵐の音色", "Song of the Tempest");
\r
3956 if (desc) return _("轟音のビームを放つ。", "Fires a beam of sound.");
\r
3959 int dice = 15 + (plev - 1) / 2;
\r
3962 if (info) return info_damage(dice, sides, 0);
\r
3964 /* Stop singing before start another */
\r
3965 if (cast || fail) stop_singing();
\r
3969 if (!get_aim_dir(&dir)) return NULL;
\r
3971 fire_beam(GF_SOUND, dir, damroll(dice, sides));
\r
3977 if (name) return _("もう一つの世界", "Ambarkanta");
\r
3978 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
\r
3984 if (info) return info_delay(base, sides);
\r
3986 /* Stop singing before start another */
\r
3987 if (cast || fail) stop_singing();
\r
3991 msg_print(_("周囲が変化し始めた...", "You sing of the primeval shaping of Middle-earth..."));
\r
3998 if (name) return _("破壊の旋律", "Wrecking Pattern");
\r
3999 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
\r
4000 "Shakes dungeon structure, and results in random swapping of floors and walls.");
\r
4002 /* Stop singing before start another */
\r
4003 if (cast || fail) stop_singing();
\r
4007 msg_print(_("破壊的な歌が響きわたった...", "You weave a pattern of sounds to contort and shatter..."));
\r
4008 start_singing(spell, MUSIC_QUAKE);
\r
4014 if (info) return info_radius(rad);
\r
4018 earthquake(p_ptr->y, p_ptr->x, 10);
\r
4026 if (name) return _("停滞の歌", "Stationary Shriek");
\r
4027 if (desc) return _("視界内の全てのモンスターを麻痺させようとする。抵抗されると無効。", "Attempts to freeze all monsters in sight.");
\r
4029 /* Stop singing before start another */
\r
4030 if (cast || fail) stop_singing();
\r
4034 msg_print(_("ゆっくりとしたメロディを奏で始めた...", "You weave a very slow pattern which is almost likely to stop..."));
\r
4035 start_singing(spell, MUSIC_STASIS);
\r
4039 int power = plev * 4;
\r
4041 if (info) return info_power(power);
\r
4045 stasis_monsters(power);
\r
4052 if (name) return _("守りの歌", "Endurance");
\r
4053 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。",
\r
4054 "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
4057 /* Stop singing before start another */
\r
4058 if (cast || fail) stop_singing();
\r
4062 msg_print(_("歌が神聖な場を作り出した...", "The holy power of the Music is creating sacred field..."));
\r
4069 if (name) return _("英雄の詩", "The Hero's Poem");
\r
4070 if (desc) return _("加速し、ヒーロー気分になり、視界内の全てのモンスターにダメージを与える。",
\r
4071 "Hastes you. Gives heroism. Damages all monsters in sight.");
\r
4073 /* Stop singing before start another */
\r
4074 if (cast || fail) stop_singing();
\r
4078 msg_print(_("英雄の歌を口ずさんだ...", "You chant a powerful, heroic call to arms..."));
\r
4079 (void)hp_player(10);
\r
4080 (void)set_afraid(0);
\r
4082 /* Recalculate hitpoints */
\r
4083 p_ptr->update |= (PU_HP);
\r
4085 start_singing(spell, MUSIC_SHERO);
\r
4092 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
\r
4093 /* Recalculate hitpoints */
\r
4094 p_ptr->update |= (PU_HP);
\r
4099 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
\r
4105 int sides = plev * 3;
\r
4107 if (info) return info_damage(dice, sides, 0);
\r
4111 dispel_monsters(damroll(dice, sides));
\r
4117 if (name) return _("ヤヴァンナの助け", "Relief of Yavanna");
\r
4118 if (desc) return _("強力な回復の歌で、負傷と朦朧状態も全快する。", "Powerful healing song. Also heals cut and stun completely.");
\r
4120 /* Stop singing before start another */
\r
4121 if (cast || fail) stop_singing();
\r
4125 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing the song..."));
\r
4126 start_singing(spell, MUSIC_H_LIFE);
\r
4133 if (info) return info_heal(dice, sides, 0);
\r
4137 hp_player(damroll(dice, sides));
\r
4146 if (name) return _("再生の歌", "Goddess' rebirth");
\r
4147 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
\r
4150 /* Stop singing before start another */
\r
4151 if (cast || fail) stop_singing();
\r
4155 msg_print(_("暗黒の中に光と美をふりまいた。体が元の活力を取り戻した。",
\r
4156 "You strewed light and beauty in the dark as you sing. You feel refreshed."));
\r
4157 (void)do_res_stat(A_STR);
\r
4158 (void)do_res_stat(A_INT);
\r
4159 (void)do_res_stat(A_WIS);
\r
4160 (void)do_res_stat(A_DEX);
\r
4161 (void)do_res_stat(A_CON);
\r
4162 (void)do_res_stat(A_CHR);
\r
4163 (void)restore_level();
\r
4169 if (name) return _("サウロンの魔術", "Wizardry of Sauron");
\r
4170 if (desc) return _("非常に強力でごく小さい轟音の球を放つ。", "Fires an extremely powerful tiny ball of sound.");
\r
4173 int dice = 50 + plev;
\r
4177 if (info) return info_damage(dice, sides, 0);
\r
4179 /* Stop singing before start another */
\r
4180 if (cast || fail) stop_singing();
\r
4184 if (!get_aim_dir(&dir)) return NULL;
\r
4186 fire_ball(GF_SOUND, dir, damroll(dice, sides), rad);
\r
4192 if (name) return _("フィンゴルフィンの挑戦", "Fingolfin's Challenge");
\r
4193 if (desc) return _("ダメージを受けなくなるバリアを張る。",
\r
4194 "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks.");
\r
4196 /* Stop singing before start another */
\r
4197 if (cast || fail) stop_singing();
\r
4201 msg_print(_("フィンゴルフィンの冥王への挑戦を歌った...",
\r
4202 "You recall the valor of Fingolfin's challenge to the Dark Lord..."));
\r
4205 p_ptr->redraw |= (PR_MAP);
\r
4207 /* Update monsters */
\r
4208 p_ptr->update |= (PU_MONSTERS);
\r
4210 /* Window stuff */
\r
4211 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
\r
4213 start_singing(spell, MUSIC_INVULN);
\r
4218 if (!p_ptr->invuln)
\r
4220 msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));
\r
4222 p_ptr->redraw |= (PR_MAP);
\r
4224 /* Update monsters */
\r
4225 p_ptr->update |= (PU_MONSTERS);
\r
4227 /* Window stuff */
\r
4228 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
\r
4239 * @brief 剣術の各処理を行う
\r
4240 * @param spell 剣術ID
\r
4241 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_CAST)
\r
4242 * @return SPELL_NAME / SPELL_DESC 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
4244 static cptr do_hissatsu_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
4246 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
4247 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
4248 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
4251 int plev = p_ptr->lev;
\r
4256 if (name) return _("飛飯綱", "Tobi-Izuna");
\r
4257 if (desc) return _("2マス離れたところにいるモンスターを攻撃する。", "Attacks a two squares distant monster.");
\r
4261 project_length = 2;
\r
4262 if (!get_aim_dir(&dir)) return NULL;
\r
4264 project_hook(GF_ATTACK, dir, HISSATSU_2, PROJECT_STOP | PROJECT_KILL);
\r
4269 if (name) return _("五月雨斬り", "3-Way Attack");
\r
4270 if (desc) return _("3方向に対して攻撃する。", "Attacks in 3 directions in one time.");
\r
4277 if (!get_rep_dir2(&dir)) return NULL;
\r
4278 if (dir == 5) return NULL;
\r
4280 for (cdir = 0;cdir < 8; cdir++)
\r
4282 if (cdd[cdir] == dir) break;
\r
4285 if (cdir == 8) return NULL;
\r
4287 y = p_ptr->y + ddy_cdd[cdir];
\r
4288 x = p_ptr->x + ddx_cdd[cdir];
\r
4289 if (cave[y][x].m_idx)
\r
4290 py_attack(y, x, 0);
\r
4292 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
\r
4294 y = p_ptr->y + ddy_cdd[(cdir + 7) % 8];
\r
4295 x = p_ptr->x + ddx_cdd[(cdir + 7) % 8];
\r
4296 if (cave[y][x].m_idx)
\r
4297 py_attack(y, x, 0);
\r
4299 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
\r
4301 y = p_ptr->y + ddy_cdd[(cdir + 1) % 8];
\r
4302 x = p_ptr->x + ddx_cdd[(cdir + 1) % 8];
\r
4303 if (cave[y][x].m_idx)
\r
4304 py_attack(y, x, 0);
\r
4306 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
\r
4311 if (name) return _("ブーメラン", "Boomerang");
\r
4312 if (desc) return _("武器を手元に戻ってくるように投げる。戻ってこないこともある。",
\r
4313 "Throws current weapon. And it'll return to your hand unless failed.");
\r
4317 if (!do_cmd_throw(1, TRUE, -1)) return NULL;
\r
4322 if (name) return _("焔霊", "Burning Strike");
\r
4323 if (desc) return _("火炎耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to fire.");
\r
4329 if (!get_rep_dir2(&dir)) return NULL;
\r
4330 if (dir == 5) return NULL;
\r
4332 y = p_ptr->y + ddy[dir];
\r
4333 x = p_ptr->x + ddx[dir];
\r
4335 if (cave[y][x].m_idx)
\r
4336 py_attack(y, x, HISSATSU_FIRE);
\r
4339 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
4346 if (name) return _("殺気感知", "Detect Ferocity");
\r
4347 if (desc) return _("近くの思考することができるモンスターを感知する。", "Detects all monsters except mindless in your vicinity.");
\r
4351 detect_monsters_mind(DETECT_RAD_DEFAULT);
\r
4356 if (name) return _("みね打ち", "Strike to Stun");
\r
4357 if (desc) return _("相手にダメージを与えないが、朦朧とさせる。", "Attempts to stun a monster in the adjacent.");
\r
4363 if (!get_rep_dir2(&dir)) return NULL;
\r
4364 if (dir == 5) return NULL;
\r
4366 y = p_ptr->y + ddy[dir];
\r
4367 x = p_ptr->x + ddx[dir];
\r
4369 if (cave[y][x].m_idx)
\r
4370 py_attack(y, x, HISSATSU_MINEUCHI);
\r
4373 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
4380 if (name) return _("カウンター", "Counter");
\r
4381 if (desc) return _("相手に攻撃されたときに反撃する。反撃するたびにMPを消費。",
\r
4382 "Prepares to counterattack. When attack by a monster, strikes back using SP each time.");
\r
4386 if (p_ptr->riding)
\r
4388 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
\r
4391 msg_print(_("相手の攻撃に対して身構えた。", "You prepare to counter blow."));
\r
4392 p_ptr->counter = TRUE;
\r
4397 if (name) return _("払い抜け", "Harainuke");
\r
4398 if (desc) return _("攻撃した後、反対側に抜ける。",
\r
4399 "Attacks monster with your weapons normally, then move through counter side of the monster.");
\r
4405 if (p_ptr->riding)
\r
4407 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
\r
4411 if (!get_rep_dir2(&dir)) return NULL;
\r
4413 if (dir == 5) return NULL;
\r
4414 y = p_ptr->y + ddy[dir];
\r
4415 x = p_ptr->x + ddx[dir];
\r
4417 if (!cave[y][x].m_idx)
\r
4419 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
4423 py_attack(y, x, 0);
\r
4425 if (!player_can_enter(cave[y][x].feat, 0) || is_trap(cave[y][x].feat))
\r
4431 if (player_can_enter(cave[y][x].feat, 0) && !is_trap(cave[y][x].feat) && !cave[y][x].m_idx)
\r
4435 /* Move the player */
\r
4436 (void)move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);
\r
4442 if (name) return _("サーペンツタン", "Serpent's Tongue");
\r
4443 if (desc) return _("毒耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to poison.");
\r
4449 if (!get_rep_dir2(&dir)) return NULL;
\r
4450 if (dir == 5) return NULL;
\r
4452 y = p_ptr->y + ddy[dir];
\r
4453 x = p_ptr->x + ddx[dir];
\r
4455 if (cave[y][x].m_idx)
\r
4456 py_attack(y, x, HISSATSU_POISON);
\r
4459 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
4466 if (name) return _("斬魔剣弐の太刀", "Zammaken");
\r
4467 if (desc) return _("生命のない邪悪なモンスターに大ダメージを与えるが、他のモンスターには全く効果がない。",
\r
4468 "Attacks an evil unliving monster with great damage. No effect to other monsters.");
\r
4474 if (!get_rep_dir2(&dir)) return NULL;
\r
4475 if (dir == 5) return NULL;
\r
4477 y = p_ptr->y + ddy[dir];
\r
4478 x = p_ptr->x + ddx[dir];
\r
4480 if (cave[y][x].m_idx)
\r
4481 py_attack(y, x, HISSATSU_ZANMA);
\r
4484 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
4491 if (name) return _("裂風剣", "Wind Blast");
\r
4492 if (desc) return _("攻撃した相手を後方へ吹き飛ばす。", "Attacks an adjacent monster, and blow it away.");
\r
4498 if (!get_rep_dir2(&dir)) return NULL;
\r
4499 if (dir == 5) return NULL;
\r
4501 y = p_ptr->y + ddy[dir];
\r
4502 x = p_ptr->x + ddx[dir];
\r
4504 if (cave[y][x].m_idx)
\r
4505 py_attack(y, x, 0);
\r
4508 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
4511 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
\r
4515 if (cave[y][x].m_idx)
\r
4518 POSITION ty = y, tx = x;
\r
4519 POSITION oy = y, ox = x;
\r
4520 MONSTER_IDX m_idx = cave[y][x].m_idx;
\r
4521 monster_type *m_ptr = &m_list[m_idx];
\r
4524 monster_desc(m_name, m_ptr, 0);
\r
4526 for (i = 0; i < 5; i++)
\r
4530 if (cave_empty_bold(y, x))
\r
4537 if ((ty != oy) || (tx != ox))
\r
4539 msg_format(_("%sを吹き飛ばした!", "You blow %s away!"), m_name);
\r
4540 cave[oy][ox].m_idx = 0;
\r
4541 cave[ty][tx].m_idx = m_idx;
\r
4545 update_mon(m_idx, TRUE);
\r
4546 lite_spot(oy, ox);
\r
4547 lite_spot(ty, tx);
\r
4549 if (r_info[m_ptr->r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))
\r
4550 p_ptr->update |= (PU_MON_LITE);
\r
4557 if (name) return _("刀匠の目利き", "Judge");
\r
4558 if (desc) return _("武器・防具を1つ識別する。レベル45以上で武器・防具の能力を完全に知ることができる。",
\r
4559 "Identifies a weapon or armor. Or *identifies* these at level 45.");
\r
4565 if (!identify_fully(TRUE)) return NULL;
\r
4569 if (!ident_spell(TRUE)) return NULL;
\r
4575 if (name) return _("破岩斬", "Rock Smash");
\r
4576 if (desc) return _("岩を壊し、岩石系のモンスターに大ダメージを与える。", "Breaks rock. Or greatly damage a monster made by rocks.");
\r
4582 if (!get_rep_dir2(&dir)) return NULL;
\r
4583 if (dir == 5) return NULL;
\r
4585 y = p_ptr->y + ddy[dir];
\r
4586 x = p_ptr->x + ddx[dir];
\r
4588 if (cave[y][x].m_idx)
\r
4589 py_attack(y, x, HISSATSU_HAGAN);
\r
4591 if (!cave_have_flag_bold(y, x, FF_HURT_ROCK)) break;
\r
4593 /* Destroy the feature */
\r
4594 cave_alter_feat(y, x, FF_HURT_ROCK);
\r
4596 /* Update some things */
\r
4597 p_ptr->update |= (PU_FLOW);
\r
4602 if (name) return _("乱れ雪月花", "Midare-Setsugekka");
\r
4603 if (desc) return _("攻撃回数が増え、冷気耐性のないモンスターに大ダメージを与える。",
\r
4604 "Attacks a monster with increased number of attacks and more damage unless it has resistance to cold.");
\r
4610 if (!get_rep_dir2(&dir)) return NULL;
\r
4611 if (dir == 5) return NULL;
\r
4613 y = p_ptr->y + ddy[dir];
\r
4614 x = p_ptr->x + ddx[dir];
\r
4616 if (cave[y][x].m_idx)
\r
4617 py_attack(y, x, HISSATSU_COLD);
\r
4620 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
4627 if (name) return _("急所突き", "Spot Aiming");
\r
4628 if (desc) return _("モンスターを一撃で倒す攻撃を繰り出す。失敗すると1点しかダメージを与えられない。",
\r
4629 "Attempts to kill a monster instantly. If failed cause only 1HP of damage.");
\r
4635 if (!get_rep_dir2(&dir)) return NULL;
\r
4636 if (dir == 5) return NULL;
\r
4638 y = p_ptr->y + ddy[dir];
\r
4639 x = p_ptr->x + ddx[dir];
\r
4641 if (cave[y][x].m_idx)
\r
4642 py_attack(y, x, HISSATSU_KYUSHO);
\r
4645 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
4652 if (name) return _("魔神斬り", "Majingiri");
\r
4653 if (desc) return _("会心の一撃で攻撃する。攻撃がかわされやすい。",
\r
4654 "Attempts to attack with critical hit. But this attack is easy to evade for a monster.");
\r
4660 if (!get_rep_dir2(&dir)) return NULL;
\r
4661 if (dir == 5) return NULL;
\r
4663 y = p_ptr->y + ddy[dir];
\r
4664 x = p_ptr->x + ddx[dir];
\r
4666 if (cave[y][x].m_idx)
\r
4667 py_attack(y, x, HISSATSU_MAJIN);
\r
4670 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
4677 if (name) return _("捨て身", "Desperate Attack");
\r
4678 if (desc) return _("強力な攻撃を繰り出す。次のターンまでの間、食らうダメージが増える。",
\r
4679 "Attacks with all of your power. But all damages you take will be doubled for one turn.");
\r
4685 if (!get_rep_dir2(&dir)) return NULL;
\r
4686 if (dir == 5) return NULL;
\r
4688 y = p_ptr->y + ddy[dir];
\r
4689 x = p_ptr->x + ddx[dir];
\r
4691 if (cave[y][x].m_idx)
\r
4692 py_attack(y, x, HISSATSU_SUTEMI);
\r
4695 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
4698 p_ptr->sutemi = TRUE;
\r
4703 if (name) return _("雷撃鷲爪斬", "Lightning Eagle");
\r
4704 if (desc) return _("電撃耐性のないモンスターに非常に大きいダメージを与える。",
\r
4705 "Attacks a monster with more damage unless it has resistance to electricity.");
\r
4711 if (!get_rep_dir2(&dir)) return NULL;
\r
4712 if (dir == 5) return NULL;
\r
4714 y = p_ptr->y + ddy[dir];
\r
4715 x = p_ptr->x + ddx[dir];
\r
4717 if (cave[y][x].m_idx)
\r
4718 py_attack(y, x, HISSATSU_ELEC);
\r
4721 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
4728 if (name) return _("入身", "Rush Attack");
\r
4729 if (desc) return _("素早く相手に近寄り攻撃する。", "Steps close to a monster and attacks at a time.");
\r
4733 if (!rush_attack(NULL)) return NULL;
\r
4738 if (name) return _("赤流渦", "Bloody Maelstrom");
\r
4739 if (desc) return _("自分自身も傷を作りつつ、その傷が深いほど大きい威力で全方向の敵を攻撃できる。生きていないモンスターには効果がない。",
\r
4740 "Attacks all adjacent monsters with power corresponding to your cut status. Then increases your cut status. No effect to unliving monsters.");
\r
4747 monster_type *m_ptr;
\r
4749 if (p_ptr->cut < 300)
\r
4750 set_cut(p_ptr->cut + 300);
\r
4752 set_cut(p_ptr->cut * 2);
\r
4754 for (dir = 0; dir < 8; dir++)
\r
4756 y = p_ptr->y + ddy_ddd[dir];
\r
4757 x = p_ptr->x + ddx_ddd[dir];
\r
4758 c_ptr = &cave[y][x];
\r
4760 /* Get the monster */
\r
4761 m_ptr = &m_list[c_ptr->m_idx];
\r
4763 /* Hack -- attack monsters */
\r
4764 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
\r
4766 if (!monster_living(&r_info[m_ptr->r_idx]))
\r
4770 monster_desc(m_name, m_ptr, 0);
\r
4771 msg_format(_("%sには効果がない!", "%s is unharmed!"), m_name);
\r
4773 else py_attack(y, x, HISSATSU_SEKIRYUKA);
\r
4780 if (name) return _("激震撃", "Earthquake Blow");
\r
4781 if (desc) return _("地震を起こす。", "Shakes dungeon structure, and results in random swapping of floors and walls.");
\r
4787 if (!get_rep_dir2(&dir)) return NULL;
\r
4788 if (dir == 5) return NULL;
\r
4790 y = p_ptr->y + ddy[dir];
\r
4791 x = p_ptr->x + ddx[dir];
\r
4793 if (cave[y][x].m_idx)
\r
4794 py_attack(y, x, HISSATSU_QUAKE);
\r
4796 earthquake(p_ptr->y, p_ptr->x, 10);
\r
4801 if (name) return _("地走り", "Crack");
\r
4802 if (desc) return _("衝撃波のビームを放つ。", "Fires a beam of shock wave.");
\r
4806 int total_damage = 0, basedam, i;
\r
4807 u32b flgs[TR_FLAG_SIZE];
\r
4808 object_type *o_ptr;
\r
4809 if (!get_aim_dir(&dir)) return NULL;
\r
4810 msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
\r
4811 for (i = 0; i < 2; i++)
\r
4815 if (!buki_motteruka(INVEN_RARM+i)) break;
\r
4816 o_ptr = &inventory[INVEN_RARM+i];
\r
4817 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
\r
4818 damage = o_ptr->to_d * 100;
\r
4819 object_flags(o_ptr, flgs);
\r
4820 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
\r
4822 /* vorpal blade */
\r
4826 else if (have_flag(flgs, TR_VORPAL))
\r
4828 /* vorpal flag only */
\r
4832 damage += basedam;
\r
4833 damage *= p_ptr->num_blow[i];
\r
4834 total_damage += damage / 200;
\r
4835 if (i) total_damage = total_damage*7/10;
\r
4837 fire_beam(GF_FORCE, dir, total_damage);
\r
4842 if (name) return _("気迫の雄叫び", "War Cry");
\r
4843 if (desc) return _("視界内の全モンスターに対して轟音の攻撃を行う。さらに、近くにいるモンスターを怒らせる。",
\r
4844 "Damages all monsters in sight with sound. Aggravate nearby monsters.");
\r
4848 msg_print(_("雄叫びをあげた!", "You roar out!"));
\r
4849 project_hack(GF_SOUND, randint1(plev * 3));
\r
4850 aggravate_monsters(0);
\r
4855 if (name) return _("無双三段", "Musou-Sandan");
\r
4856 if (desc) return _("強力な3段攻撃を繰り出す。", "Attacks with powerful 3 strikes.");
\r
4862 if (!get_rep_dir2(&dir)) return NULL;
\r
4863 if (dir == 5) return NULL;
\r
4865 for (i = 0; i < 3; i++)
\r
4869 MONSTER_IDX m_idx;
\r
4871 monster_type *m_ptr;
\r
4873 y = p_ptr->y + ddy[dir];
\r
4874 x = p_ptr->x + ddx[dir];
\r
4875 c_ptr = &cave[y][x];
\r
4878 py_attack(y, x, HISSATSU_3DAN);
\r
4881 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
4885 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
\r
4890 /* Monster is dead? */
\r
4891 if (!c_ptr->m_idx) break;
\r
4893 ny = y + ddy[dir];
\r
4894 nx = x + ddx[dir];
\r
4895 m_idx = c_ptr->m_idx;
\r
4896 m_ptr = &m_list[m_idx];
\r
4898 /* Monster cannot move back? */
\r
4899 if (!monster_can_enter(ny, nx, &r_info[m_ptr->r_idx], 0))
\r
4902 if (i < 2) msg_print(NULL);
\r
4907 cave[ny][nx].m_idx = m_idx;
\r
4911 update_mon(m_idx, TRUE);
\r
4913 /* Redraw the old spot */
\r
4916 /* Redraw the new spot */
\r
4917 lite_spot(ny, nx);
\r
4919 /* Player can move forward? */
\r
4920 if (player_can_enter(c_ptr->feat, 0))
\r
4922 /* Move the player */
\r
4923 if (!move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP)) break;
\r
4931 if (i < 2) msg_print(NULL);
\r
4937 if (name) return _("吸血鬼の牙", "Vampire's Fang");
\r
4938 if (desc) return _("攻撃した相手の体力を吸いとり、自分の体力を回復させる。生命を持たないモンスターには通じない。",
\r
4939 "Attacks with vampiric strikes which absorbs HP from a monster and gives them to you. No effect to unliving monsters.");
\r
4945 if (!get_rep_dir2(&dir)) return NULL;
\r
4946 if (dir == 5) return NULL;
\r
4948 y = p_ptr->y + ddy[dir];
\r
4949 x = p_ptr->x + ddx[dir];
\r
4951 if (cave[y][x].m_idx)
\r
4952 py_attack(y, x, HISSATSU_DRAIN);
\r
4955 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
4962 if (name) return _("幻惑", "Moon Dazzling");
\r
4963 if (desc) return _("視界内の起きている全モンスターに朦朧、混乱、眠りを与えようとする。", "Attempts to stun, confuse and sleep all waking monsters.");
\r
4967 msg_print(_("武器を不規則に揺らした...", "You irregularly wave your weapon..."));
\r
4968 project_hack(GF_ENGETSU, plev * 4);
\r
4969 project_hack(GF_ENGETSU, plev * 4);
\r
4970 project_hack(GF_ENGETSU, plev * 4);
\r
4975 if (name) return _("百人斬り", "Hundred Slaughter");
\r
4976 if (desc) return _("連続して入身でモンスターを攻撃する。攻撃するたびにMPを消費。MPがなくなるか、モンスターを倒せなかったら百人斬りは終了する。",
\r
4977 "Performs a series of rush attacks. The series continues while killing each monster in a time and SP remains.");
\r
4981 const int mana_cost_per_monster = 8;
\r
4982 bool is_new = TRUE;
\r
4987 if (!rush_attack(&mdeath)) break;
\r
4990 /* Reserve needed mana point */
\r
4991 p_ptr->csp -= technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
\r
4995 p_ptr->csp -= mana_cost_per_monster;
\r
4997 if (!mdeath) break;
\r
5000 p_ptr->redraw |= PR_MANA;
\r
5003 while (p_ptr->csp > mana_cost_per_monster);
\r
5005 if (is_new) return NULL;
\r
5007 /* Restore reserved mana */
\r
5008 p_ptr->csp += technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
\r
5013 if (name) return _("天翔龍閃", "Dragonic Flash");
\r
5014 if (desc) return _("視界内の場所を指定して、その場所と自分の間にいる全モンスターを攻撃し、その場所に移動する。",
\r
5015 "Runs toward given location while attacking all monsters on the path.");
\r
5021 if (!tgt_pt(&x, &y)) return NULL;
\r
5023 if (!cave_player_teleportable_bold(y, x, 0L) ||
\r
5024 (distance(y, x, p_ptr->y, p_ptr->x) > MAX_SIGHT / 2) ||
\r
5025 !projectable(p_ptr->y, p_ptr->x, y, x))
\r
5027 msg_print(_("失敗!", "You cannot move to that place!"));
\r
5030 if (p_ptr->anti_tele)
\r
5032 msg_print(_("不思議な力がテレポートを防いだ!", "A mysterious force prevents you from teleporting!"));
\r
5035 project(0, 0, y, x, HISSATSU_ISSEN, GF_ATTACK, PROJECT_BEAM | PROJECT_KILL, -1);
\r
5036 teleport_player_to(y, x, 0L);
\r
5041 if (name) return _("二重の剣撃", "Twin Slash");
\r
5042 if (desc) return _("1ターンで2度攻撃を行う。", "double attacks at a time.");
\r
5048 if (!get_rep_dir(&dir, FALSE)) return NULL;
\r
5050 y = p_ptr->y + ddy[dir];
\r
5051 x = p_ptr->x + ddx[dir];
\r
5053 if (cave[y][x].m_idx)
\r
5055 py_attack(y, x, 0);
\r
5056 if (cave[y][x].m_idx)
\r
5059 py_attack(y, x, 0);
\r
5064 msg_print(_("その方向にはモンスターはいません。", "You don't see any monster in this direction"));
\r
5071 if (name) return _("虎伏絶刀勢", "Kofuku-Zettousei");
\r
5072 if (desc) return _("強力な攻撃を行い、近くの場所にも効果が及ぶ。", "Performs a powerful attack which even effect nearby monsters.");
\r
5076 int total_damage = 0, basedam, i;
\r
5078 u32b flgs[TR_FLAG_SIZE];
\r
5079 object_type *o_ptr;
\r
5081 if (!get_rep_dir2(&dir)) return NULL;
\r
5082 if (dir == 5) return NULL;
\r
5084 y = p_ptr->y + ddy[dir];
\r
5085 x = p_ptr->x + ddx[dir];
\r
5087 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
\r
5089 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));
\r
5092 msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
\r
5093 for (i = 0; i < 2; i++)
\r
5096 if (!buki_motteruka(INVEN_RARM+i)) break;
\r
5097 o_ptr = &inventory[INVEN_RARM+i];
\r
5098 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
\r
5099 damage = o_ptr->to_d * 100;
\r
5100 object_flags(o_ptr, flgs);
\r
5101 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
\r
5103 /* vorpal blade */
\r
5107 else if (have_flag(flgs, TR_VORPAL))
\r
5109 /* vorpal flag only */
\r
5113 damage += basedam;
\r
5114 damage += p_ptr->to_d[i] * 100;
\r
5115 damage *= p_ptr->num_blow[i];
\r
5116 total_damage += (damage / 100);
\r
5118 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
5123 if (name) return _("慶雲鬼忍剣", "Keiun-Kininken");
\r
5124 if (desc) return _("自分もダメージをくらうが、相手に非常に大きなダメージを与える。アンデッドには特に効果がある。",
\r
5125 "Attacks a monster with extremely powerful damage. But you also takes some damages. Hurts a undead monster greatly.");
\r
5131 if (!get_rep_dir2(&dir)) return NULL;
\r
5132 if (dir == 5) return NULL;
\r
5134 y = p_ptr->y + ddy[dir];
\r
5135 x = p_ptr->x + ddx[dir];
\r
5137 if (cave[y][x].m_idx)
\r
5138 py_attack(y, x, HISSATSU_UNDEAD);
\r
5141 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
5144 take_hit(DAMAGE_NOESCAPE, 100 + randint1(100), _("慶雲鬼忍剣を使った衝撃", "exhaustion on using Keiun-Kininken"), -1);
\r
5149 if (name) return _("切腹", "Harakiri");
\r
5150 if (desc) return _("「武士道とは、死ぬことと見つけたり。」", "'Busido is found in death'");
\r
5155 if (!get_check(_("本当に自殺しますか?", "Do you really want to commit suicide? "))) return NULL;
\r
5156 /* Special Verification for suicide */
\r
5157 prt(_("確認のため '@' を押して下さい。", "Please verify SUICIDE by typing the '@' sign: "), 0, 0);
\r
5162 if (i != '@') return NULL;
\r
5163 if (p_ptr->total_winner)
\r
5165 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
\r
5166 p_ptr->total_winner = TRUE;
\r
5170 msg_print(_("武士道とは、死ぬことと見つけたり。", "Meaning of Bushi-do is found in the death."));
\r
5171 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
\r
5181 * @brief 呪術領域の武器呪縛の対象にできる武器かどうかを返す。 / An "item_tester_hook" for offer
\r
5182 * @param o_ptr オブジェクト構造体の参照ポインタ
\r
5183 * @return 呪縛可能な武器ならばTRUEを返す
\r
5185 static bool item_tester_hook_weapon_except_bow(object_type *o_ptr)
\r
5187 switch (o_ptr->tval)
\r
5202 * @brief 呪術領域の各処理に使える呪われた装備かどうかを返す。 / An "item_tester_hook" for offer
\r
5203 * @param o_ptr オブジェクト構造体の参照ポインタ
\r
5204 * @return 使える装備ならばTRUEを返す
\r
5206 static bool item_tester_hook_cursed(object_type *o_ptr)
\r
5208 return (bool)(object_is_cursed(o_ptr));
\r
5212 * @brief 呪術領域魔法の各処理を行う
\r
5213 * @param spell 魔法ID
\r
5214 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_CONT / SPELL_STOP)
\r
5215 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
\r
5217 static cptr do_hex_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
5219 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
5220 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
5221 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
5222 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
5223 bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
\r
5224 bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
\r
5228 PLAYER_LEVEL plev = p_ptr->lev;
\r
5233 /*** 1st book (0-7) ***/
\r
5235 if (name) return _("邪なる祝福", "Evily blessing");
\r
5236 if (desc) return _("祝福により攻撃精度と防御力が上がる。", "Attempts to increase +to_hit of a weapon and AC");
\r
5239 if (!p_ptr->blessed)
\r
5241 msg_print(_("高潔な気分になった!", "You feel righteous!"));
\r
5246 if (!p_ptr->blessed)
\r
5248 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
\r
5254 if (name) return _("軽傷の治癒", "Cure light wounds");
\r
5255 if (desc) return _("HPや傷を少し回復させる。", "Heals cut and HP a little.");
\r
5256 if (info) return info_heal(1, 10, 0);
\r
5259 msg_print(_("気分が良くなってくる。", "You feel better and better."));
\r
5263 hp_player(damroll(1, 10));
\r
5264 set_cut(p_ptr->cut - 10);
\r
5269 if (name) return _("悪魔のオーラ", "Demonic aura");
\r
5270 if (desc) return _("炎のオーラを身にまとい、回復速度が速くなる。", "Gives fire aura and regeneration.");
\r
5273 msg_print(_("体が炎のオーラで覆われた。", "You have enveloped by fiery aura!"));
\r
5277 msg_print(_("炎のオーラが消え去った。", "Fiery aura disappeared."));
\r
5282 if (name) return _("悪臭霧", "Stinking mist");
\r
5283 if (desc) return _("視界内のモンスターに微弱量の毒のダメージを与える。", "Deals few damages of poison to all monsters in your sight.");
\r
5284 power = plev / 2 + 5;
\r
5285 if (info) return info_damage(1, power, 0);
\r
5288 project_hack(GF_POIS, randint1(power));
\r
5293 if (name) return _("腕力強化", "Extra might");
\r
5294 if (desc) return _("術者の腕力を上昇させる。", "Attempts to increase your strength.");
\r
5297 msg_print(_("何だか力が湧いて来る。", "You feel you get stronger."));
\r
5302 if (name) return _("武器呪縛", "Curse weapon");
\r
5303 if (desc) return _("装備している武器を呪う。", "Curses your weapon.");
\r
5308 char o_name[MAX_NLEN];
\r
5309 object_type *o_ptr;
\r
5310 u32b f[TR_FLAG_SIZE];
\r
5312 item_tester_hook = item_tester_hook_weapon_except_bow;
\r
5313 q = _("どれを呪いますか?", "Which weapon do you curse?");
\r
5314 s = _("武器を装備していない。", "You wield no weapons.");
\r
5316 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
\r
5318 o_ptr = &inventory[item];
\r
5319 object_desc(o_name, o_ptr, OD_NAME_ONLY);
\r
5320 object_flags(o_ptr, f);
\r
5322 if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
\r
5324 if (!one_in_(3) &&
\r
5325 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
\r
5327 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
\r
5330 if (o_ptr->to_d > 0)
\r
5332 o_ptr->to_d -= randint1(3) % 2;
\r
5333 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
\r
5335 if (o_ptr->to_h > 0)
\r
5337 o_ptr->to_h -= randint1(3) % 2;
\r
5338 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
\r
5340 if (o_ptr->to_a > 0)
\r
5342 o_ptr->to_a -= randint1(3) % 2;
\r
5343 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
\r
5345 msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
\r
5350 int curse_rank = 0;
\r
5351 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
\r
5352 o_ptr->curse_flags |= (TRC_CURSED);
\r
5354 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
\r
5357 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
\r
5360 o_ptr->curse_flags |= (TRC_TY_CURSE);
\r
5361 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
\r
5363 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
\r
5364 add_flag(o_ptr->art_flags, TR_VORPAL);
\r
5365 add_flag(o_ptr->art_flags, TR_VAMPIRIC);
\r
5366 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
\r
5371 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);
\r
5374 p_ptr->update |= (PU_BONUS);
\r
5380 if (name) return _("邪悪感知", "Evil detection");
\r
5381 if (desc) return _("周囲の邪悪なモンスターを感知する。", "Detects evil monsters.");
\r
5382 if (info) return info_range(MAX_SIGHT);
\r
5385 msg_print(_("邪悪な生物の存在を感じ取ろうとした。", "You attend to the presence of evil creatures."));
\r
5390 if (name) return _("我慢", "Patience");
\r
5391 if (desc) return _("数ターン攻撃を耐えた後、受けたダメージを地獄の業火として周囲に放出する。",
\r
5392 "Bursts hell fire strongly after patients any damage while few turns.");
\r
5393 power = MIN(200, (HEX_REVENGE_POWER(p_ptr) * 2));
\r
5394 if (info) return info_damage(0, 0, power);
\r
5397 int a = 3 - (p_ptr->pspeed - 100) / 10;
\r
5398 MAGIC_NUM2 r = 3 + randint1(3) + MAX(0, MIN(3, a));
\r
5400 if (HEX_REVENGE_TURN(p_ptr) > 0)
\r
5402 msg_print(_("すでに我慢をしている。", "You are already patienting."));
\r
5406 HEX_REVENGE_TYPE(p_ptr) = 1;
\r
5407 HEX_REVENGE_TURN(p_ptr) = r;
\r
5408 HEX_REVENGE_POWER(p_ptr) = 0;
\r
5409 msg_print(_("じっと耐えることにした。", "You decide to patient all damages."));
\r
5414 int rad = 2 + (power / 50);
\r
5416 HEX_REVENGE_TURN(p_ptr)--;
\r
5418 if ((HEX_REVENGE_TURN(p_ptr) <= 0) || (power >= 200))
\r
5420 msg_print(_("我慢が解かれた!", "Time for end of patioence!"));
\r
5423 project(0, rad, p_ptr->y, p_ptr->x, power, GF_HELL_FIRE,
\r
5424 (PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);
\r
5426 if (p_ptr->wizard)
\r
5428 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
\r
5432 HEX_REVENGE_TYPE(p_ptr) = 0;
\r
5433 HEX_REVENGE_TURN(p_ptr) = 0;
\r
5434 HEX_REVENGE_POWER(p_ptr) = 0;
\r
5439 /*** 2nd book (8-15) ***/
\r
5441 if (name) return _("氷の鎧", "Ice armor");
\r
5442 if (desc) return _("氷のオーラを身にまとい、防御力が上昇する。", "Gives fire aura and bonus to AC.");
\r
5445 msg_print(_("体が氷の鎧で覆われた。", "You have enveloped by ice armor!"));
\r
5449 msg_print(_("氷の鎧が消え去った。", "Ice armor disappeared."));
\r
5454 if (name) return _("重傷の治癒", "Cure serious wounds");
\r
5455 if (desc) return _("体力や傷を多少回復させる。", "Heals cut and HP more.");
\r
5456 if (info) return info_heal(2, 10, 0);
\r
5459 msg_print(_("気分が良くなってくる。", "You feel better and better."));
\r
5463 hp_player(damroll(2, 10));
\r
5464 set_cut((p_ptr->cut / 2) - 10);
\r
5469 if (name) return _("薬品吸入", "Inhail potion");
\r
5470 if (desc) return _("呪文詠唱を中止することなく、薬の効果を得ることができる。", "Quaffs a potion without canceling of casting a spell.");
\r
5473 CASTING_HEX_FLAGS(p_ptr) |= (1L << HEX_INHAIL);
\r
5474 do_cmd_quaff_potion();
\r
5475 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_INHAIL);
\r
5481 if (name) return _("衰弱の霧", "Hypodynamic mist");
\r
5482 if (desc) return _("視界内のモンスターに微弱量の衰弱属性のダメージを与える。",
\r
5483 "Deals few damages of hypodynamia to all monsters in your sight.");
\r
5484 power = (plev / 2) + 5;
\r
5485 if (info) return info_damage(1, power, 0);
\r
5488 project_hack(GF_HYPODYNAMIA, randint1(power));
\r
5493 if (name) return _("魔剣化", "Swords to runeswords");
\r
5494 if (desc) return _("武器の攻撃力を上げる。切れ味を得、呪いに応じて与えるダメージが上昇し、善良なモンスターに対するダメージが2倍になる。",
\r
5495 "Gives vorpal ability to your weapon. Increases damages by your weapon acccording to curse of your weapon.");
\r
5499 msg_print("あなたの武器が黒く輝いた。");
\r
5501 if (!empty_hands(FALSE))
\r
5502 msg_print("Your weapons glow bright black.");
\r
5504 msg_print("Your weapon glows bright black.");
\r
5510 msg_print("武器の輝きが消え去った。");
\r
5512 msg_format("Brightness of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
\r
5518 if (name) return _("混乱の手", "Touch of confusion");
\r
5519 if (desc) return _("攻撃した際モンスターを混乱させる。", "Confuses a monster when you attack.");
\r
5522 msg_print(_("あなたの手が赤く輝き始めた。", "Your hands glow bright red."));
\r
5526 msg_print(_("手の輝きがなくなった。", "Brightness on your hands disappeard."));
\r
5531 if (name) return _("肉体強化", "Building up");
\r
5532 if (desc) return _("術者の腕力、器用さ、耐久力を上昇させる。攻撃回数の上限を 1 増加させる。",
\r
5533 "Attempts to increases your strength, dexterity and constitusion.");
\r
5536 msg_print(_("身体が強くなった気がした。", "You feel your body is developed more now."));
\r
5541 if (name) return _("反テレポート結界", "Anti teleport barrier");
\r
5542 if (desc) return _("視界内のモンスターのテレポートを阻害するバリアを張る。", "Obstructs all teleportations by monsters in your sight.");
\r
5543 power = plev * 3 / 2;
\r
5544 if (info) return info_power(power);
\r
5547 msg_print(_("テレポートを防ぐ呪いをかけた。", "You feel anyone can not teleport except you."));
\r
5551 /*** 3rd book (16-23) ***/
\r
5553 if (name) return _("衝撃のクローク", "Cloak of shock");
\r
5554 if (desc) return _("電気のオーラを身にまとい、動きが速くなる。", "Gives lightning aura and a bonus to speed.");
\r
5557 msg_print(_("体が稲妻のオーラで覆われた。", "You have enveloped by electrical aura!"));
\r
5561 msg_print(_("稲妻のオーラが消え去った。", "Electrical aura disappeared."));
\r
5566 if (name) return _("致命傷の治癒", "Cure critical wounds");
\r
5567 if (desc) return _("体力や傷を回復させる。", "Heals cut and HP greatry.");
\r
5568 if (info) return info_heal(4, 10, 0);
\r
5571 msg_print(_("気分が良くなってくる。", "You feel better and better."));
\r
5575 hp_player(damroll(4, 10));
\r
5583 if (name) return _("呪力封入", "Recharging");
\r
5584 if (desc) return _("魔法の道具に魔力を再充填する。", "Recharges a magic device.");
\r
5586 if (info) return info_power(power);
\r
5589 if (!recharge(power)) return NULL;
\r
5595 if (name) return _("死者復活", "Animate Dead");
\r
5596 if (desc) return _("死体を蘇らせてペットにする。", "Raises corpses and skeletons from dead.");
\r
5599 msg_print(_("死者への呼びかけを始めた。", "You start to call deads.!"));
\r
5603 animate_dead(0, p_ptr->y, p_ptr->x);
\r
5608 if (name) return _("防具呪縛", "Curse armor");
\r
5609 if (desc) return _("装備している防具に呪いをかける。", "Curse a piece of armour that you wielding.");
\r
5614 char o_name[MAX_NLEN];
\r
5615 object_type *o_ptr;
\r
5616 u32b f[TR_FLAG_SIZE];
\r
5618 item_tester_hook = object_is_armour;
\r
5619 q = _("どれを呪いますか?", "Which piece of armour do you curse?");
\r
5620 s = _("防具を装備していない。", "You wield no piece of armours.");
\r
5622 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
\r
5624 o_ptr = &inventory[item];
\r
5625 object_desc(o_name, o_ptr, OD_NAME_ONLY);
\r
5626 object_flags(o_ptr, f);
\r
5628 if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
\r
5630 if (!one_in_(3) &&
\r
5631 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
\r
5633 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
\r
5636 if (o_ptr->to_d > 0)
\r
5638 o_ptr->to_d -= randint1(3) % 2;
\r
5639 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
\r
5641 if (o_ptr->to_h > 0)
\r
5643 o_ptr->to_h -= randint1(3) % 2;
\r
5644 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
\r
5646 if (o_ptr->to_a > 0)
\r
5648 o_ptr->to_a -= randint1(3) % 2;
\r
5649 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
\r
5651 msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
\r
5656 int curse_rank = 0;
\r
5657 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
\r
5658 o_ptr->curse_flags |= (TRC_CURSED);
\r
5660 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
\r
5663 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
\r
5666 o_ptr->curse_flags |= (TRC_TY_CURSE);
\r
5667 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
\r
5669 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
\r
5670 add_flag(o_ptr->art_flags, TR_RES_POIS);
\r
5671 add_flag(o_ptr->art_flags, TR_RES_DARK);
\r
5672 add_flag(o_ptr->art_flags, TR_RES_NETHER);
\r
5673 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
\r
5678 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);
\r
5681 p_ptr->update |= (PU_BONUS);
\r
5687 if (name) return _("影のクローク", "Cloak of shadow");
\r
5688 if (desc) return _("影のオーラを身にまとい、敵に影のダメージを与える。", "Gives aura of shadow.");
\r
5691 object_type *o_ptr = &inventory[INVEN_OUTER];
\r
5693 if (!o_ptr->k_idx)
\r
5695 msg_print(_("クロークを身につけていない!", "You don't ware any cloak."));
\r
5698 else if (!object_is_cursed(o_ptr))
\r
5700 msg_print(_("クロークは呪われていない!", "Your cloak is not cursed."));
\r
5705 msg_print(_("影のオーラを身にまとった。", "You have enveloped by shadow aura!"));
\r
5710 object_type *o_ptr = &inventory[INVEN_OUTER];
\r
5712 if ((!o_ptr->k_idx) || (!object_is_cursed(o_ptr)))
\r
5714 do_spell(REALM_HEX, spell, SPELL_STOP);
\r
5715 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << spell);
\r
5716 CASTING_HEX_NUM(p_ptr)--;
\r
5717 if (!SINGING_SONG_ID(p_ptr)) set_action(ACTION_NONE);
\r
5722 msg_print(_("影のオーラが消え去った。", "Shadow aura disappeared."));
\r
5727 if (name) return _("苦痛を魔力に", "Pains to mana");
\r
5728 if (desc) return _("視界内のモンスターに精神ダメージ与え、魔力を吸い取る。", "Deals psychic damages to all monsters in sight, and drains some mana.");
\r
5729 power = plev * 3 / 2;
\r
5730 if (info) return info_damage(1, power, 0);
\r
5733 project_hack(GF_PSI_DRAIN, randint1(power));
\r
5738 if (name) return _("目には目を", "Eye for an eye");
\r
5739 if (desc) return _("打撃や魔法で受けたダメージを、攻撃元のモンスターにも与える。", "Returns same damage which you got to the monster which damaged you.");
\r
5742 msg_print(_("復讐したい欲望にかられた。", "You wish strongly you want to revenge anything."));
\r
5746 /*** 4th book (24-31) ***/
\r
5748 if (name) return _("反増殖結界", "Anti multiply barrier");
\r
5749 if (desc) return _("その階の増殖するモンスターの増殖を阻止する。", "Obstructs all multiplying by monsters in entire floor.");
\r
5752 msg_print(_("増殖を阻止する呪いをかけた。", "You feel anyone can not already multiply."));
\r
5757 if (name) return _("全復活", "Restoration");
\r
5758 if (desc) return _("経験値を徐々に復活し、減少した能力値を回復させる。", "Restores experience and status.");
\r
5761 msg_print(_("体が元の活力を取り戻し始めた。", "You feel your lost status starting to return."));
\r
5765 bool flag = FALSE;
\r
5766 int d = (p_ptr->max_exp - p_ptr->exp);
\r
5767 int r = (p_ptr->exp / 20);
\r
5773 p_ptr->exp = p_ptr->max_exp;
\r
5777 /* Check the experience */
\r
5778 check_experience();
\r
5782 for (i = A_STR; i < 6; i ++)
\r
5784 if (p_ptr->stat_cur[i] < p_ptr->stat_max[i])
\r
5786 if (p_ptr->stat_cur[i] < 18)
\r
5787 p_ptr->stat_cur[i]++;
\r
5789 p_ptr->stat_cur[i] += 10;
\r
5791 if (p_ptr->stat_cur[i] > p_ptr->stat_max[i])
\r
5792 p_ptr->stat_cur[i] = p_ptr->stat_max[i];
\r
5794 /* Recalculate bonuses */
\r
5795 p_ptr->update |= (PU_BONUS);
\r
5803 msg_format(_("%sの呪文の詠唱をやめた。", "Finish casting '%^s'."), do_spell(REALM_HEX, HEX_RESTORE, SPELL_NAME));
\r
5804 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_RESTORE);
\r
5805 if (cont) CASTING_HEX_NUM(p_ptr)--;
\r
5806 if (CASTING_HEX_NUM(p_ptr)) p_ptr->action = ACTION_NONE;
\r
5808 /* Redraw status */
\r
5809 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
\r
5810 p_ptr->redraw |= (PR_EXTRA);
\r
5818 if (name) return _("呪力吸収", "Drain curse power");
\r
5819 if (desc) return _("呪われた武器の呪いを吸収して魔力を回復する。", "Drains curse on your weapon and heals SP a little.");
\r
5824 u32b f[TR_FLAG_SIZE];
\r
5825 object_type *o_ptr;
\r
5827 item_tester_hook = item_tester_hook_cursed;
\r
5828 q = _("どの装備品から吸収しますか?", "Which cursed equipment do you drain mana from?");
\r
5829 s = _("呪われたアイテムを装備していない。", "You have no cursed equipment.");
\r
5831 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
\r
5833 o_ptr = &inventory[item];
\r
5834 object_flags(o_ptr, f);
\r
5836 p_ptr->csp += (p_ptr->lev / 5) + randint1(p_ptr->lev / 5);
\r
5837 if (have_flag(f, TR_TY_CURSE) || (o_ptr->curse_flags & TRC_TY_CURSE)) p_ptr->csp += randint1(5);
\r
5838 if (p_ptr->csp > p_ptr->msp) p_ptr->csp = p_ptr->msp;
\r
5840 if (o_ptr->curse_flags & TRC_PERMA_CURSE)
\r
5844 else if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
\r
5848 msg_print(_("呪いを全て吸い取った。", "Heavy curse vanished away."));
\r
5849 o_ptr->curse_flags = 0L;
\r
5852 else if ((o_ptr->curse_flags & (TRC_CURSED)) && one_in_(3))
\r
5854 msg_print(_("呪いを全て吸い取った。", "Curse vanished away."));
\r
5855 o_ptr->curse_flags = 0L;
\r
5863 if (name) return _("吸血の刃", "Swords to vampires");
\r
5864 if (desc) return _("吸血属性で攻撃する。", "Gives vampiric ability to your weapon.");
\r
5868 msg_print("あなたの武器が血を欲している。");
\r
5870 if (!empty_hands(FALSE))
\r
5871 msg_print("Your weapons want more blood now.");
\r
5873 msg_print("Your weapon wants more blood now.");
\r
5879 msg_print("武器の渇望が消え去った。");
\r
5881 msg_format("Thirsty of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
\r
5887 if (name) return _("朦朧の言葉", "Word of stun");
\r
5888 if (desc) return _("視界内のモンスターを朦朧とさせる。", "Stuns all monsters in your sight.");
\r
5890 if (info) return info_power(power);
\r
5893 stun_monsters(power);
\r
5898 if (name) return _("影移動", "Moving into shadow");
\r
5899 if (desc) return _("モンスターの隣のマスに瞬間移動する。", "Teleports you close to a monster.");
\r
5906 for (i = 0; i < 3; i++)
\r
5908 if (!tgt_pt(&x, &y)) return FALSE;
\r
5912 for (dir = 0; dir < 8; dir++)
\r
5914 int dy = y + ddy_ddd[dir];
\r
5915 int dx = x + ddx_ddd[dir];
\r
5916 if (dir == 5) continue;
\r
5917 if(cave[dy][dx].m_idx) flag = TRUE;
\r
5920 if (!cave_empty_bold(y, x) || (cave[y][x].info & CAVE_ICKY) ||
\r
5921 (distance(y, x, p_ptr->y, p_ptr->x) > plev + 2))
\r
5923 msg_print(_("そこには移動できない。", "Can not teleport to there."));
\r
5929 if (flag && randint0(plev * plev / 2))
\r
5931 teleport_player_to(y, x, 0L);
\r
5935 msg_print(_("おっと!", "Oops!"));
\r
5936 teleport_player(30, 0L);
\r
5944 if (name) return _("反魔法結界", "Anti magic barrier");
\r
5945 if (desc) return _("視界内のモンスターの魔法を阻害するバリアを張る。", "Obstructs all magic spell of monsters in your sight.");
\r
5946 power = plev * 3 / 2;
\r
5947 if (info) return info_power(power);
\r
5950 msg_print(_("魔法を防ぐ呪いをかけた。", "You feel anyone can not cast spells except you."));
\r
5955 if (name) return _("復讐の宣告", "Revenge sentence");
\r
5956 if (desc) return _("数ターン後にそれまで受けたダメージに応じた威力の地獄の劫火の弾を放つ。",
\r
5957 "Fires a ball of hell fire to try revenging after few turns.");
\r
5958 power = HEX_REVENGE_POWER(p_ptr);
\r
5959 if (info) return info_damage(0, 0, power);
\r
5963 int a = 3 - (p_ptr->pspeed - 100) / 10;
\r
5964 r = 1 + randint1(2) + MAX(0, MIN(3, a));
\r
5966 if (HEX_REVENGE_TURN(p_ptr) > 0)
\r
5968 msg_print(_("すでに復讐は宣告済みだ。", "You already pronounced your revenge."));
\r
5972 HEX_REVENGE_TYPE(p_ptr) = 2;
\r
5973 HEX_REVENGE_TURN(p_ptr) = r;
\r
5974 msg_format(_("あなたは復讐を宣告した。あと %d ターン。", "You pronounce your revenge. %d turns left."), r);
\r
5979 HEX_REVENGE_TURN(p_ptr)--;
\r
5981 if (HEX_REVENGE_TURN(p_ptr) <= 0)
\r
5991 msg_print(_("復讐の時だ!", "Time to revenge!"));
\r
5993 while (!get_aim_dir(&dir));
\r
5995 fire_ball(GF_HELL_FIRE, dir, power, 1);
\r
5997 if (p_ptr->wizard)
\r
5999 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
\r
6004 msg_print(_("復讐する気が失せた。", "You are not a mood to revenge."));
\r
6006 HEX_REVENGE_POWER(p_ptr) = 0;
\r
6012 /* start casting */
\r
6013 if ((cast) && (add))
\r
6016 CASTING_HEX_FLAGS(p_ptr) |= 1L << (spell);
\r
6017 CASTING_HEX_NUM(p_ptr)++;
\r
6019 if (p_ptr->action != ACTION_SPELL) set_action(ACTION_SPELL);
\r
6022 /* Redraw status */
\r
6025 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
\r
6026 p_ptr->redraw |= (PR_EXTRA | PR_HP | PR_MANA);
\r
6034 * @brief 魔法処理のメインルーチン
\r
6035 * @param realm 魔法領域のID
\r
6036 * @param spell 各領域の魔法ID
\r
6037 * @param mode 求める処理
\r
6038 * @return 各領域魔法に各種テキストを求めた場合は文字列参照ポインタ、そうでない場合はNULLポインタを返す。
\r
6040 cptr do_spell(REALM_IDX realm, SPELL_IDX spell, BIT_FLAGS mode)
\r
6044 case REALM_LIFE: return do_life_spell(spell, mode);
\r
6045 case REALM_SORCERY: return do_sorcery_spell(spell, mode);
\r
6046 case REALM_NATURE: return do_nature_spell(spell, mode);
\r
6047 case REALM_CHAOS: return do_chaos_spell(spell, mode);
\r
6048 case REALM_DEATH: return do_death_spell(spell, mode);
\r
6049 case REALM_TRUMP: return do_trump_spell(spell, mode);
\r
6050 case REALM_ARCANE: return do_arcane_spell(spell, mode);
\r
6051 case REALM_CRAFT: return do_craft_spell(spell, mode);
\r
6052 case REALM_DAEMON: return do_daemon_spell(spell, mode);
\r
6053 case REALM_CRUSADE: return do_crusade_spell(spell, mode);
\r
6054 case REALM_MUSIC: return do_music_spell(spell, mode);
\r
6055 case REALM_HISSATSU: return do_hissatsu_spell(spell, mode);
\r
6056 case REALM_HEX: return do_hex_spell(spell, mode);
\r