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
19 * 魔法の効果を「キャプション:ダイス+定数値」のフォーマットで出力する / Generate dice info string such as "foo 2d10"
\r
24 * @return フォーマットに従い整形された文字列
\r
26 cptr info_string_dice(cptr str, int dice, int sides, int base)
\r
30 return format("%s%d", str, base);
\r
34 return format("%s%dd%d", str, dice, sides);
\r
36 /* Dice plus base value */
\r
38 return format("%s%dd%d%+d", str, dice, sides, base);
\r
43 * @brief 魔法によるダメージを出力する / Generate damage-dice info string such as "dam 2d10"
\r
47 * @return フォーマットに従い整形された文字列
\r
49 cptr info_damage(int dice, int sides, int base)
\r
51 return info_string_dice(_("損傷:", "dam "), dice, sides, base);
\r
55 * @brief 魔法の効果時間を出力する / Generate duration info string such as "dur 20+1d20"
\r
58 * @return フォーマットに従い整形された文字列
\r
60 cptr info_duration(int base, int sides)
\r
62 return format(_("期間:%d+1d%d", "dur %d+1d%d"), base, sides);
\r
66 * @brief 魔法の効果範囲を出力する / Generate range info string such as "range 5"
\r
68 * @return フォーマットに従い整形された文字列
\r
70 cptr info_range(POSITION range)
\r
72 return format(_("範囲:%d", "range %d"), range);
\r
76 * @brief 魔法による回復量を出力する / Generate heal info string such as "heal 2d8"
\r
80 * @return フォーマットに従い整形された文字列
\r
82 cptr info_heal(int dice, int sides, int base)
\r
84 return info_string_dice(_("回復:", "heal "), dice, sides, base);
\r
88 * @brief 魔法効果発動までの遅延ターンを出力する / Generate delay info string such as "delay 15+1d15"
\r
91 * @return フォーマットに従い整形された文字列
\r
93 cptr info_delay(int base, int sides)
\r
95 return format(_("遅延:%d+1d%d", "delay %d+1d%d"), base, sides);
\r
100 * @brief 魔法によるダメージを出力する(固定値&複数回処理) / Generate multiple-damage info string such as "dam 25 each"
\r
102 * @return フォーマットに従い整形された文字列
\r
104 cptr info_multi_damage(HIT_POINT dam)
\r
106 return format(_("損傷:各%d", "dam %d each"), dam);
\r
111 * @brief 魔法によるダメージを出力する(ダイスのみ&複数回処理) / Generate multiple-damage-dice info string such as "dam 5d2 each"
\r
113 * @param sides ダイス目
\r
114 * @return フォーマットに従い整形された文字列
\r
116 cptr info_multi_damage_dice(int dice, int sides)
\r
118 return format(_("損傷:各%dd%d", "dam %dd%d each"), dice, sides);
\r
122 * @brief 魔法による一般的な効力値を出力する(固定値) / Generate power info string such as "power 100"
\r
124 * @return フォーマットに従い整形された文字列
\r
126 cptr info_power(int power)
\r
128 return format(_("効力:%d", "power %d"), power);
\r
133 * @brief 魔法による一般的な効力値を出力する(ダイス値) / Generate power info string such as "power 100"
\r
135 * @param sides ダイス目
\r
136 * @return フォーマットに従い整形された文字列
\r
139 * Generate power info string such as "power 1d100"
\r
141 cptr info_power_dice(int dice, int sides)
\r
143 return format(_("効力:%dd%d", "power %dd%d"), dice, sides);
\r
148 * @brief 魔法の効果半径を出力する / Generate radius info string such as "rad 100"
\r
150 * @return フォーマットに従い整形された文字列
\r
152 cptr info_radius(int rad)
\r
154 return format(_("半径:%d", "rad %d"), rad);
\r
159 * @brief 魔法効果の限界重量を出力する / Generate weight info string such as "max wgt 15"
\r
160 * @param weight 最大重量
\r
161 * @return フォーマットに従い整形された文字列
\r
163 cptr info_weight(int weight)
\r
166 return format("最大重量:%d.%dkg", lbtokg1(weight), lbtokg2(weight));
\r
168 return format("max wgt %d", weight/10);
\r
174 * @brief 歌の開始を処理する / Start singing if the player is a Bard
\r
175 * @param spell 領域魔法としてのID
\r
176 * @param song 魔法効果のID
\r
179 static void start_singing(SPELL_IDX spell, MAGIC_NUM1 song)
\r
181 /* Remember the song index */
\r
182 SINGING_SONG_EFFECT(p_ptr) = (MAGIC_NUM1)song;
\r
184 /* Remember the index of the spell which activated the song */
\r
185 SINGING_SONG_ID(p_ptr) = (MAGIC_NUM2)spell;
\r
188 /* Now the player is singing */
\r
189 set_action(ACTION_SING);
\r
192 /* Recalculate bonuses */
\r
193 p_ptr->update |= (PU_BONUS);
\r
195 /* Redraw status bar */
\r
196 p_ptr->redraw |= (PR_STATUS);
\r
200 * @brief 歌の停止を処理する / Stop singing if the player is a Bard
\r
203 void stop_singing(void)
\r
205 if (p_ptr->pclass != CLASS_BARD) return;
\r
207 /* Are there interupted song? */
\r
208 if (INTERUPTING_SONG_EFFECT(p_ptr))
\r
210 /* Forget interupted song */
\r
211 INTERUPTING_SONG_EFFECT(p_ptr) = MUSIC_NONE;
\r
215 /* The player is singing? */
\r
216 if (!SINGING_SONG_EFFECT(p_ptr)) return;
\r
218 /* Hack -- if called from set_action(), avoid recursive loop */
\r
219 if (p_ptr->action == ACTION_SING) set_action(ACTION_NONE);
\r
221 /* Message text of each song or etc. */
\r
222 do_spell(REALM_MUSIC, SINGING_SONG_ID(p_ptr), SPELL_STOP);
\r
224 SINGING_SONG_EFFECT(p_ptr) = MUSIC_NONE;
\r
225 SINGING_SONG_ID(p_ptr) = 0;
\r
227 /* Recalculate bonuses */
\r
228 p_ptr->update |= (PU_BONUS);
\r
230 /* Redraw status bar */
\r
231 p_ptr->redraw |= (PR_STATUS);
\r
237 * @brief 仙術領域魔法の各処理を行う
\r
238 * @param spell 魔法ID
\r
239 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
240 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
242 static cptr do_sorcery_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
244 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
245 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
246 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
247 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
250 int plev = p_ptr->lev;
\r
255 if (name) return _("モンスター感知", "Detect Monsters");
\r
256 if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
\r
259 int rad = DETECT_RAD_DEFAULT;
\r
261 if (info) return info_radius(rad);
\r
265 detect_monsters_normal(rad);
\r
271 if (name) return _("ショート・テレポート", "Phase Door");
\r
272 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");
\r
275 POSITION range = 10;
\r
277 if (info) return info_range(range);
\r
281 teleport_player(range, 0L);
\r
287 if (name) return _("罠と扉感知", "Detect Doors and Traps");
\r
288 if (desc) return _("近くの全ての扉と罠を感知する。", "Detects traps, doors, and stairs in your vicinity.");
\r
291 int rad = DETECT_RAD_DEFAULT;
\r
293 if (info) return info_radius(rad);
\r
297 detect_traps(rad, TRUE);
\r
299 detect_stairs(rad);
\r
305 if (name) return _("ライト・エリア", "Light Area");
\r
306 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
\r
310 int sides = plev / 2;
\r
311 int rad = plev / 10 + 1;
\r
313 if (info) return info_damage(dice, sides, 0);
\r
317 lite_area(damroll(dice, sides), rad);
\r
323 if (name) return _("パニック・モンスター", "Confuse Monster");
\r
324 if (desc) return _("モンスター1体を混乱させる。抵抗されると無効。", "Attempts to confuse a monster.");
\r
327 int power = (plev * 3) / 2;
\r
329 if (info) return info_power(power);
\r
333 if (!get_aim_dir(&dir)) return NULL;
\r
335 confuse_monster(dir, power);
\r
341 if (name) return _("テレポート", "Teleport");
\r
342 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
\r
345 POSITION range = plev * 5;
\r
347 if (info) return info_range(range);
\r
351 teleport_player(range, 0L);
\r
357 if (name) return _("スリープ・モンスター", "Sleep Monster");
\r
358 if (desc) return _("モンスター1体を眠らせる。抵抗されると無効。", "Attempts to sleep a monster.");
\r
363 if (info) return info_power(power);
\r
367 if (!get_aim_dir(&dir)) return NULL;
\r
369 sleep_monster(dir, plev);
\r
375 if (name) return _("魔力充填", "Recharging");
\r
376 if (desc) return _("杖/魔法棒の充填回数を増やすか、充填中のロッドの充填時間を減らす。", "Recharges staffs, wands or rods.");
\r
379 int power = plev * 4;
\r
381 if (info) return info_power(power);
\r
385 if (!recharge(power)) return NULL;
\r
391 if (name) return _("魔法の地図", "Magic Mapping");
\r
392 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
\r
395 int rad = DETECT_RAD_MAP;
\r
397 if (info) return info_radius(rad);
\r
407 if (name) return _("鑑定", "Identify");
\r
408 if (desc) return _("アイテムを識別する。", "Identifies an item.");
\r
413 if (!ident_spell(FALSE)) return NULL;
\r
419 if (name) return _("スロウ・モンスター", "Slow Monster");
\r
420 if (desc) return _("モンスター1体を減速さる。抵抗されると無効。", "Attempts to slow a monster.");
\r
425 if (info) return info_power(power);
\r
429 if (!get_aim_dir(&dir)) return NULL;
\r
431 slow_monster(dir, plev);
\r
437 if (name) return _("周辺スリープ", "Mass Sleep");
\r
438 if (desc) return _("視界内の全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep all monsters in sight.");
\r
443 if (info) return info_power(power);
\r
447 sleep_monsters(plev);
\r
453 if (name) return _("テレポート・モンスター", "Teleport Away");
\r
454 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
\r
459 if (info) return info_power(power);
\r
463 if (!get_aim_dir(&dir)) return NULL;
\r
465 fire_beam(GF_AWAY_ALL, dir, power);
\r
471 if (name) return _("スピード", "Haste Self");
\r
472 if (desc) return _("一定時間、加速する。", "Hastes you for a while.");
\r
476 int sides = 20 + plev;
\r
478 if (info) return info_duration(base, sides);
\r
482 set_fast(randint1(sides) + base, FALSE);
\r
488 if (name) return _("真・感知", "Detection True");
\r
489 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
\r
490 "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
\r
493 int rad = DETECT_RAD_DEFAULT;
\r
495 if (info) return info_radius(rad);
\r
505 if (name) return _("真・鑑定", "Identify True");
\r
506 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
\r
511 if (!identify_fully(FALSE)) return NULL;
\r
517 if (name) return _("物体と財宝感知", "Detect items and Treasure");
\r
518 if (desc) return _("近くの全てのアイテムと財宝を感知する。", "Detects all treasures and items in your vicinity.");
\r
521 int rad = DETECT_RAD_DEFAULT;
\r
523 if (info) return info_radius(rad);
\r
527 detect_objects_normal(rad);
\r
528 detect_treasure(rad);
\r
529 detect_objects_gold(rad);
\r
535 if (name) return _("チャーム・モンスター", "Charm Monster");
\r
536 if (desc) return _("モンスター1体を魅了する。抵抗されると無効。", "Attempts to charm a monster.");
\r
541 if (info) return info_power(power);
\r
545 if (!get_aim_dir(&dir)) return NULL;
\r
547 charm_monster(dir, power);
\r
553 if (name) return _("精神感知", "Sense Minds");
\r
554 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
\r
560 if (info) return info_duration(base, sides);
\r
564 set_tim_esp(randint1(sides) + base, FALSE);
\r
570 if (name) return _("街移動", "Teleport to town");
\r
571 if (desc) return _("街へ移動する。地上にいるときしか使えない。", "Teleport to a town which you choose in a moment. Can only be used outdoors.");
\r
576 if (!tele_town()) return NULL;
\r
582 if (name) return _("自己分析", "Self Knowledge");
\r
583 if (desc) return _("現在の自分の状態を完全に知る。",
\r
584 "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");
\r
595 if (name) return _("テレポート・レベル", "Teleport Level");
\r
596 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");
\r
601 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
\r
608 if (name) return _("帰還の呪文", "Word of Recall");
\r
609 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
\r
610 "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
\r
616 if (info) return info_delay(base, sides);
\r
620 if (!word_of_recall()) return NULL;
\r
626 if (name) return _("次元の扉", "Dimension Door");
\r
627 if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleport to given location.");
\r
630 POSITION range = plev / 2 + 10;
\r
632 if (info) return info_range(range);
\r
636 msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));
\r
637 if (!dimension_door()) return NULL;
\r
643 if (name) return _("調査", "Probing");
\r
644 if (desc) return _("モンスターの属性、残り体力、最大体力、スピード、正体を知る。",
\r
645 "Proves all monsters' alignment, HP, speed and their true character.");
\r
656 if (name) return _("爆発のルーン", "Explosive Rune");
\r
657 if (desc) return _("自分のいる床の上に、モンスターが通ると爆発してダメージを与えるルーンを描く。",
\r
658 "Sets a glyph under you. The glyph will explode when a monster moves on it.");
\r
665 if (info) return info_damage(dice, sides, base);
\r
675 if (name) return _("念動力", "Telekinesis");
\r
676 if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");
\r
679 int weight = plev * 15;
\r
681 if (info) return info_weight(weight);
\r
685 if (!get_aim_dir(&dir)) return NULL;
\r
687 fetch(dir, weight, FALSE);
\r
693 if (name) return _("千里眼", "Clairvoyance");
\r
694 if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。さらに、一定時間テレパシー能力を得る。",
\r
695 "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");
\r
701 if (info) return info_duration(base, sides);
\r
705 chg_virtue(V_KNOWLEDGE, 1);
\r
706 chg_virtue(V_ENLIGHTEN, 1);
\r
710 if (!p_ptr->telepathy)
\r
712 set_tim_esp(randint1(sides) + base, FALSE);
\r
719 if (name) return _("魅了の視線", "Charm monsters");
\r
720 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
\r
723 int power = plev * 2;
\r
725 if (info) return info_power(power);
\r
729 charm_monsters(power);
\r
735 if (name) return _("錬金術", "Alchemy");
\r
736 if (desc) return _("アイテム1つをお金に変える。", "Turns an item into 1/3 of its value in gold.");
\r
741 if (!alchemy()) return NULL;
\r
747 if (name) return _("怪物追放", "Banishment");
\r
748 if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");
\r
751 int power = plev * 4;
\r
753 if (info) return info_power(power);
\r
757 banish_monsters(power);
\r
763 if (name) return _("無傷の球", "Globe of Invulnerability");
\r
764 if (desc) return _("一定時間、ダメージを受けなくなるバリアを張る。切れた瞬間に少しターンを消費するので注意。",
\r
765 "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks or duration time is exceeded.");
\r
770 if (info) return info_duration(base, base);
\r
774 set_invuln(randint1(base) + base, FALSE);
\r
785 * @brief 自然領域魔法の各処理を行う
\r
786 * @param spell 魔法ID
\r
787 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
788 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
790 static cptr do_nature_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
792 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
793 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
794 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
795 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
797 static const char s_dam[] = _("損傷:", "dam ");
\r
798 static const char s_rng[] = _("射程", "rng ");
\r
801 int plev = p_ptr->lev;
\r
806 if (name) return _("モンスター感知", "Detect Creatures");
\r
807 if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
\r
810 int rad = DETECT_RAD_DEFAULT;
\r
812 if (info) return info_radius(rad);
\r
816 detect_monsters_normal(rad);
\r
822 if (name) return _("稲妻", "Lightning");
\r
823 if (desc) return _("電撃の短いビームを放つ。", "Fires a short beam of lightning.");
\r
826 int dice = 3 + (plev - 1) / 5;
\r
828 POSITION range = plev / 6 + 2;
\r
830 if (info) return format("%s%dd%d %s%d", s_dam, dice, sides, s_rng, range);
\r
834 project_length = range;
\r
836 if (!get_aim_dir(&dir)) return NULL;
\r
838 fire_beam(GF_ELEC, dir, damroll(dice, sides));
\r
844 if (name) return _("罠と扉感知", "Detect Doors and Traps");
\r
845 if (desc) return _("近くの全ての罠と扉を感知する。", "Detects traps, doors, and stairs in your vicinity.");
\r
848 int rad = DETECT_RAD_DEFAULT;
\r
850 if (info) return info_radius(rad);
\r
854 detect_traps(rad, TRUE);
\r
856 detect_stairs(rad);
\r
862 if (name) return _("食糧生成", "Produce Food");
\r
863 if (desc) return _("食料を一つ作り出す。", "Produces a Ration of Food.");
\r
868 object_type forge, *q_ptr = &forge;
\r
869 msg_print(_("食料を生成した。", "A food ration is produced."));
\r
871 /* Create the food ration */
\r
872 object_prep(q_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION));
\r
874 /* Drop the object from heaven */
\r
875 drop_near(q_ptr, -1, p_ptr->y, p_ptr->x);
\r
881 if (name) return _("日の光", "Daylight");
\r
882 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
\r
886 int sides = plev / 2;
\r
887 int rad = (plev / 10) + 1;
\r
889 if (info) return info_damage(dice, sides, 0);
\r
893 lite_area(damroll(dice, sides), rad);
\r
895 if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)
\r
897 msg_print(_("日の光があなたの肉体を焦がした!", "The daylight scorches your flesh!"));
\r
898 take_hit(DAMAGE_NOESCAPE, damroll(2, 2), _("日の光", "daylight"), -1);
\r
905 if (name) return _("動物習し", "Animal Taming");
\r
906 if (desc) return _("動物1体を魅了する。抵抗されると無効。", "Attempts to charm an animal.");
\r
911 if (info) return info_power(power);
\r
915 if (!get_aim_dir(&dir)) return NULL;
\r
917 charm_animal(dir, power);
\r
923 if (name) return _("環境への耐性", "Resist Environment");
\r
924 if (desc) return _("一定時間、冷気、炎、電撃に対する耐性を得る。装備による耐性に累積する。",
\r
925 "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");
\r
930 if (info) return info_duration(base, base);
\r
934 set_oppose_cold(randint1(base) + base, FALSE);
\r
935 set_oppose_fire(randint1(base) + base, FALSE);
\r
936 set_oppose_elec(randint1(base) + base, FALSE);
\r
942 if (name) return _("傷と毒治療", "Cure Wounds & Poison");
\r
943 if (desc) return _("怪我を全快させ、毒を体から完全に取り除き、体力を少し回復させる。", "Heals all cut and poison status. Heals HP a little.");
\r
949 if (info) return info_heal(dice, sides, 0);
\r
953 hp_player(damroll(dice, sides));
\r
961 if (name) return _("岩石溶解", "Stone to Mud");
\r
962 if (desc) return _("壁を溶かして床にする。", "Turns one rock square to mud.");
\r
969 if (info) return info_damage(dice, sides, base);
\r
973 if (!get_aim_dir(&dir)) return NULL;
\r
975 wall_to_mud(dir, 20 + randint1(30));
\r
981 if (name) return _("アイス・ボルト", "Frost Bolt");
\r
982 if (desc) return _("冷気のボルトもしくはビームを放つ。", "Fires a bolt or beam of cold.");
\r
985 int dice = 3 + (plev - 5) / 4;
\r
988 if (info) return info_damage(dice, sides, 0);
\r
992 if (!get_aim_dir(&dir)) return NULL;
\r
993 fire_bolt_or_beam(beam_chance() - 10, GF_COLD, dir, damroll(dice, sides));
\r
999 if (name) return _("自然の覚醒", "Nature Awareness");
\r
1000 if (desc) return _("周辺の地形を感知し、近くの罠、扉、階段、全てのモンスターを感知する。",
\r
1001 "Maps nearby area. Detects all monsters, traps, doors and stairs.");
\r
1004 int rad1 = DETECT_RAD_MAP;
\r
1005 int rad2 = DETECT_RAD_DEFAULT;
\r
1007 if (info) return info_radius(MAX(rad1, rad2));
\r
1012 detect_traps(rad2, TRUE);
\r
1013 detect_doors(rad2);
\r
1014 detect_stairs(rad2);
\r
1015 detect_monsters_normal(rad2);
\r
1021 if (name) return _("ファイア・ボルト", "Fire Bolt");
\r
1022 if (desc) return _("火炎のボルトもしくはビームを放つ。", "Fires a bolt or beam of fire.");
\r
1025 int dice = 5 + (plev - 5) / 4;
\r
1028 if (info) return info_damage(dice, sides, 0);
\r
1032 if (!get_aim_dir(&dir)) return NULL;
\r
1033 fire_bolt_or_beam(beam_chance() - 10, GF_FIRE, dir, damroll(dice, sides));
\r
1039 if (name) return _("太陽光線", "Ray of Sunlight");
\r
1040 if (desc) return _("光線を放つ。光りを嫌うモンスターに効果がある。", "Fires a beam of light which damages to light-sensitive monsters.");
\r
1046 if (info) return info_damage(dice, sides, 0);
\r
1050 if (!get_aim_dir(&dir)) return NULL;
\r
1051 msg_print(_("太陽光線が現れた。", "A line of sunlight appears."));
\r
1052 lite_line(dir, damroll(6, 8));
\r
1058 if (name) return _("足かせ", "Entangle");
\r
1059 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
\r
1064 if (info) return info_power(power);
\r
1068 slow_monsters(plev);
\r
1074 if (name) return _("動物召喚", "Summon Animal");
\r
1075 if (desc) return _("動物を1体召喚する。", "Summons an animal.");
\r
1080 if (!(summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_ANIMAL_RANGER, (PM_ALLOW_GROUP | PM_FORCE_PET))))
\r
1082 msg_print(_("動物は現れなかった。", "No animals arrive."));
\r
1090 if (name) return _("薬草治療", "Herbal Healing");
\r
1091 if (desc) return _("体力を大幅に回復させ、負傷、朦朧状態、毒から全快する。", "Heals HP greatly. And heals cut, stun and poison completely.");
\r
1096 if (info) return info_heal(0, 0, heal);
\r
1109 if (name) return _("階段生成", "Stair Building");
\r
1110 if (desc) return _("自分のいる位置に階段を作る。", "Creates a stair which goes down or up.");
\r
1121 if (name) return _("肌石化", "Stone Skin");
\r
1122 if (desc) return _("一定時間、ACを上昇させる。", "Gives bonus to AC for a while.");
\r
1128 if (info) return info_duration(base, sides);
\r
1132 set_shield(randint1(sides) + base, FALSE);
\r
1138 if (name) return _("真・耐性", "Resistance True");
\r
1139 if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
\r
1140 "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
1145 if (info) return info_duration(base, base);
\r
1149 set_oppose_acid(randint1(base) + base, FALSE);
\r
1150 set_oppose_elec(randint1(base) + base, FALSE);
\r
1151 set_oppose_fire(randint1(base) + base, FALSE);
\r
1152 set_oppose_cold(randint1(base) + base, FALSE);
\r
1153 set_oppose_pois(randint1(base) + base, FALSE);
\r
1159 if (name) return _("森林創造", "Forest Creation");
\r
1160 if (desc) return _("周囲に木を作り出す。", "Creates trees in all adjacent squares.");
\r
1171 if (name) return _("動物友和", "Animal Friendship");
\r
1172 if (desc) return _("視界内の全ての動物を魅了する。抵抗されると無効。", "Attempts to charm all animals in sight.");
\r
1175 int power = plev * 2;
\r
1177 if (info) return info_power(power);
\r
1181 charm_animals(power);
\r
1187 if (name) return _("試金石", "Stone Tell");
\r
1188 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
\r
1193 if (!identify_fully(FALSE)) return NULL;
\r
1199 if (name) return _("石の壁", "Wall of Stone");
\r
1200 if (desc) return _("自分の周囲に花崗岩の壁を作る。", "Creates granite walls in all adjacent squares.");
\r
1211 if (name) return _("腐食防止", "Protect from Corrosion");
\r
1212 if (desc) return _("アイテムを酸で傷つかないよう加工する。", "Makes an equipment acid-proof.");
\r
1217 if (!rustproof()) return NULL;
\r
1223 if (name) return _("地震", "Earthquake");
\r
1224 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
\r
1225 "Shakes dungeon structure, and results in random swapping of floors and walls.");
\r
1230 if (info) return info_radius(rad);
\r
1234 earthquake(p_ptr->y, p_ptr->x, rad);
\r
1240 if (name) return _("カマイタチ", "Cyclone");
\r
1241 if (desc) return _("全方向に向かって攻撃する。", "Attacks all adjacent monsters.");
\r
1248 monster_type *m_ptr;
\r
1250 for (dir = 0; dir < 8; dir++)
\r
1252 y = p_ptr->y + ddy_ddd[dir];
\r
1253 x = p_ptr->x + ddx_ddd[dir];
\r
1254 c_ptr = &cave[y][x];
\r
1256 /* Get the monster */
\r
1257 m_ptr = &m_list[c_ptr->m_idx];
\r
1259 /* Hack -- attack monsters */
\r
1260 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
\r
1261 py_attack(y, x, 0);
\r
1268 if (name) return _("ブリザード", "Blizzard");
\r
1269 if (desc) return _("巨大な冷気の球を放つ。", "Fires a huge ball of cold.");
\r
1272 HIT_POINT dam = 70 + plev * 3 / 2;
\r
1273 int rad = plev / 12 + 1;
\r
1275 if (info) return info_damage(0, 0, dam);
\r
1279 if (!get_aim_dir(&dir)) return NULL;
\r
1281 fire_ball(GF_COLD, dir, dam, rad);
\r
1287 if (name) return _("稲妻嵐", "Lightning Storm");
\r
1288 if (desc) return _("巨大な電撃の球を放つ。", "Fires a huge electric ball.");
\r
1291 HIT_POINT dam = 90 + plev * 3 / 2;
\r
1292 int rad = plev / 12 + 1;
\r
1294 if (info) return info_damage(0, 0, dam);
\r
1298 if (!get_aim_dir(&dir)) return NULL;
\r
1299 fire_ball(GF_ELEC, dir, dam, rad);
\r
1306 if (name) return _("渦潮", "Whirlpool");
\r
1307 if (desc) return _("巨大な水の球を放つ。", "Fires a huge ball of water.");
\r
1310 HIT_POINT dam = 100 + plev * 3 / 2;
\r
1311 int rad = plev / 12 + 1;
\r
1313 if (info) return info_damage(0, 0, dam);
\r
1317 if (!get_aim_dir(&dir)) return NULL;
\r
1318 fire_ball(GF_WATER, dir, dam, rad);
\r
1324 if (name) return _("陽光召喚", "Call Sunlight");
\r
1325 if (desc) return _("自分を中心とした光の球を発生させる。さらに、その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。",
\r
1326 "Generates ball of light centered on you. Maps and lights whole dungeon level. Knows all objects location.");
\r
1329 HIT_POINT dam = 150;
\r
1332 if (info) return info_damage(0, 0, dam/2);
\r
1336 fire_ball(GF_LITE, 0, dam, rad);
\r
1337 chg_virtue(V_KNOWLEDGE, 1);
\r
1338 chg_virtue(V_ENLIGHTEN, 1);
\r
1341 if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)
\r
1343 msg_print(_("日光があなたの肉体を焦がした!", "The sunlight scorches your flesh!"));
\r
1344 take_hit(DAMAGE_NOESCAPE, 50, _("日光", "sunlight"), -1);
\r
1351 if (name) return _("精霊の刃", "Elemental Branding");
\r
1352 if (desc) return _("武器に炎か冷気の属性をつける。", "Makes current weapon fire or frost branded.");
\r
1357 brand_weapon(randint0(2));
\r
1363 if (name) return _("自然の脅威", "Nature's Wrath");
\r
1364 if (desc) return _("近くの全てのモンスターにダメージを与え、地震を起こし、自分を中心とした分解の球を発生させる。",
\r
1365 "Damages all monsters in sight. Makes quake. Generates disintegration ball centered on you.");
\r
1368 int d_dam = 4 * plev;
\r
1369 int b_dam = (100 + plev) * 2;
\r
1370 int b_rad = 1 + plev / 12;
\r
1371 int q_rad = 20 + plev / 2;
\r
1373 if (info) return format("%s%d+%d", s_dam, d_dam, b_dam/2);
\r
1377 dispel_monsters(d_dam);
\r
1378 earthquake(p_ptr->y, p_ptr->x, q_rad);
\r
1379 project(0, b_rad, p_ptr->y, p_ptr->x, b_dam, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM, -1);
\r
1391 * @brief 暗黒領域魔法の各処理を行う
\r
1392 * @param spell 魔法ID
\r
1393 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
1394 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
1396 static cptr do_death_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
1398 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
1399 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
1400 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
1401 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
1403 static const char s_dam[] = _("損傷:", "dam ");
\r
1404 static const char s_random[] = _("ランダム", "random");
\r
1407 int plev = p_ptr->lev;
\r
1412 if (name) return _("無生命感知", "Detect Unlife");
\r
1413 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
\r
1416 int rad = DETECT_RAD_DEFAULT;
\r
1418 if (info) return info_radius(rad);
\r
1422 detect_monsters_nonliving(rad);
\r
1428 if (name) return _("呪殺弾", "Malediction");
\r
1429 if (desc) return _("ごく小さな邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",
\r
1430 "Fires a tiny ball of evil power which hurts good monsters greatly.");
\r
1433 int dice = 3 + (plev - 1) / 5;
\r
1437 if (info) return info_damage(dice, sides, 0);
\r
1441 if (!get_aim_dir(&dir)) return NULL;
\r
1444 * A radius-0 ball may (1) be aimed at
\r
1445 * objects etc., and will affect them;
\r
1446 * (2) may be aimed at ANY visible
\r
1447 * monster, unlike a 'bolt' which must
\r
1448 * travel to the monster.
\r
1451 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides), rad);
\r
1455 /* Special effect first */
\r
1456 int effect = randint1(1000);
\r
1458 if (effect == 666)
\r
1459 fire_ball_hide(GF_DEATH_RAY, dir, plev * 200, 0);
\r
1460 else if (effect < 500)
\r
1461 fire_ball_hide(GF_TURN_ALL, dir, plev, 0);
\r
1462 else if (effect < 800)
\r
1463 fire_ball_hide(GF_OLD_CONF, dir, plev, 0);
\r
1465 fire_ball_hide(GF_STUN, dir, plev, 0);
\r
1472 if (name) return _("邪悪感知", "Detect Evil");
\r
1473 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
\r
1476 int rad = DETECT_RAD_DEFAULT;
\r
1478 if (info) return info_radius(rad);
\r
1482 detect_monsters_evil(rad);
\r
1488 if (name) return _("悪臭雲", "Stinking Cloud");
\r
1489 if (desc) return _("毒の球を放つ。", "Fires a ball of poison.");
\r
1492 HIT_POINT dam = 10 + plev / 2;
\r
1495 if (info) return info_damage(0, 0, dam);
\r
1499 if (!get_aim_dir(&dir)) return NULL;
\r
1501 fire_ball(GF_POIS, dir, dam, rad);
\r
1507 if (name) return _("黒い眠り", "Black Sleep");
\r
1508 if (desc) return _("1体のモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep a monster.");
\r
1513 if (info) return info_power(power);
\r
1517 if (!get_aim_dir(&dir)) return NULL;
\r
1519 sleep_monster(dir, plev);
\r
1525 if (name) return _("耐毒", "Resist Poison");
\r
1526 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",
\r
1527 "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");
\r
1532 if (info) return info_duration(base, base);
\r
1536 set_oppose_pois(randint1(base) + base, FALSE);
\r
1542 if (name) return _("恐慌", "Horrify");
\r
1543 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
\r
1548 if (info) return info_power(power);
\r
1552 if (!get_aim_dir(&dir)) return NULL;
\r
1554 fear_monster(dir, power);
\r
1555 stun_monster(dir, power);
\r
1561 if (name) return _("アンデッド従属", "Enslave Undead");
\r
1562 if (desc) return _("アンデッド1体を魅了する。抵抗されると無効。", "Attempts to charm an undead monster.");
\r
1567 if (info) return info_power(power);
\r
1571 if (!get_aim_dir(&dir)) return NULL;
\r
1573 control_one_undead(dir, power);
\r
1579 if (name) return _("エントロピーの球", "Orb of Entropy");
\r
1580 if (desc) return _("生命のある者のHPと最大HP双方にダメージを与える効果のある球を放つ。", "Fires a ball which damages to both HP and MaxHP of living monsters.");
\r
1585 int rad = (plev < 30) ? 2 : 3;
\r
1588 if (p_ptr->pclass == CLASS_MAGE ||
\r
1589 p_ptr->pclass == CLASS_HIGH_MAGE ||
\r
1590 p_ptr->pclass == CLASS_SORCERER)
\r
1591 base = plev + plev / 2;
\r
1593 base = plev + plev / 4;
\r
1596 if (info) return info_damage(dice, sides, base);
\r
1600 if (!get_aim_dir(&dir)) return NULL;
\r
1602 fire_ball(GF_HYPODYNAMIA, dir, damroll(dice, sides) + base, rad);
\r
1608 if (name) return _("地獄の矢", "Nether Bolt");
\r
1609 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
\r
1612 int dice = 8 + (plev - 5) / 4;
\r
1615 if (info) return info_damage(dice, sides, 0);
\r
1619 if (!get_aim_dir(&dir)) return NULL;
\r
1621 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
\r
1627 if (name) return _("殺戮雲", "Cloud kill");
\r
1628 if (desc) return _("自分を中心とした毒の球を発生させる。", "Generate a ball of poison centered on you.");
\r
1631 HIT_POINT dam = (30 + plev) * 2;
\r
1632 int rad = plev / 10 + 2;
\r
1634 if (info) return info_damage(0, 0, dam/2);
\r
1638 project(0, rad, p_ptr->y, p_ptr->x, dam, GF_POIS, PROJECT_KILL | PROJECT_ITEM, -1);
\r
1644 if (name) return _("モンスター消滅", "Genocide One");
\r
1645 if (desc) return _("モンスター1体を消し去る。経験値やアイテムは手に入らない。抵抗されると無効。", "Attempts to vanish a monster.");
\r
1648 int power = plev + 50;
\r
1650 if (info) return info_power(power);
\r
1654 if (!get_aim_dir(&dir)) return NULL;
\r
1656 fire_ball_hide(GF_GENOCIDE, dir, power, 0);
\r
1662 if (name) return _("毒の刃", "Poison Branding");
\r
1663 if (desc) return _("武器に毒の属性をつける。", "Makes current weapon poison branded.");
\r
1674 if (name) return _("吸血の矢", "Vampiric Bolt");
\r
1675 if (desc) return _("ボルトによりモンスター1体から生命力を吸いとる。吸いとった生命力によって満腹度が上がる。",
\r
1676 "Absorbs some HP from a monster and gives them to you by bolt. You will also gain nutritional sustenance from this.");
\r
1680 int sides = plev * 2;
\r
1681 int base = plev * 2;
\r
1683 if (info) return info_damage(dice, sides, base);
\r
1687 HIT_POINT dam = base + damroll(dice, sides);
\r
1689 if (!get_aim_dir(&dir)) return NULL;
\r
1691 if (hypodynamic_bolt(dir, dam))
\r
1693 chg_virtue(V_SACRIFICE, -1);
\r
1694 chg_virtue(V_VITALITY, -1);
\r
1699 * Gain nutritional sustenance:
\r
1702 * A Food ration gives 5000
\r
1703 * food points (by contrast)
\r
1704 * Don't ever get more than
\r
1705 * "Full" this way But if we
\r
1706 * ARE Gorged, it won't cure
\r
1709 dam = p_ptr->food + MIN(5000, 100 * dam);
\r
1711 /* Not gorged already */
\r
1712 if (p_ptr->food < PY_FOOD_MAX)
\r
1713 set_food(dam >= PY_FOOD_MAX ? PY_FOOD_MAX - 1 : dam);
\r
1720 if (name) return _("反魂の術", "Animate dead");
\r
1721 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
\r
1726 animate_dead(0, p_ptr->y, p_ptr->x);
\r
1732 if (name) return _("抹殺", "Genocide");
\r
1733 if (desc) return _("指定した文字のモンスターを現在の階から消し去る。抵抗されると無効。",
\r
1734 "Eliminates an entire class of monster, exhausting you. Powerful or unique monsters may resist.");
\r
1737 int power = plev+50;
\r
1739 if (info) return info_power(power);
\r
1743 symbol_genocide(power, TRUE);
\r
1749 if (name) return _("狂戦士化", "Berserk");
\r
1750 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");
\r
1755 if (info) return info_duration(base, base);
\r
1759 set_shero(randint1(base) + base, FALSE);
\r
1767 if (name) return _("悪霊召喚", "Invoke Spirits");
\r
1768 if (desc) return _("ランダムで様々な効果が起こる。", "Causes random effects.");
\r
1771 if (info) return s_random;
\r
1775 if (!get_aim_dir(&dir)) return NULL;
\r
1777 cast_invoke_spirits(dir);
\r
1783 if (name) return _("暗黒の矢", "Dark Bolt");
\r
1784 if (desc) return _("暗黒のボルトもしくはビームを放つ。", "Fires a bolt or beam of darkness.");
\r
1787 int dice = 4 + (plev - 5) / 4;
\r
1790 if (info) return info_damage(dice, sides, 0);
\r
1794 if (!get_aim_dir(&dir)) return NULL;
\r
1796 fire_bolt_or_beam(beam_chance(), GF_DARK, dir, damroll(dice, sides));
\r
1802 if (name) return _("狂乱戦士", "Battle Frenzy");
\r
1803 if (desc) return _("狂戦士化し、恐怖を除去し、加速する。",
\r
1804 "Gives another bonus to hit and HP, immunity to fear for a while. Hastes you. But decreases AC.");
\r
1808 int sp_base = plev / 2;
\r
1809 int sp_sides = 20 + plev / 2;
\r
1811 if (info) return info_duration(b_base, b_base);
\r
1815 set_shero(randint1(25) + 25, FALSE);
\r
1818 set_fast(randint1(sp_sides) + sp_base, FALSE);
\r
1824 if (name) return _("吸血の刃", "Vampiric Branding");
\r
1825 if (desc) return _("武器に吸血の属性をつける。", "Makes current weapon Vampiric.");
\r
1836 if (name) return _("吸血の連矢", "Vampiric Bolts");
\r
1837 if (desc) return _("3連射のボルトによりモンスター1体から生命力を吸いとる。吸いとった生命力によって体力が回復する。",
\r
1838 "Fires 3 bolts. Each of the bolts absorbs some HP from a monster and gives them to you.");
\r
1840 HIT_POINT dam = 100;
\r
1842 if (info) return format("%s3*%d", s_dam, dam);
\r
1848 if (!get_aim_dir(&dir)) return NULL;
\r
1850 chg_virtue(V_SACRIFICE, -1);
\r
1851 chg_virtue(V_VITALITY, -1);
\r
1853 for (i = 0; i < 3; i++)
\r
1855 if (hypodynamic_bolt(dir, dam))
\r
1863 if (name) return _("死の言魂", "Nether Wave");
\r
1864 if (desc) return _("視界内の生命のあるモンスターにダメージを与える。", "Damages all living monsters in sight.");
\r
1867 int sides = plev * 3;
\r
1869 if (info) return info_damage(1, sides, 0);
\r
1873 dispel_living(randint1(sides));
\r
1879 if (name) return _("暗黒の嵐", "Darkness Storm");
\r
1880 if (desc) return _("巨大な暗黒の球を放つ。", "Fires a huge ball of darkness.");
\r
1883 HIT_POINT dam = 100 + plev * 2;
\r
1886 if (info) return info_damage(0, 0, dam);
\r
1890 if (!get_aim_dir(&dir)) return NULL;
\r
1892 fire_ball(GF_DARK, dir, dam, rad);
\r
1898 if (name) return _("死の光線", "Death Ray");
\r
1899 if (desc) return _("死の光線を放つ。", "Fires a beam of death.");
\r
1904 if (!get_aim_dir(&dir)) return NULL;
\r
1906 death_ray(dir, plev);
\r
1912 if (name) return _("死者召喚", "Raise the Dead");
\r
1913 if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");
\r
1919 bool pet = one_in_(3);
\r
1922 type = (plev > 47 ? SUMMON_HI_UNDEAD : SUMMON_UNDEAD);
\r
1924 if (!pet || (pet && (plev > 24) && one_in_(3)))
\r
1925 flg |= PM_ALLOW_GROUP;
\r
1927 if (pet) flg |= PM_FORCE_PET;
\r
1928 else flg |= (PM_ALLOW_UNIQUE | PM_NO_PET);
\r
1930 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, type, flg))
\r
1932 msg_print(_("冷たい風があなたの周りに吹き始めた。それは腐敗臭を運んでいる...",
\r
1933 "Cold winds begin to blow around you, carrying with them the stench of decay..."));
\r
1938 msg_print(_("古えの死せる者共があなたに仕えるため土から甦った!",
\r
1939 "Ancient, long-dead forms arise from the ground to serve you!"));
\r
1943 msg_print(_("死者が甦った。眠りを妨げるあなたを罰するために!",
\r
1944 "'The dead arise... to punish you for disturbing them!'"));
\r
1947 chg_virtue(V_UNLIFE, 1);
\r
1954 if (name) return _("死者の秘伝", "Esoteria");
\r
1955 if (desc) return _("アイテムを1つ識別する。レベルが高いとアイテムの能力を完全に知ることができる。",
\r
1956 "Identifies an item. Or *identifies* an item at higher level.");
\r
1961 if (randint1(50) > plev)
\r
1963 if (!ident_spell(FALSE)) return NULL;
\r
1967 if (!identify_fully(FALSE)) return NULL;
\r
1974 if (name) return _("吸血鬼変化", "Polymorph Vampire");
\r
1975 if (desc) return _("一定時間、吸血鬼に変化する。変化している間は本来の種族の能力を失い、代わりに吸血鬼としての能力を得る。",
\r
1976 "Mimic a vampire for a while. Loses abilities of original race and gets abilities as a vampire.");
\r
1979 int base = 10 + plev / 2;
\r
1981 if (info) return info_duration(base, base);
\r
1985 set_mimic(base + randint1(base), MIMIC_VAMPIRE, FALSE);
\r
1991 if (name) return _("経験値復活", "Restore Life");
\r
1992 if (desc) return _("失った経験値を回復する。", "Restore lost experience.");
\r
2003 if (name) return _("周辺抹殺", "Mass Genocide");
\r
2004 if (desc) return _("自分の周囲にいるモンスターを現在の階から消し去る。抵抗されると無効。",
\r
2005 "Eliminates all nearby monsters, exhausting you. Powerful or unique monsters may be able to resist.");
\r
2008 int power = plev + 50;
\r
2010 if (info) return info_power(power);
\r
2014 mass_genocide(power, TRUE);
\r
2020 if (name) return _("地獄の劫火", "Hellfire");
\r
2021 if (desc) return _("邪悪な力を持つ宝珠を放つ。善良なモンスターには大きなダメージを与える。",
\r
2022 "Fires a powerful ball of evil power. Hurts good monsters greatly.");
\r
2025 HIT_POINT dam = 666;
\r
2028 if (info) return info_damage(0, 0, dam);
\r
2032 if (!get_aim_dir(&dir)) return NULL;
\r
2034 fire_ball(GF_HELL_FIRE, dir, dam, rad);
\r
2035 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("地獄の劫火の呪文を唱えた疲労", "the strain of casting Hellfire"), -1);
\r
2041 if (name) return _("幽体化", "Wraithform");
\r
2042 if (desc) return _("一定時間、壁を通り抜けることができ受けるダメージが軽減される幽体の状態に変身する。",
\r
2043 "Becomes wraith form which gives ability to pass walls and makes all damages half.");
\r
2046 int base = plev / 2;
\r
2048 if (info) return info_duration(base, base);
\r
2052 set_wraith_form(randint1(base) + base, FALSE);
\r
2063 * @brief トランプ領域魔法の各処理を行う
\r
2064 * @param spell 魔法ID
\r
2065 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
2066 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
2068 static cptr do_trump_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
2070 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
2071 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
2072 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
2073 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
2074 bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
\r
2075 static const char s_random[] = _("ランダム", "random");
\r
2078 int plev = p_ptr->lev;
\r
2083 if (name) return _("ショート・テレポート", "Phase Door");
\r
2084 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");
\r
2087 POSITION range = 10;
\r
2089 if (info) return info_range(range);
\r
2093 teleport_player(range, 0L);
\r
2099 if (name) return _("蜘蛛のカード", "Trump Spiders");
\r
2100 if (desc) return _("蜘蛛を召喚する。", "Summons spiders.");
\r
2105 msg_print(_("あなたは蜘蛛のカードに集中する...", "You concentrate on the trump of an spider..."));
\r
2106 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_SPIDER, PM_ALLOW_GROUP))
\r
2110 msg_print(_("召喚された蜘蛛は怒っている!", "The summoned spiders get angry!"));
\r
2118 if (name) return _("シャッフル", "Shuffle");
\r
2119 if (desc) return _("カードの占いをする。", "Causes random effects.");
\r
2122 if (info) return s_random;
\r
2132 if (name) return _("フロア・リセット", "Reset Recall");
\r
2133 if (desc) return _("最深階を変更する。", "Resets the 'deepest' level for recall spell.");
\r
2138 if (!reset_recall()) return NULL;
\r
2144 if (name) return _("テレポート", "Teleport");
\r
2145 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
\r
2148 POSITION range = plev * 4;
\r
2150 if (info) return info_range(range);
\r
2154 teleport_player(range, 0L);
\r
2160 if (name) return _("感知のカード", "Trump Spying");
\r
2161 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
\r
2167 if (info) return info_duration(base, sides);
\r
2171 set_tim_esp(randint1(sides) + base, FALSE);
\r
2177 if (name) return _("テレポート・モンスター", "Teleport Away");
\r
2178 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
\r
2183 if (info) return info_power(power);
\r
2187 if (!get_aim_dir(&dir)) return NULL;
\r
2189 fire_beam(GF_AWAY_ALL, dir, power);
\r
2195 if (name) return _("動物のカード", "Trump Animals");
\r
2196 if (desc) return _("1体の動物を召喚する。", "Summons an animal.");
\r
2201 int type = (!fail ? SUMMON_ANIMAL_RANGER : SUMMON_ANIMAL);
\r
2202 msg_print(_("あなたは動物のカードに集中する...", "You concentrate on the trump of an animal..."));
\r
2203 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, type, 0L))
\r
2207 msg_print(_("召喚された動物は怒っている!", "The summoned animal gets angry!"));
\r
2215 if (name) return _("移動のカード", "Trump Reach");
\r
2216 if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");
\r
2219 int weight = plev * 15;
\r
2221 if (info) return info_weight(weight);
\r
2225 if (!get_aim_dir(&dir)) return NULL;
\r
2227 fetch(dir, weight, FALSE);
\r
2233 if (name) return _("カミカゼのカード", "Trump Kamikaze");
\r
2234 if (desc) return _("複数の爆発するモンスターを召喚する。", "Summons monsters which explode by itself.");
\r
2244 if (!target_set(TARGET_KILL)) return NULL;
\r
2250 /* Summons near player when failed */
\r
2255 if (p_ptr->pclass == CLASS_BEASTMASTER)
\r
2256 type = SUMMON_KAMIKAZE_LIVING;
\r
2258 type = SUMMON_KAMIKAZE;
\r
2260 msg_print(_("あなたはカミカゼのカードに集中する...", "You concentrate on several trumps at once..."));
\r
2261 if (trump_summoning(2 + randint0(plev / 7), !fail, y, x, 0, type, 0L))
\r
2265 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
\r
2273 if (name) return _("幻霊召喚", "Phantasmal Servant");
\r
2274 if (desc) return _("1体の幽霊を召喚する。", "Summons a ghost.");
\r
2277 /* Phantasmal Servant is not summoned as enemy when failed */
\r
2280 int summon_lev = plev * 2 / 3 + randint1(plev / 2);
\r
2282 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, (summon_lev * 3 / 2), SUMMON_PHANTOM, 0L))
\r
2284 msg_print(_("御用でございますか、御主人様?", "'Your wish, master?'"));
\r
2291 if (name) return _("スピード・モンスター", "Haste Monster");
\r
2292 if (desc) return _("モンスター1体を加速させる。", "Hastes a monster.");
\r
2299 /* Temporary enable target_pet option */
\r
2300 bool old_target_pet = target_pet;
\r
2301 target_pet = TRUE;
\r
2303 result = get_aim_dir(&dir);
\r
2305 /* Restore target_pet option */
\r
2306 target_pet = old_target_pet;
\r
2308 if (!result) return NULL;
\r
2310 speed_monster(dir, plev);
\r
2316 if (name) return _("テレポート・レベル", "Teleport Level");
\r
2317 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");
\r
2322 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
\r
2323 teleport_level(0);
\r
2329 if (name) return _("次元の扉", "Dimension Door");
\r
2330 if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleport to given location.");
\r
2333 POSITION range = plev / 2 + 10;
\r
2335 if (info) return info_range(range);
\r
2339 msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));
\r
2340 if (!dimension_door()) return NULL;
\r
2346 if (name) return _("帰還の呪文", "Word of Recall");
\r
2347 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
\r
2348 "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
\r
2354 if (info) return info_delay(base, sides);
\r
2358 if (!word_of_recall()) return NULL;
\r
2364 if (name) return _("怪物追放", "Banish");
\r
2365 if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");
\r
2368 int power = plev * 4;
\r
2370 if (info) return info_power(power);
\r
2374 banish_monsters(power);
\r
2380 if (name) return _("位置交換のカード", "Swap Position");
\r
2381 if (desc) return _("1体のモンスターと位置を交換する。", "Swap positions of you and a monster.");
\r
2388 /* HACK -- No range limit */
\r
2389 project_length = -1;
\r
2391 result = get_aim_dir(&dir);
\r
2393 /* Restore range to default */
\r
2394 project_length = 0;
\r
2396 if (!result) return NULL;
\r
2398 teleport_swap(dir);
\r
2404 if (name) return _("アンデッドのカード", "Trump Undead");
\r
2405 if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");
\r
2410 msg_print(_("あなたはアンデッドのカードに集中する...", "You concentrate on the trump of an undead creature..."));
\r
2411 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_UNDEAD, 0L))
\r
2415 msg_print(_("召喚されたアンデッドは怒っている!", "The summoned undead creature gets angry!"));
\r
2423 if (name) return _("爬虫類のカード", "Trump Reptiles");
\r
2424 if (desc) return _("1体のヒドラを召喚する。", "Summons a hydra.");
\r
2429 msg_print(_("あなたは爬虫類のカードに集中する...", "You concentrate on the trump of a reptile..."));
\r
2430 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HYDRA, 0L))
\r
2434 msg_print(_("召喚された爬虫類は怒っている!", "The summoned reptile gets angry!"));
\r
2442 if (name) return _("モンスターのカード", "Trump Monsters");
\r
2443 if (desc) return _("複数のモンスターを召喚する。", "Summons some monsters.");
\r
2449 msg_print(_("あなたはモンスターのカードに集中する...", "You concentrate on several trumps at once..."));
\r
2450 if (p_ptr->pclass == CLASS_BEASTMASTER)
\r
2451 type = SUMMON_LIVING;
\r
2455 if (trump_summoning((1 + (plev - 15)/ 10), !fail, p_ptr->y, p_ptr->x, 0, type, 0L))
\r
2459 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
\r
2468 if (name) return _("ハウンドのカード", "Trump Hounds");
\r
2469 if (desc) return _("1グループのハウンドを召喚する。", "Summons a group of hounds.");
\r
2474 msg_print(_("あなたはハウンドのカードに集中する...", "You concentrate on the trump of a hound..."));
\r
2475 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HOUND, PM_ALLOW_GROUP))
\r
2479 msg_print(_("召喚されたハウンドは怒っている!", "The summoned hounds get angry!"));
\r
2487 if (name) return _("トランプの刃", "Trump Branding");
\r
2488 if (desc) return _("武器にトランプの属性をつける。", "Makes current weapon a Trump weapon.");
\r
2499 if (name) return _("人間トランプ", "Living Trump");
\r
2500 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",
\r
2501 "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");
\r
2509 /* Teleport control */
\r
2512 /* Random teleportation (uncontrolled) */
\r
2515 /* Gain the mutation */
\r
2516 if (gain_random_mutation(mutation))
\r
2518 msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));
\r
2525 if (name) return _("サイバーデーモンのカード", "Trump Cyberdemon");
\r
2526 if (desc) return _("1体のサイバーデーモンを召喚する。", "Summons a cyber demon.");
\r
2531 msg_print(_("あなたはサイバーデーモンのカードに集中する...", "You concentrate on the trump of a Cyberdemon..."));
\r
2532 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_CYBER, 0L))
\r
2536 msg_print(_("召喚されたサイバーデーモンは怒っている!", "The summoned Cyberdemon gets angry!"));
\r
2544 if (name) return _("予見のカード", "Trump Divination");
\r
2545 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
\r
2546 "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
\r
2549 int rad = DETECT_RAD_DEFAULT;
\r
2551 if (info) return info_radius(rad);
\r
2561 if (name) return _("知識のカード", "Trump Lore");
\r
2562 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
\r
2567 if (!identify_fully(FALSE)) return NULL;
\r
2573 if (name) return _("回復モンスター", "Heal Monster");
\r
2574 if (desc) return _("モンスター1体の体力を回復させる。", "Heal a monster.");
\r
2577 int heal = plev * 10 + 200;
\r
2579 if (info) return info_heal(0, 0, heal);
\r
2585 /* Temporary enable target_pet option */
\r
2586 bool old_target_pet = target_pet;
\r
2587 target_pet = TRUE;
\r
2589 result = get_aim_dir(&dir);
\r
2591 /* Restore target_pet option */
\r
2592 target_pet = old_target_pet;
\r
2594 if (!result) return NULL;
\r
2596 heal_monster(dir, heal);
\r
2602 if (name) return _("ドラゴンのカード", "Trump Dragon");
\r
2603 if (desc) return _("1体のドラゴンを召喚する。", "Summons a dragon.");
\r
2608 msg_print(_("あなたはドラゴンのカードに集中する...", "You concentrate on the trump of a dragon..."));
\r
2609 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_DRAGON, 0L))
\r
2613 msg_print(_("召喚されたドラゴンは怒っている!", "The summoned dragon gets angry!"));
\r
2621 if (name) return _("隕石のカード", "Trump Meteor");
\r
2622 if (desc) return _("自分の周辺に隕石を落とす。", "Makes meteor balls fall down to nearby random locations.");
\r
2625 HIT_POINT dam = plev * 2;
\r
2628 if (info) return info_multi_damage(dam);
\r
2632 cast_meteor(dam, rad);
\r
2638 if (name) return _("デーモンのカード", "Trump Demon");
\r
2639 if (desc) return _("1体の悪魔を召喚する。", "Summons a demon.");
\r
2644 msg_print(_("あなたはデーモンのカードに集中する...", "You concentrate on the trump of a demon..."));
\r
2645 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_DEMON, 0L))
\r
2649 msg_print(_("召喚されたデーモンは怒っている!", "The summoned demon gets angry!"));
\r
2657 if (name) return _("地獄のカード", "Trump Greater Undead");
\r
2658 if (desc) return _("1体の上級アンデッドを召喚する。", "Summons a greater undead.");
\r
2663 msg_print(_("あなたは強力なアンデッドのカードに集中する...", "You concentrate on the trump of a greater undead being..."));
\r
2664 /* May allow unique depend on level and dice roll */
\r
2665 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HI_UNDEAD, PM_ALLOW_UNIQUE))
\r
2669 msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead creature gets angry!"));
\r
2677 if (name) return _("古代ドラゴンのカード", "Trump Ancient Dragon");
\r
2678 if (desc) return _("1体の古代ドラゴンを召喚する。", "Summons an ancient dragon.");
\r
2685 if (p_ptr->pclass == CLASS_BEASTMASTER)
\r
2686 type = SUMMON_HI_DRAGON_LIVING;
\r
2688 type = SUMMON_HI_DRAGON;
\r
2690 msg_print(_("あなたは古代ドラゴンのカードに集中する...", "You concentrate on the trump of an ancient dragon..."));
\r
2691 /* May allow unique depend on level and dice roll */
\r
2692 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, type, PM_ALLOW_UNIQUE))
\r
2696 msg_print(_("召喚された古代ドラゴンは怒っている!", "The summoned ancient dragon gets angry!"));
\r
2709 * @brief 匠領域魔法の各処理を行う
\r
2710 * @param spell 魔法ID
\r
2711 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
2712 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
2714 static cptr do_craft_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
2716 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
2717 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
2718 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
2719 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
2721 int plev = p_ptr->lev;
\r
2726 if (name) return _("赤外線視力", "Infravision");
\r
2727 if (desc) return _("一定時間、赤外線視力が増強される。", "Gives infravision for a while.");
\r
2732 if (info) return info_duration(base, base);
\r
2736 set_tim_infra(base + randint1(base), FALSE);
\r
2742 if (name) return _("回復力強化", "Regeneration");
\r
2743 if (desc) return _("一定時間、回復力が増強される。", "Gives regeneration ability for a while.");
\r
2748 if (info) return info_duration(base, base);
\r
2752 set_tim_regen(base + randint1(base), FALSE);
\r
2758 if (name) return _("空腹充足", "Satisfy Hunger");
\r
2759 if (desc) return _("満腹になる。", "Satisfies hunger.");
\r
2764 set_food(PY_FOOD_MAX - 1);
\r
2770 if (name) return _("耐冷気", "Resist Cold");
\r
2771 if (desc) return _("一定時間、冷気への耐性を得る。装備による耐性に累積する。",
\r
2772 "Gives resistance to cold. This resistance can be added to which from equipment for more powerful resistance.");
\r
2777 if (info) return info_duration(base, base);
\r
2781 set_oppose_cold(randint1(base) + base, FALSE);
\r
2787 if (name) return _("耐火炎", "Resist Fire");
\r
2788 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
\r
2789 "Gives resistance to fire. This resistance can be added to which from equipment for more powerful resistance.");
\r
2794 if (info) return info_duration(base, base);
\r
2798 set_oppose_fire(randint1(base) + base, FALSE);
\r
2804 if (name) return _("士気高揚", "Heroism");
\r
2805 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
2810 if (info) return info_duration(base, base);
\r
2814 set_hero(randint1(base) + base, FALSE);
\r
2822 if (name) return _("耐電撃", "Resist Lightning");
\r
2823 if (desc) return _("一定時間、電撃への耐性を得る。装備による耐性に累積する。",
\r
2824 "Gives resistance to electricity. This resistance can be added to which from equipment for more powerful resistance.");
\r
2829 if (info) return info_duration(base, base);
\r
2833 set_oppose_elec(randint1(base) + base, FALSE);
\r
2839 if (name) return _("耐酸", "Resist Acid");
\r
2840 if (desc) return _("一定時間、酸への耐性を得る。装備による耐性に累積する。",
\r
2841 "Gives resistance to acid. This resistance can be added to which from equipment for more powerful resistance.");
\r
2846 if (info) return info_duration(base, base);
\r
2850 set_oppose_acid(randint1(base) + base, FALSE);
\r
2856 if (name) return _("透明視認", "See Invisibility");
\r
2857 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
\r
2862 if (info) return info_duration(base, base);
\r
2866 set_tim_invis(randint1(base) + base, FALSE);
\r
2872 if (name) return _("解呪", "Remove Curse");
\r
2873 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
\r
2878 if (remove_curse())
\r
2880 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
2887 if (name) return _("耐毒", "Resist Poison");
\r
2888 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",
\r
2889 "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");
\r
2894 if (info) return info_duration(base, base);
\r
2898 set_oppose_pois(randint1(base) + base, FALSE);
\r
2904 if (name) return _("狂戦士化", "Berserk");
\r
2905 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");
\r
2910 if (info) return info_duration(base, base);
\r
2914 set_shero(randint1(base) + base, FALSE);
\r
2922 if (name) return _("自己分析", "Self Knowledge");
\r
2923 if (desc) return _("現在の自分の状態を完全に知る。",
\r
2924 "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");
\r
2935 if (name) return _("対邪悪結界", "Protection from Evil");
\r
2936 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");
\r
2939 int base = 3 * plev;
\r
2942 if (info) return info_duration(base, sides);
\r
2946 set_protevil(randint1(sides) + base, FALSE);
\r
2952 if (name) return _("癒し", "Cure");
\r
2953 if (desc) return _("毒、朦朧状態、負傷を全快させ、幻覚を直す。", "Heals poison, stun, cut and hallucination completely.");
\r
2967 if (name) return _("魔法剣", "Mana Branding");
\r
2968 if (desc) return _("一定時間、武器に冷気、炎、電撃、酸、毒のいずれかの属性をつける。武器を持たないと使えない。",
\r
2969 "Makes current weapon some elemental branded. You must wield weapons.");
\r
2972 int base = plev / 2;
\r
2974 if (info) return info_duration(base, base);
\r
2978 if (!choose_ele_attack()) return NULL;
\r
2984 if (name) return _("テレパシー", "Telepathy");
\r
2985 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
\r
2991 if (info) return info_duration(base, sides);
\r
2995 set_tim_esp(randint1(sides) + base, FALSE);
\r
3001 if (name) return _("肌石化", "Stone Skin");
\r
3002 if (desc) return _("一定時間、ACを上昇させる。", "Gives bonus to AC for a while.");
\r
3008 if (info) return info_duration(base, sides);
\r
3012 set_shield(randint1(sides) + base, FALSE);
\r
3018 if (name) return _("全耐性", "Resistance");
\r
3019 if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
\r
3020 "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
3025 if (info) return info_duration(base, base);
\r
3029 set_oppose_acid(randint1(base) + base, FALSE);
\r
3030 set_oppose_elec(randint1(base) + base, FALSE);
\r
3031 set_oppose_fire(randint1(base) + base, FALSE);
\r
3032 set_oppose_cold(randint1(base) + base, FALSE);
\r
3033 set_oppose_pois(randint1(base) + base, FALSE);
\r
3039 if (name) return _("スピード", "Haste Self");
\r
3040 if (desc) return _("一定時間、加速する。", "Hastes you for a while.");
\r
3044 int sides = 20 + plev;
\r
3046 if (info) return info_duration(base, sides);
\r
3050 set_fast(randint1(sides) + base, FALSE);
\r
3056 if (name) return _("壁抜け", "Walk through Wall");
\r
3057 if (desc) return _("一定時間、半物質化し壁を通り抜けられるようになる。", "Gives ability to pass walls for a while.");
\r
3060 int base = plev / 2;
\r
3062 if (info) return info_duration(base, base);
\r
3066 set_kabenuke(randint1(base) + base, FALSE);
\r
3072 if (name) return _("盾磨き", "Polish Shield");
\r
3073 if (desc) return _("盾に反射の属性をつける。", "Makes a shield a shield of reflection.");
\r
3084 if (name) return _("ゴーレム製造", "Create Golem");
\r
3085 if (desc) return _("1体のゴーレムを製造する。", "Creates a golem.");
\r
3090 if (summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_GOLEM, PM_FORCE_PET))
\r
3092 msg_print(_("ゴーレムを作った。", "You make a golem."));
\r
3096 msg_print(_("うまくゴーレムを作れなかった。", "No Golems arrive."));
\r
3103 if (name) return _("魔法の鎧", "Magical armor");
\r
3104 if (desc) return _("一定時間、魔法防御力とACが上がり、混乱と盲目の耐性、反射能力、麻痺知らず、浮遊を得る。",
\r
3105 "Gives resistance to magic, bonus to AC, resistance to confusion, blindness, reflection, free action and levitation for a while.");
\r
3110 if (info) return info_duration(base, base);
\r
3114 set_magicdef(randint1(base) + base, FALSE);
\r
3120 if (name) return _("装備無力化", "Remove Enchantment");
\r
3121 if (desc) return _("武器・防具にかけられたあらゆる魔力を完全に解除する。", "Removes all magics completely from any weapon or armor.");
\r
3126 if (!mundane_spell(TRUE)) return NULL;
\r
3132 if (name) return _("呪い粉砕", "Remove All Curse");
\r
3133 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
\r
3138 if (remove_all_curse())
\r
3140 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
3147 if (name) return _("完全なる知識", "Knowledge True");
\r
3148 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
\r
3153 if (!identify_fully(FALSE)) return NULL;
\r
3159 if (name) return _("武器強化", "Enchant Weapon");
\r
3160 if (desc) return _("武器の命中率修正とダメージ修正を強化する。", "Attempts to increase +to-hit, +to-dam of a weapon.");
\r
3165 if (!enchant_spell(randint0(4) + 1, randint0(4) + 1, 0)) return NULL;
\r
3171 if (name) return _("防具強化", "Enchant Armor");
\r
3172 if (desc) return _("鎧の防御修正を強化する。", "Attempts to increase +AC of an armor.");
\r
3177 if (!enchant_spell(0, 0, randint0(3) + 2)) return NULL;
\r
3183 if (name) return _("武器属性付与", "Brand Weapon");
\r
3184 if (desc) return _("武器にランダムに属性をつける。", "Makes current weapon a random ego weapon.");
\r
3189 brand_weapon(randint0(18));
\r
3195 if (name) return _("人間トランプ", "Living Trump");
\r
3196 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",
\r
3197 "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");
\r
3205 /* Teleport control */
\r
3208 /* Random teleportation (uncontrolled) */
\r
3211 /* Gain the mutation */
\r
3212 if (gain_random_mutation(mutation))
\r
3214 msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));
\r
3221 if (name) return _("属性への免疫", "Immunity");
\r
3222 if (desc) return _("一定時間、冷気、炎、電撃、酸のいずれかに対する免疫を得る。",
\r
3223 "Gives an immunity to fire, cold, electricity or acid for a while.");
\r
3228 if (info) return info_duration(base, base);
\r
3232 if (!choose_ele_immune(base + randint1(base))) return NULL;
\r
3242 * @brief 悪魔領域魔法の各処理を行う
\r
3243 * @param spell 魔法ID
\r
3244 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
3245 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
3247 static cptr do_daemon_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
3249 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
3250 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
3251 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
3252 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
3253 static const char s_dam[] = _("損傷:", "dam ");
\r
3256 int plev = p_ptr->lev;
\r
3261 if (name) return _("マジック・ミサイル", "Magic Missile");
\r
3262 if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");
\r
3265 int dice = 3 + (plev - 1) / 5;
\r
3268 if (info) return info_damage(dice, sides, 0);
\r
3272 if (!get_aim_dir(&dir)) return NULL;
\r
3274 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));
\r
3280 if (name) return _("無生命感知", "Detect Unlife");
\r
3281 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
\r
3284 int rad = DETECT_RAD_DEFAULT;
\r
3286 if (info) return info_radius(rad);
\r
3290 detect_monsters_nonliving(rad);
\r
3296 if (name) return _("邪なる祝福", "Evil Bless");
\r
3297 if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
\r
3302 if (info) return info_duration(base, base);
\r
3306 set_blessed(randint1(base) + base, FALSE);
\r
3312 if (name) return _("耐火炎", "Resist Fire");
\r
3313 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
\r
3314 "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");
\r
3319 if (info) return info_duration(base, base);
\r
3323 set_oppose_fire(randint1(base) + base, FALSE);
\r
3329 if (name) return _("恐慌", "Horrify");
\r
3330 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
\r
3335 if (info) return info_power(power);
\r
3339 if (!get_aim_dir(&dir)) return NULL;
\r
3341 fear_monster(dir, power);
\r
3342 stun_monster(dir, power);
\r
3348 if (name) return _("地獄の矢", "Nether Bolt");
\r
3349 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
\r
3352 int dice = 6 + (plev - 5) / 4;
\r
3355 if (info) return info_damage(dice, sides, 0);
\r
3359 if (!get_aim_dir(&dir)) return NULL;
\r
3361 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
\r
3367 if (name) return _("古代の死霊召喚", "Summon Manes");
\r
3368 if (desc) return _("古代の死霊を召喚する。", "Summons a manes.");
\r
3373 if (!summon_specific(-1, p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET)))
\r
3375 msg_print(_("古代の死霊は現れなかった。", "No Manes arrive."));
\r
3382 if (name) return _("地獄の焔", "Hellish Flame");
\r
3383 if (desc) return _("邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",
\r
3384 "Fires a ball of evil power. Hurts good monsters greatly.");
\r
3389 int rad = (plev < 30) ? 2 : 3;
\r
3392 if (p_ptr->pclass == CLASS_MAGE ||
\r
3393 p_ptr->pclass == CLASS_HIGH_MAGE ||
\r
3394 p_ptr->pclass == CLASS_SORCERER)
\r
3395 base = plev + plev / 2;
\r
3397 base = plev + plev / 4;
\r
3400 if (info) return info_damage(dice, sides, base);
\r
3404 if (!get_aim_dir(&dir)) return NULL;
\r
3406 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides) + base, rad);
\r
3412 if (name) return _("デーモン支配", "Dominate Demon");
\r
3413 if (desc) return _("悪魔1体を魅了する。抵抗されると無効", "Attempts to charm a demon.");
\r
3418 if (info) return info_power(power);
\r
3422 if (!get_aim_dir(&dir)) return NULL;
\r
3424 control_one_demon(dir, power);
\r
3430 if (name) return _("ビジョン", "Vision");
\r
3431 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
\r
3434 int rad = DETECT_RAD_MAP;
\r
3436 if (info) return info_radius(rad);
\r
3446 if (name) return _("耐地獄", "Resist Nether");
\r
3447 if (desc) return _("一定時間、地獄への耐性を得る。", "Gives resistance to nether for a while.");
\r
3452 if (info) return info_duration(base, base);
\r
3456 set_tim_res_nether(randint1(base) + base, FALSE);
\r
3462 if (name) return _("プラズマ・ボルト", "Plasma bolt");
\r
3463 if (desc) return _("プラズマのボルトもしくはビームを放つ。", "Fires a bolt or beam of plasma.");
\r
3466 int dice = 11 + (plev - 5) / 4;
\r
3469 if (info) return info_damage(dice, sides, 0);
\r
3473 if (!get_aim_dir(&dir)) return NULL;
\r
3475 fire_bolt_or_beam(beam_chance(), GF_PLASMA, dir, damroll(dice, sides));
\r
3481 if (name) return _("ファイア・ボール", "Fire Ball");
\r
3482 if (desc) return _("炎の球を放つ。", "Fires a ball of fire.");
\r
3485 HIT_POINT dam = plev + 55;
\r
3488 if (info) return info_damage(0, 0, dam);
\r
3492 if (!get_aim_dir(&dir)) return NULL;
\r
3494 fire_ball(GF_FIRE, dir, dam, rad);
\r
3500 if (name) return _("炎の刃", "Fire Branding");
\r
3501 if (desc) return _("武器に炎の属性をつける。", "Makes current weapon fire branded.");
\r
3512 if (name) return _("地獄球", "Nether Ball");
\r
3513 if (desc) return _("大きな地獄の球を放つ。", "Fires a huge ball of nether.");
\r
3516 HIT_POINT dam = plev * 3 / 2 + 100;
\r
3517 int rad = plev / 20 + 2;
\r
3519 if (info) return info_damage(0, 0, dam);
\r
3523 if (!get_aim_dir(&dir)) return NULL;
\r
3525 fire_ball(GF_NETHER, dir, dam, rad);
\r
3531 if (name) return _("デーモン召喚", "Summon Demon");
\r
3532 if (desc) return _("悪魔1体を召喚する。", "Summons a demon.");
\r
3537 bool pet = !one_in_(3);
\r
3540 if (pet) flg |= PM_FORCE_PET;
\r
3541 else flg |= PM_NO_PET;
\r
3542 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
\r
3544 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, plev*2/3+randint1(plev/2), SUMMON_DEMON, flg))
\r
3546 msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));
\r
3550 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
\r
3554 msg_print(_("「卑しき者よ、我は汝の下僕にあらず! お前の魂を頂くぞ!」",
\r
3555 "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));
\r
3560 msg_print(_("悪魔は現れなかった。", "No demons arrive."));
\r
3568 if (name) return _("悪魔の目", "Devilish Eye");
\r
3569 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
\r
3575 if (info) return info_duration(base, sides);
\r
3579 set_tim_esp(randint1(sides) + base, FALSE);
\r
3585 if (name) return _("悪魔のクローク", "Devil Cloak");
\r
3586 if (desc) return _("恐怖を取り除き、一定時間、炎と冷気の耐性、炎のオーラを得る。耐性は装備による耐性に累積する。",
\r
3587 "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
3590 TIME_EFFECT base = 20;
\r
3592 if (info) return info_duration(base, base);
\r
3596 TIME_EFFECT dur = randint1(base) + base;
\r
3598 set_oppose_fire(dur, FALSE);
\r
3599 set_oppose_cold(dur, FALSE);
\r
3600 set_tim_sh_fire(dur, FALSE);
\r
3608 if (name) return _("溶岩流", "The Flow of Lava");
\r
3609 if (desc) return _("自分を中心とした炎の球を作り出し、床を溶岩に変える。",
\r
3610 "Generates a ball of fire centered on you which transforms floors to magma.");
\r
3613 HIT_POINT dam = (55 + plev) * 2;
\r
3616 if (info) return info_damage(0, 0, dam/2);
\r
3620 fire_ball(GF_FIRE, 0, dam, rad);
\r
3621 fire_ball_hide(GF_LAVA_FLOW, 0, 2 + randint1(2), rad);
\r
3627 if (name) return _("プラズマ球", "Plasma Ball");
\r
3628 if (desc) return _("プラズマの球を放つ。", "Fires a ball of plasma.");
\r
3631 HIT_POINT dam = plev * 3 / 2 + 80;
\r
3632 int rad = 2 + plev / 40;
\r
3634 if (info) return info_damage(0, 0, dam);
\r
3638 if (!get_aim_dir(&dir)) return NULL;
\r
3640 fire_ball(GF_PLASMA, dir, dam, rad);
\r
3646 if (name) return _("悪魔変化", "Polymorph Demon");
\r
3647 if (desc) return _("一定時間、悪魔に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔としての能力を得る。",
\r
3648 "Mimic a demon for a while. Loses abilities of original race and gets abilities as a demon.");
\r
3651 int base = 10 + plev / 2;
\r
3653 if (info) return info_duration(base, base);
\r
3657 set_mimic(base + randint1(base), MIMIC_DEMON, FALSE);
\r
3663 if (name) return _("地獄の波動", "Nather Wave");
\r
3664 if (desc) return _("視界内の全てのモンスターにダメージを与える。善良なモンスターに特に大きなダメージを与える。",
\r
3665 "Damages all monsters in sight. Hurts good monsters greatly.");
\r
3668 int sides1 = plev * 2;
\r
3669 int sides2 = plev * 2;
\r
3671 if (info) return format("%sd%d+d%d", s_dam, sides1, sides2);
\r
3675 dispel_monsters(randint1(sides1));
\r
3676 dispel_good(randint1(sides2));
\r
3682 if (name) return _("サキュバスの接吻", "Kiss of Succubus");
\r
3683 if (desc) return _("因果混乱の球を放つ。", "Fires a ball of nexus.");
\r
3686 HIT_POINT dam = 100 + plev * 2;
\r
3689 if (info) return info_damage(0, 0, dam);
\r
3693 if (!get_aim_dir(&dir)) return NULL;
\r
3694 fire_ball(GF_NEXUS, dir, dam, rad);
\r
3700 if (name) return _("破滅の手", "Doom Hand");
\r
3701 if (desc) return _("破滅の手を放つ。食らったモンスターはそのときのHPの半分前後のダメージを受ける。", "Attempts to make a monster's HP almost half.");
\r
3706 if (!get_aim_dir(&dir))
\r
3709 msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));
\r
3711 fire_ball_hide(GF_HAND_DOOM, dir, plev * 2, 0);
\r
3717 if (name) return _("士気高揚", "Raise the Morale");
\r
3718 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
3723 if (info) return info_duration(base, base);
\r
3727 set_hero(randint1(base) + base, FALSE);
\r
3735 if (name) return _("不滅の肉体", "Immortal Body");
\r
3736 if (desc) return _("一定時間、時間逆転への耐性を得る。", "Gives resistance to time for a while.");
\r
3741 if (info) return info_duration(base, base);
\r
3745 set_tim_res_time(randint1(base)+base, FALSE);
\r
3751 if (name) return _("狂気の円環", "Insanity Circle");
\r
3752 if (desc) return _("自分を中心としたカオスの球、混乱の球を発生させ、近くのモンスターを魅了する。",
\r
3753 "Generate balls of chaos, confusion and charm centered on you.");
\r
3756 HIT_POINT dam = 50 + plev;
\r
3757 int power = 20 + plev;
\r
3758 int rad = 3 + plev / 20;
\r
3760 if (info) return format("%s%d+%d", s_dam, dam/2, dam/2);
\r
3764 fire_ball(GF_CHAOS, 0, dam, rad);
\r
3765 fire_ball(GF_CONFUSION, 0, dam, rad);
\r
3766 fire_ball(GF_CHARM, 0, power, rad);
\r
3772 if (name) return _("ペット爆破", "Explode Pets");
\r
3773 if (desc) return _("全てのペットを強制的に爆破させる。", "Makes all pets explode.");
\r
3778 discharge_minion();
\r
3784 if (name) return _("グレーターデーモン召喚", "Summon Greater Demon");
\r
3785 if (desc) return _("上級デーモンを召喚する。召喚するには人間('p','h','t'で表されるモンスター)の死体を捧げなければならない。",
\r
3786 "Summons greater demon. It need to sacrifice a corpse of human ('p','h' or 't').");
\r
3791 if (!cast_summon_greater_demon()) return NULL;
\r
3797 if (name) return _("地獄嵐", "Nether Storm");
\r
3798 if (desc) return _("超巨大な地獄の球を放つ。", "Generate a huge ball of nether.");
\r
3801 HIT_POINT dam = plev * 15;
\r
3802 int rad = plev / 5;
\r
3804 if (info) return info_damage(0, 0, dam);
\r
3808 if (!get_aim_dir(&dir)) return NULL;
\r
3810 fire_ball(GF_NETHER, dir, dam, rad);
\r
3816 if (name) return _("血の呪い", "Bloody Curse");
\r
3817 if (desc) return _("自分がダメージを受けることによって対象に呪いをかけ、ダメージを与え様々な効果を引き起こす。",
\r
3818 "Puts blood curse which damages and causes various effects on a monster. You also take damage.");
\r
3821 HIT_POINT dam = 600;
\r
3824 if (info) return info_damage(0, 0, dam);
\r
3828 if (!get_aim_dir(&dir)) return NULL;
\r
3830 fire_ball_hide(GF_BLOOD_CURSE, dir, dam, rad);
\r
3831 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("血の呪い", "Blood curse"), -1);
\r
3837 if (name) return _("魔王変化", "Polymorph Demonlord");
\r
3838 if (desc) return _("悪魔の王に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔の王としての能力を得、壁を破壊しながら歩く。",
\r
3839 "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
3844 if (info) return info_duration(base, base);
\r
3848 set_mimic(base + randint1(base), MIMIC_DEMON_LORD, FALSE);
\r
3858 * @brief 破邪領域魔法の各処理を行う
\r
3859 * @param spell 魔法ID
\r
3860 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
3861 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
3863 static cptr do_crusade_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
3865 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
3866 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
3867 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
3868 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
3871 int plev = p_ptr->lev;
\r
3876 if (name) return _("懲罰", "Punishment");
\r
3877 if (desc) return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");
\r
3880 int dice = 3 + (plev - 1) / 5;
\r
3883 if (info) return info_damage(dice, sides, 0);
\r
3887 if (!get_aim_dir(&dir)) return NULL;
\r
3889 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));
\r
3895 if (name) return _("邪悪存在感知", "Detect Evil");
\r
3896 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
\r
3899 int rad = DETECT_RAD_DEFAULT;
\r
3901 if (info) return info_radius(rad);
\r
3905 detect_monsters_evil(rad);
\r
3911 if (name) return _("恐怖除去", "Remove Fear");
\r
3912 if (desc) return _("恐怖を取り除く。", "Removes fear.");
\r
3923 if (name) return _("威圧", "Scare Monster");
\r
3924 if (desc) return _("モンスター1体を恐怖させる。抵抗されると無効。", "Attempts to scare a monster.");
\r
3929 if (info) return info_power(power);
\r
3933 if (!get_aim_dir(&dir)) return NULL;
\r
3935 fear_monster(dir, power);
\r
3941 if (name) return _("聖域", "Sanctuary");
\r
3942 if (desc) return _("隣接した全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep monsters in the adjacent squares.");
\r
3947 if (info) return info_power(power);
\r
3951 sleep_monsters_touch();
\r
3957 if (name) return _("入口", "Portal");
\r
3958 if (desc) return _("中距離のテレポートをする。", "Teleport medium distance.");
\r
3961 POSITION range = 25 + plev / 2;
\r
3963 if (info) return info_range(range);
\r
3967 teleport_player(range, 0L);
\r
3973 if (name) return _("スターダスト", "Star Dust");
\r
3974 if (desc) return _("ターゲット付近に閃光のボルトを連射する。", "Fires many bolts of light near the target.");
\r
3977 int dice = 3 + (plev - 1) / 9;
\r
3980 if (info) return info_multi_damage_dice(dice, sides);
\r
3984 if (!get_aim_dir(&dir)) return NULL;
\r
3985 fire_blast(GF_LITE, dir, dice, sides, 10, 3);
\r
3991 if (name) return _("身体浄化", "Purify");
\r
3992 if (desc) return _("傷、毒、朦朧から全快する。", "Heals all cut, stun and poison status.");
\r
4005 if (name) return _("邪悪飛ばし", "Scatter Evil");
\r
4006 if (desc) return _("邪悪なモンスター1体をテレポートさせる。抵抗されると無効。", "Attempts to teleport an evil monster away.");
\r
4009 int power = MAX_SIGHT * 5;
\r
4011 if (info) return info_power(power);
\r
4015 if (!get_aim_dir(&dir)) return NULL;
\r
4016 fire_ball(GF_AWAY_EVIL, dir, power, 0);
\r
4022 if (name) return _("聖なる光球", "Holy Orb");
\r
4023 if (desc) return _("聖なる力をもつ宝珠を放つ。邪悪なモンスターに対して大きなダメージを与えるが、善良なモンスターには効果がない。",
\r
4024 "Fires a ball with holy power. Hurts evil monsters greatly, but don't effect good monsters.");
\r
4029 int rad = (plev < 30) ? 2 : 3;
\r
4032 if (p_ptr->pclass == CLASS_PRIEST ||
\r
4033 p_ptr->pclass == CLASS_HIGH_MAGE ||
\r
4034 p_ptr->pclass == CLASS_SORCERER)
\r
4035 base = plev + plev / 2;
\r
4037 base = plev + plev / 4;
\r
4040 if (info) return info_damage(dice, sides, base);
\r
4044 if (!get_aim_dir(&dir)) return NULL;
\r
4046 fire_ball(GF_HOLY_FIRE, dir, damroll(dice, sides) + base, rad);
\r
4052 if (name) return _("悪魔払い", "Exorcism");
\r
4053 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与え、邪悪なモンスターを恐怖させる。",
\r
4054 "Damages all undead and demons in sight, and scares all evil monsters in sight.");
\r
4060 if (info) return info_damage(1, sides, 0);
\r
4064 dispel_undead(randint1(sides));
\r
4065 dispel_demons(randint1(sides));
\r
4072 if (name) return _("解呪", "Remove Curse");
\r
4073 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
\r
4078 if (remove_curse())
\r
4080 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
4087 if (name) return _("透明視認", "Sense Unseen");
\r
4088 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
\r
4093 if (info) return info_duration(base, base);
\r
4097 set_tim_invis(randint1(base) + base, FALSE);
\r
4103 if (name) return _("対邪悪結界", "Protection from Evil");
\r
4104 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");
\r
4108 int sides = 3 * plev;
\r
4110 if (info) return info_duration(base, sides);
\r
4114 set_protevil(randint1(sides) + base, FALSE);
\r
4120 if (name) return _("裁きの雷", "Judgment Thunder");
\r
4121 if (desc) return _("強力な電撃のボルトを放つ。", "Fires a powerful bolt of lightning.");
\r
4124 HIT_POINT dam = plev * 5;
\r
4126 if (info) return info_damage(0, 0, dam);
\r
4130 if (!get_aim_dir(&dir)) return NULL;
\r
4131 fire_bolt(GF_ELEC, dir, dam);
\r
4137 if (name) return _("聖なる御言葉", "Holy Word");
\r
4138 if (desc) return _("視界内の邪悪な存在に大きなダメージを与え、体力を回復し、毒、恐怖、朦朧状態、負傷から全快する。",
\r
4139 "Damages all evil monsters in sight, heals HP somewhat, and completely heals poison, fear, stun and cut status.");
\r
4142 int dam_sides = plev * 6;
\r
4145 if (info) return format(_("損:1d%d/回%d", "dam:d%d/h%d"), dam_sides, heal);
\r
4148 dispel_evil(randint1(dam_sides));
\r
4159 if (name) return _("開かれた道", "Unbarring Ways");
\r
4160 if (desc) return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");
\r
4165 if (!get_aim_dir(&dir)) return NULL;
\r
4167 destroy_door(dir);
\r
4173 if (name) return _("封魔", "Arrest");
\r
4174 if (desc) return _("邪悪なモンスターの動きを止める。", "Attempts to paralyze an evil monster.");
\r
4177 int power = plev * 2;
\r
4179 if (info) return info_power(power);
\r
4183 if (!get_aim_dir(&dir)) return NULL;
\r
4190 if (name) return _("聖なるオーラ", "Holy Aura");
\r
4191 if (desc) return _("一定時間、邪悪なモンスターを傷つける聖なるオーラを得る。",
\r
4192 "Gives aura of holy power which injures evil monsters which attacked you for a while.");
\r
4197 if (info) return info_duration(base, base);
\r
4201 set_tim_sh_holy(randint1(base) + base, FALSE);
\r
4207 if (name) return _("アンデッド&悪魔退散", "Dispel Undead & Demons");
\r
4208 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与える。", "Damages all undead and demons in sight.");
\r
4211 int sides = plev * 4;
\r
4213 if (info) return info_damage(1, sides, 0);
\r
4217 dispel_undead(randint1(sides));
\r
4218 dispel_demons(randint1(sides));
\r
4224 if (name) return _("邪悪退散", "Dispel Evil");
\r
4225 if (desc) return _("視界内の全ての邪悪なモンスターにダメージを与える。", "Damages all evil monsters in sight.");
\r
4228 int sides = plev * 4;
\r
4230 if (info) return info_damage(1, sides, 0);
\r
4234 dispel_evil(randint1(sides));
\r
4240 if (name) return _("聖なる刃", "Holy Blade");
\r
4241 if (desc) return _("通常の武器に滅邪の属性をつける。", "Makes current weapon especially deadly against evil monsters.");
\r
4252 if (name) return _("スターバースト", "Star Burst");
\r
4253 if (desc) return _("巨大な閃光の球を放つ。", "Fires a huge ball of powerful light.");
\r
4256 HIT_POINT dam = 100 + plev * 2;
\r
4259 if (info) return info_damage(0, 0, dam);
\r
4263 if (!get_aim_dir(&dir)) return NULL;
\r
4265 fire_ball(GF_LITE, dir, dam, rad);
\r
4271 if (name) return _("天使召喚", "Summon Angel");
\r
4272 if (desc) return _("天使を1体召喚する。", "Summons an angel.");
\r
4277 bool pet = !one_in_(3);
\r
4280 if (pet) flg |= PM_FORCE_PET;
\r
4281 else flg |= PM_NO_PET;
\r
4282 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
\r
4284 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_ANGEL, flg))
\r
4288 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
\r
4292 msg_print(_("「我は汝の下僕にあらず! 悪行者よ、悔い改めよ!」", "Mortal! Repent of thy impiousness."));
\r
4300 if (name) return _("士気高揚", "Heroism");
\r
4301 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
4306 if (info) return info_duration(base, base);
\r
4310 set_hero(randint1(base) + base, FALSE);
\r
4318 if (name) return _("呪い退散", "Dispel Curse");
\r
4319 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
\r
4324 if (remove_all_curse())
\r
4326 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
4333 if (name) return _("邪悪追放", "Banish Evil");
\r
4334 if (desc) return _("視界内の全ての邪悪なモンスターをテレポートさせる。抵抗されると無効。",
\r
4335 "Teleports all evil monsters in sight away unless resisted.");
\r
4340 if (info) return info_power(power);
\r
4344 if (banish_evil(power))
\r
4346 msg_print(_("神聖な力が邪悪を打ち払った!", "The holy power banishes evil!"));
\r
4353 if (name) return _("ハルマゲドン", "Armageddon");
\r
4354 if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroy everything in nearby area.");
\r
4362 destroy_area(p_ptr->y, p_ptr->x, base + randint1(sides), FALSE);
\r
4368 if (name) return _("目には目を", "An Eye for an Eye");
\r
4369 if (desc) return _("一定時間、自分がダメージを受けたときに攻撃を行ったモンスターに対して同等のダメージを与える。",
\r
4370 "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
4375 if (info) return info_duration(base, base);
\r
4379 set_tim_eyeeye(randint1(base) + base, FALSE);
\r
4385 if (name) return _("神の怒り", "Wrath of the God");
\r
4386 if (desc) return _("ターゲットの周囲に分解の球を多数落とす。", "Drops many balls of disintegration near the target.");
\r
4389 HIT_POINT dam = plev * 3 + 25;
\r
4392 if (info) return info_multi_damage(dam);
\r
4396 if (!cast_wrath_of_the_god(dam, rad)) return NULL;
\r
4402 if (name) return _("神威", "Divine Intervention");
\r
4403 if (desc) return _("隣接するモンスターに聖なるダメージを与え、視界内のモンスターにダメージ、減速、朦朧、混乱、恐怖、眠りを与える。さらに体力を回復する。",
\r
4404 "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
4407 int b_dam = plev * 11;
\r
4408 int d_dam = plev * 4;
\r
4410 int power = plev * 4;
\r
4412 if (info) return format(_("回%d/損%d+%d", "h%d/dm%d+%d"), heal, d_dam, b_dam/2);
\r
4415 project(0, 1, p_ptr->y, p_ptr->x, b_dam, GF_HOLY_FIRE, PROJECT_KILL, -1);
\r
4416 dispel_monsters(d_dam);
\r
4417 slow_monsters(plev);
\r
4418 stun_monsters(power);
\r
4419 confuse_monsters(power);
\r
4420 turn_monsters(power);
\r
4421 stasis_monsters(power);
\r
4428 if (name) return _("聖戦", "Crusade");
\r
4429 if (desc) return _("視界内の善良なモンスターをペットにしようとし、ならなかった場合及び善良でないモンスターを恐怖させる。さらに多数の加速された騎士を召喚し、ヒーロー、祝福、加速、対邪悪結界を得る。",
\r
4430 "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
4436 int sp_sides = 20 + plev;
\r
4437 int sp_base = plev;
\r
4441 for (i = 0; i < 12; i++)
\r
4444 POSITION my = 0, mx = 0;
\r
4448 scatter(&my, &mx, p_ptr->y, p_ptr->x, 4, 0);
\r
4450 /* Require empty grids */
\r
4451 if (cave_empty_bold2(my, mx)) break;
\r
4453 if (attempt < 0) continue;
\r
4454 summon_specific(-1, my, mx, plev, SUMMON_KNIGHTS, (PM_ALLOW_GROUP | PM_FORCE_PET | PM_HASTE));
\r
4456 set_hero(randint1(base) + base, FALSE);
\r
4457 set_blessed(randint1(base) + base, FALSE);
\r
4458 set_fast(randint1(sp_sides) + sp_base, FALSE);
\r
4459 set_protevil(randint1(base) + base, FALSE);
\r
4472 * @param spell 歌ID
\r
4473 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP)
\r
4474 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
\r
4476 static cptr do_music_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
4478 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
4479 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
4480 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
4481 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
4482 bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
\r
4483 bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
\r
4484 bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
\r
4485 static const char s_dam[] = _("損傷:", "dam ");
\r
4488 int plev = p_ptr->lev;
\r
4493 if (name) return _("遅鈍の歌", "Song of Holding");
\r
4494 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
\r
4496 /* Stop singing before start another */
\r
4497 if (cast || fail) stop_singing();
\r
4501 msg_print(_("ゆっくりとしたメロディを口ずさみ始めた...", "You start humming a slow, steady melody..."));
\r
4502 start_singing(spell, MUSIC_SLOW);
\r
4508 if (info) return info_power(power);
\r
4512 slow_monsters(plev);
\r
4518 if (name) return _("祝福の歌", "Song of Blessing");
\r
4519 if (desc) return _("命中率とACのボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
\r
4521 /* Stop singing before start another */
\r
4522 if (cast || fail) stop_singing();
\r
4526 msg_print(_("厳かなメロディを奏で始めた...", "The holy power of the Music of the Ainur enters you..."));
\r
4527 start_singing(spell, MUSIC_BLESS);
\r
4532 if (!p_ptr->blessed)
\r
4534 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
\r
4541 if (name) return _("崩壊の音色", "Wrecking Note");
\r
4542 if (desc) return _("轟音のボルトを放つ。", "Fires a bolt of sound.");
\r
4544 /* Stop singing before start another */
\r
4545 if (cast || fail) stop_singing();
\r
4548 int dice = 4 + (plev - 1) / 5;
\r
4551 if (info) return info_damage(dice, sides, 0);
\r
4555 if (!get_aim_dir(&dir)) return NULL;
\r
4557 fire_bolt(GF_SOUND, dir, damroll(dice, sides));
\r
4563 if (name) return _("朦朧の旋律", "Stun Pattern");
\r
4564 if (desc) return _("視界内の全てのモンスターを朦朧させる。抵抗されると無効。", "Attempts to stun all monsters in sight.");
\r
4566 /* Stop singing before start another */
\r
4567 if (cast || fail) stop_singing();
\r
4571 msg_print(_("眩惑させるメロディを奏で始めた...", "You weave a pattern of sounds to bewilder and daze..."));
\r
4572 start_singing(spell, MUSIC_STUN);
\r
4576 int dice = plev / 10;
\r
4579 if (info) return info_power_dice(dice, sides);
\r
4583 stun_monsters(damroll(dice, sides));
\r
4590 if (name) return _("生命の流れ", "Flow of Life");
\r
4591 if (desc) return _("体力を少し回復させる。", "Heals HP a little.");
\r
4593 /* Stop singing before start another */
\r
4594 if (cast || fail) stop_singing();
\r
4598 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing a song of healing..."));
\r
4599 start_singing(spell, MUSIC_L_LIFE);
\r
4606 if (info) return info_heal(dice, sides, 0);
\r
4610 hp_player(damroll(dice, sides));
\r
4617 if (name) return _("太陽の歌", "Song of the Sun");
\r
4618 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
\r
4620 /* Stop singing before start another */
\r
4621 if (cast || fail) stop_singing();
\r
4625 int sides = plev / 2;
\r
4626 int rad = plev / 10 + 1;
\r
4628 if (info) return info_damage(dice, sides, 0);
\r
4632 msg_print(_("光り輝く歌が辺りを照らした。", "Your uplifting song brings brightness to dark places..."));
\r
4633 lite_area(damroll(dice, sides), rad);
\r
4639 if (name) return _("恐怖の歌", "Song of Fear");
\r
4640 if (desc) return _("視界内の全てのモンスターを恐怖させる。抵抗されると無効。", "Attempts to scare all monsters in sight.");
\r
4642 /* Stop singing before start another */
\r
4643 if (cast || fail) stop_singing();
\r
4647 msg_print(_("おどろおどろしいメロディを奏で始めた...", "You start weaving a fearful pattern..."));
\r
4648 start_singing(spell, MUSIC_FEAR);
\r
4654 if (info) return info_power(power);
\r
4658 project_hack(GF_TURN_ALL, power);
\r
4665 if (name) return _("戦いの歌", "Heroic Ballad");
\r
4666 if (desc) return _("ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
4668 /* Stop singing before start another */
\r
4669 if (cast || fail) stop_singing();
\r
4673 msg_print(_("激しい戦いの歌を歌った...", "You start singing a song of intense fighting..."));
\r
4675 (void)hp_player(10);
\r
4676 (void)set_afraid(0);
\r
4678 /* Recalculate hitpoints */
\r
4679 p_ptr->update |= (PU_HP);
\r
4681 start_singing(spell, MUSIC_HERO);
\r
4688 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
\r
4689 /* Recalculate hitpoints */
\r
4690 p_ptr->update |= (PU_HP);
\r
4697 if (name) return _("霊的知覚", "Clairaudience");
\r
4698 if (desc) return _("近くの罠/扉/階段を感知する。レベル15で全てのモンスター、20で財宝とアイテムを感知できるようになる。レベル25で周辺の地形を感知し、40でその階全体を永久に照らし、ダンジョン内のすべてのアイテムを感知する。この効果は歌い続けることで順に起こる。",
\r
4699 "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
4701 /* Stop singing before start another */
\r
4702 if (cast || fail) stop_singing();
\r
4706 msg_print(_("静かな音楽が感覚を研ぎ澄まさせた...", "Your quiet music sharpens your sense of hearing..."));
\r
4707 /* Hack -- Initialize the turn count */
\r
4708 SINGING_COUNT(p_ptr) = 0;
\r
4709 start_singing(spell, MUSIC_DETECT);
\r
4713 int rad = DETECT_RAD_DEFAULT;
\r
4715 if (info) return info_radius(rad);
\r
4719 int count = SINGING_COUNT(p_ptr);
\r
4721 if (count >= 19) wiz_lite(FALSE);
\r
4725 if (plev > 39 && count < 19)
\r
4726 SINGING_COUNT(p_ptr) = count + 1;
\r
4730 /* There are too many hidden treasure. So... */
\r
4731 /* detect_treasure(rad); */
\r
4732 detect_objects_gold(rad);
\r
4733 detect_objects_normal(rad);
\r
4735 if (plev > 24 && count < 11)
\r
4736 SINGING_COUNT(p_ptr) = count + 1;
\r
4740 detect_monsters_invis(rad);
\r
4741 detect_monsters_normal(rad);
\r
4743 if (plev > 19 && count < 6)
\r
4744 SINGING_COUNT(p_ptr) = count + 1;
\r
4746 detect_traps(rad, TRUE);
\r
4747 detect_doors(rad);
\r
4748 detect_stairs(rad);
\r
4750 if (plev > 14 && count < 3)
\r
4751 SINGING_COUNT(p_ptr) = count + 1;
\r
4758 if (name) return _("魂の歌", "Soul Shriek");
\r
4759 if (desc) return _("視界内の全てのモンスターに対して精神攻撃を行う。", "Damages all monsters in sight with PSI damages.");
\r
4761 /* Stop singing before start another */
\r
4762 if (cast || fail) stop_singing();
\r
4766 msg_print(_("精神を捻じ曲げる歌を歌った...", "You start singing a song of soul in pain..."));
\r
4767 start_singing(spell, MUSIC_PSI);
\r
4772 int sides = plev * 3 / 2;
\r
4774 if (info) return info_damage(dice, sides, 0);
\r
4778 project_hack(GF_PSI, damroll(dice, sides));
\r
4785 if (name) return _("知識の歌", "Song of Lore");
\r
4786 if (desc) return _("自分のいるマスと隣りのマスに落ちているアイテムを鑑定する。", "Identifies all items which are in the adjacent squares.");
\r
4788 /* Stop singing before start another */
\r
4789 if (cast || fail) stop_singing();
\r
4793 msg_print(_("この世界の知識が流れ込んできた...", "You recall the rich lore of the world..."));
\r
4794 start_singing(spell, MUSIC_ID);
\r
4800 if (info) return info_radius(rad);
\r
4804 * MP不足で鑑定が発動される前に歌が中断してしまうのを防止。
\r
4808 project(0, rad, p_ptr->y, p_ptr->x, 0, GF_IDENTIFY, PROJECT_ITEM, -1);
\r
4815 if (name) return _("隠遁の歌", "Hiding Tune");
\r
4816 if (desc) return _("隠密行動能力を上昇させる。", "Gives improved stealth.");
\r
4818 /* Stop singing before start another */
\r
4819 if (cast || fail) stop_singing();
\r
4823 msg_print(_("あなたの姿が景色にとけこんでいった...", "Your song carries you beyond the sight of mortal eyes..."));
\r
4824 start_singing(spell, MUSIC_STEALTH);
\r
4829 if (!p_ptr->tim_stealth)
\r
4831 msg_print(_("姿がはっきりと見えるようになった。", "You are no longer hided."));
\r
4838 if (name) return _("幻影の旋律", "Illusion Pattern");
\r
4839 if (desc) return _("視界内の全てのモンスターを混乱させる。抵抗されると無効。", "Attempts to confuse all monsters in sight.");
\r
4841 /* Stop singing before start another */
\r
4842 if (cast || fail) stop_singing();
\r
4846 msg_print(_("辺り一面に幻影が現れた...", "You weave a pattern of sounds to beguile and confuse..."));
\r
4847 start_singing(spell, MUSIC_CONF);
\r
4851 int power = plev * 2;
\r
4853 if (info) return info_power(power);
\r
4857 confuse_monsters(power);
\r
4864 if (name) return _("破滅の叫び", "Doomcall");
\r
4865 if (desc) return _("視界内の全てのモンスターに対して轟音攻撃を行う。", "Damages all monsters in sight with booming sound.");
\r
4867 /* Stop singing before start another */
\r
4868 if (cast || fail) stop_singing();
\r
4872 msg_print(_("轟音が響いた...", "The fury of the Downfall of Numenor lashes out..."));
\r
4873 start_singing(spell, MUSIC_SOUND);
\r
4877 int dice = 10 + plev / 5;
\r
4880 if (info) return info_damage(dice, sides, 0);
\r
4884 project_hack(GF_SOUND, damroll(dice, sides));
\r
4891 if (name) return _("フィリエルの歌", "Firiel's Song");
\r
4892 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
\r
4895 /* Stop singing before start another */
\r
4896 if (cast || fail) stop_singing();
\r
4900 msg_print(_("生命と復活のテーマを奏で始めた...", "The themes of life and revival are woven into your song..."));
\r
4901 animate_dead(0, p_ptr->y, p_ptr->x);
\r
4907 if (name) return _("旅の仲間", "Fellowship Chant");
\r
4908 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
\r
4910 /* Stop singing before start another */
\r
4911 if (cast || fail) stop_singing();
\r
4915 msg_print(_("安らかなメロディを奏で始めた...", "You weave a slow, soothing melody of imploration..."));
\r
4916 start_singing(spell, MUSIC_CHARM);
\r
4920 int dice = 10 + plev / 15;
\r
4923 if (info) return info_power_dice(dice, sides);
\r
4927 charm_monsters(damroll(dice, sides));
\r
4934 if (name) return _("分解音波", "Sound of disintegration");
\r
4935 if (desc) return _("壁を掘り進む。自分の足元のアイテムは蒸発する。", "Makes you be able to burrow into walls. Objects under your feet evaporate.");
\r
4937 /* Stop singing before start another */
\r
4938 if (cast || fail) stop_singing();
\r
4942 msg_print(_("粉砕するメロディを奏で始めた...", "You weave a violent pattern of sounds to break wall."));
\r
4943 start_singing(spell, MUSIC_WALL);
\r
4949 * MP不足で効果が発動される前に歌が中断してしまうのを防止。
\r
4953 project(0, 0, p_ptr->y, p_ptr->x,
\r
4954 0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1);
\r
4960 if (name) return _("元素耐性", "Finrod's Resistance");
\r
4961 if (desc) return _("酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
\r
4962 "Gives resistance to fire, cold, electricity, acid and poison. These resistances can be added to which from equipment for more powerful resistances.");
\r
4964 /* Stop singing before start another */
\r
4965 if (cast || fail) stop_singing();
\r
4969 msg_print(_("元素の力に対する忍耐の歌を歌った。", "You sing a song of perseverance against powers..."));
\r
4970 start_singing(spell, MUSIC_RESIST);
\r
4975 if (!p_ptr->oppose_acid)
\r
4977 msg_print(_("酸への耐性が薄れた気がする。", "You feel less resistant to acid."));
\r
4980 if (!p_ptr->oppose_elec)
\r
4982 msg_print(_("電撃への耐性が薄れた気がする。", "You feel less resistant to elec."));
\r
4985 if (!p_ptr->oppose_fire)
\r
4987 msg_print(_("火への耐性が薄れた気がする。", "You feel less resistant to fire."));
\r
4990 if (!p_ptr->oppose_cold)
\r
4992 msg_print(_("冷気への耐性が薄れた気がする。", "You feel less resistant to cold."));
\r
4995 if (!p_ptr->oppose_pois)
\r
4997 msg_print(_("毒への耐性が薄れた気がする。", "You feel less resistant to pois."));
\r
5004 if (name) return _("ホビットのメロディ", "Hobbit Melodies");
\r
5005 if (desc) return _("加速する。", "Hastes you.");
\r
5007 /* Stop singing before start another */
\r
5008 if (cast || fail) stop_singing();
\r
5012 msg_print(_("軽快な歌を口ずさみ始めた...", "You start singing joyful pop song..."));
\r
5013 start_singing(spell, MUSIC_SPEED);
\r
5020 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
\r
5027 if (name) return _("歪んだ世界", "World Contortion");
\r
5028 if (desc) return _("近くのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all nearby monsters away unless resisted.");
\r
5031 int rad = plev / 15 + 1;
\r
5032 int power = plev * 3 + 1;
\r
5034 if (info) return info_radius(rad);
\r
5036 /* Stop singing before start another */
\r
5037 if (cast || fail) stop_singing();
\r
5041 msg_print(_("歌が空間を歪めた...", "Reality whirls wildly as you sing a dizzying melody..."));
\r
5042 project(0, rad, p_ptr->y, p_ptr->x, power, GF_AWAY_ALL, PROJECT_KILL, -1);
\r
5048 if (name) return _("退散の歌", "Dispelling chant");
\r
5049 if (desc) return _("視界内の全てのモンスターにダメージを与える。邪悪なモンスターに特に大きなダメージを与える。",
\r
5050 "Damages all monsters in sight. Hurts evil monsters greatly.");
\r
5052 /* Stop singing before start another */
\r
5053 if (cast || fail) stop_singing();
\r
5057 msg_print(_("耐えられない不協和音が敵を責め立てた...", "You cry out in an ear-wracking voice..."));
\r
5058 start_singing(spell, MUSIC_DISPEL);
\r
5062 int m_sides = plev * 3;
\r
5063 int e_sides = plev * 3;
\r
5065 if (info) return format("%s1d%d+1d%d", s_dam, m_sides, e_sides);
\r
5069 dispel_monsters(randint1(m_sides));
\r
5070 dispel_evil(randint1(e_sides));
\r
5076 if (name) return _("サルマンの甘言", "The Voice of Saruman");
\r
5077 if (desc) return _("視界内の全てのモンスターを減速させ、眠らせようとする。抵抗されると無効。", "Attempts to slow and sleep all monsters in sight.");
\r
5079 /* Stop singing before start another */
\r
5080 if (cast || fail) stop_singing();
\r
5084 msg_print(_("優しく、魅力的な歌を口ずさみ始めた...", "You start humming a gentle and attractive song..."));
\r
5085 start_singing(spell, MUSIC_SARUMAN);
\r
5091 if (info) return info_power(power);
\r
5095 slow_monsters(plev);
\r
5096 sleep_monsters(plev);
\r
5103 if (name) return _("嵐の音色", "Song of the Tempest");
\r
5104 if (desc) return _("轟音のビームを放つ。", "Fires a beam of sound.");
\r
5107 int dice = 15 + (plev - 1) / 2;
\r
5110 if (info) return info_damage(dice, sides, 0);
\r
5112 /* Stop singing before start another */
\r
5113 if (cast || fail) stop_singing();
\r
5117 if (!get_aim_dir(&dir)) return NULL;
\r
5119 fire_beam(GF_SOUND, dir, damroll(dice, sides));
\r
5125 if (name) return _("もう一つの世界", "Ambarkanta");
\r
5126 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
\r
5132 if (info) return info_delay(base, sides);
\r
5134 /* Stop singing before start another */
\r
5135 if (cast || fail) stop_singing();
\r
5139 msg_print(_("周囲が変化し始めた...", "You sing of the primeval shaping of Middle-earth..."));
\r
5146 if (name) return _("破壊の旋律", "Wrecking Pattern");
\r
5147 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
\r
5148 "Shakes dungeon structure, and results in random swapping of floors and walls.");
\r
5150 /* Stop singing before start another */
\r
5151 if (cast || fail) stop_singing();
\r
5155 msg_print(_("破壊的な歌が響きわたった...", "You weave a pattern of sounds to contort and shatter..."));
\r
5156 start_singing(spell, MUSIC_QUAKE);
\r
5162 if (info) return info_radius(rad);
\r
5166 earthquake(p_ptr->y, p_ptr->x, 10);
\r
5174 if (name) return _("停滞の歌", "Stationary Shriek");
\r
5175 if (desc) return _("視界内の全てのモンスターを麻痺させようとする。抵抗されると無効。", "Attempts to freeze all monsters in sight.");
\r
5177 /* Stop singing before start another */
\r
5178 if (cast || fail) stop_singing();
\r
5182 msg_print(_("ゆっくりとしたメロディを奏で始めた...", "You weave a very slow pattern which is almost likely to stop..."));
\r
5183 start_singing(spell, MUSIC_STASIS);
\r
5187 int power = plev * 4;
\r
5189 if (info) return info_power(power);
\r
5193 stasis_monsters(power);
\r
5200 if (name) return _("守りの歌", "Endurance");
\r
5201 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。",
\r
5202 "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
5205 /* Stop singing before start another */
\r
5206 if (cast || fail) stop_singing();
\r
5210 msg_print(_("歌が神聖な場を作り出した...", "The holy power of the Music is creating sacred field..."));
\r
5217 if (name) return _("英雄の詩", "The Hero's Poem");
\r
5218 if (desc) return _("加速し、ヒーロー気分になり、視界内の全てのモンスターにダメージを与える。",
\r
5219 "Hastes you. Gives heroism. Damages all monsters in sight.");
\r
5221 /* Stop singing before start another */
\r
5222 if (cast || fail) stop_singing();
\r
5226 msg_print(_("英雄の歌を口ずさんだ...", "You chant a powerful, heroic call to arms..."));
\r
5227 (void)hp_player(10);
\r
5228 (void)set_afraid(0);
\r
5230 /* Recalculate hitpoints */
\r
5231 p_ptr->update |= (PU_HP);
\r
5233 start_singing(spell, MUSIC_SHERO);
\r
5240 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
\r
5241 /* Recalculate hitpoints */
\r
5242 p_ptr->update |= (PU_HP);
\r
5247 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
\r
5253 int sides = plev * 3;
\r
5255 if (info) return info_damage(dice, sides, 0);
\r
5259 dispel_monsters(damroll(dice, sides));
\r
5265 if (name) return _("ヤヴァンナの助け", "Relief of Yavanna");
\r
5266 if (desc) return _("強力な回復の歌で、負傷と朦朧状態も全快する。", "Powerful healing song. Also heals cut and stun completely.");
\r
5268 /* Stop singing before start another */
\r
5269 if (cast || fail) stop_singing();
\r
5273 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing the song..."));
\r
5274 start_singing(spell, MUSIC_H_LIFE);
\r
5281 if (info) return info_heal(dice, sides, 0);
\r
5285 hp_player(damroll(dice, sides));
\r
5294 if (name) return _("再生の歌", "Goddess' rebirth");
\r
5295 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
\r
5298 /* Stop singing before start another */
\r
5299 if (cast || fail) stop_singing();
\r
5303 msg_print(_("暗黒の中に光と美をふりまいた。体が元の活力を取り戻した。",
\r
5304 "You strewed light and beauty in the dark as you sing. You feel refreshed."));
\r
5305 (void)do_res_stat(A_STR);
\r
5306 (void)do_res_stat(A_INT);
\r
5307 (void)do_res_stat(A_WIS);
\r
5308 (void)do_res_stat(A_DEX);
\r
5309 (void)do_res_stat(A_CON);
\r
5310 (void)do_res_stat(A_CHR);
\r
5311 (void)restore_level();
\r
5317 if (name) return _("サウロンの魔術", "Wizardry of Sauron");
\r
5318 if (desc) return _("非常に強力でごく小さい轟音の球を放つ。", "Fires an extremely powerful tiny ball of sound.");
\r
5321 int dice = 50 + plev;
\r
5325 if (info) return info_damage(dice, sides, 0);
\r
5327 /* Stop singing before start another */
\r
5328 if (cast || fail) stop_singing();
\r
5332 if (!get_aim_dir(&dir)) return NULL;
\r
5334 fire_ball(GF_SOUND, dir, damroll(dice, sides), rad);
\r
5340 if (name) return _("フィンゴルフィンの挑戦", "Fingolfin's Challenge");
\r
5341 if (desc) return _("ダメージを受けなくなるバリアを張る。",
\r
5342 "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks.");
\r
5344 /* Stop singing before start another */
\r
5345 if (cast || fail) stop_singing();
\r
5349 msg_print(_("フィンゴルフィンの冥王への挑戦を歌った...",
\r
5350 "You recall the valor of Fingolfin's challenge to the Dark Lord..."));
\r
5353 p_ptr->redraw |= (PR_MAP);
\r
5355 /* Update monsters */
\r
5356 p_ptr->update |= (PU_MONSTERS);
\r
5358 /* Window stuff */
\r
5359 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
\r
5361 start_singing(spell, MUSIC_INVULN);
\r
5366 if (!p_ptr->invuln)
\r
5368 msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));
\r
5370 p_ptr->redraw |= (PR_MAP);
\r
5372 /* Update monsters */
\r
5373 p_ptr->update |= (PU_MONSTERS);
\r
5375 /* Window stuff */
\r
5376 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
\r
5387 * @brief 剣術の各処理を行う
\r
5388 * @param spell 剣術ID
\r
5389 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_CAST)
\r
5390 * @return SPELL_NAME / SPELL_DESC 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
5392 static cptr do_hissatsu_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
5394 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
5395 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
5396 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
5399 int plev = p_ptr->lev;
\r
5404 if (name) return _("飛飯綱", "Tobi-Izuna");
\r
5405 if (desc) return _("2マス離れたところにいるモンスターを攻撃する。", "Attacks a two squares distant monster.");
\r
5409 project_length = 2;
\r
5410 if (!get_aim_dir(&dir)) return NULL;
\r
5412 project_hook(GF_ATTACK, dir, HISSATSU_2, PROJECT_STOP | PROJECT_KILL);
\r
5417 if (name) return _("五月雨斬り", "3-Way Attack");
\r
5418 if (desc) return _("3方向に対して攻撃する。", "Attacks in 3 directions in one time.");
\r
5425 if (!get_rep_dir2(&dir)) return NULL;
\r
5426 if (dir == 5) return NULL;
\r
5428 for (cdir = 0;cdir < 8; cdir++)
\r
5430 if (cdd[cdir] == dir) break;
\r
5433 if (cdir == 8) return NULL;
\r
5435 y = p_ptr->y + ddy_cdd[cdir];
\r
5436 x = p_ptr->x + ddx_cdd[cdir];
\r
5437 if (cave[y][x].m_idx)
\r
5438 py_attack(y, x, 0);
\r
5440 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
\r
5442 y = p_ptr->y + ddy_cdd[(cdir + 7) % 8];
\r
5443 x = p_ptr->x + ddx_cdd[(cdir + 7) % 8];
\r
5444 if (cave[y][x].m_idx)
\r
5445 py_attack(y, x, 0);
\r
5447 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
\r
5449 y = p_ptr->y + ddy_cdd[(cdir + 1) % 8];
\r
5450 x = p_ptr->x + ddx_cdd[(cdir + 1) % 8];
\r
5451 if (cave[y][x].m_idx)
\r
5452 py_attack(y, x, 0);
\r
5454 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
\r
5459 if (name) return _("ブーメラン", "Boomerang");
\r
5460 if (desc) return _("武器を手元に戻ってくるように投げる。戻ってこないこともある。",
\r
5461 "Throws current weapon. And it'll return to your hand unless failed.");
\r
5465 if (!do_cmd_throw(1, TRUE, -1)) return NULL;
\r
5470 if (name) return _("焔霊", "Burning Strike");
\r
5471 if (desc) return _("火炎耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to fire.");
\r
5477 if (!get_rep_dir2(&dir)) return NULL;
\r
5478 if (dir == 5) return NULL;
\r
5480 y = p_ptr->y + ddy[dir];
\r
5481 x = p_ptr->x + ddx[dir];
\r
5483 if (cave[y][x].m_idx)
\r
5484 py_attack(y, x, HISSATSU_FIRE);
\r
5487 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
5494 if (name) return _("殺気感知", "Detect Ferocity");
\r
5495 if (desc) return _("近くの思考することができるモンスターを感知する。", "Detects all monsters except mindless in your vicinity.");
\r
5499 detect_monsters_mind(DETECT_RAD_DEFAULT);
\r
5504 if (name) return _("みね打ち", "Strike to Stun");
\r
5505 if (desc) return _("相手にダメージを与えないが、朦朧とさせる。", "Attempts to stun a monster in the adjacent.");
\r
5511 if (!get_rep_dir2(&dir)) return NULL;
\r
5512 if (dir == 5) return NULL;
\r
5514 y = p_ptr->y + ddy[dir];
\r
5515 x = p_ptr->x + ddx[dir];
\r
5517 if (cave[y][x].m_idx)
\r
5518 py_attack(y, x, HISSATSU_MINEUCHI);
\r
5521 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
5528 if (name) return _("カウンター", "Counter");
\r
5529 if (desc) return _("相手に攻撃されたときに反撃する。反撃するたびにMPを消費。",
\r
5530 "Prepares to counterattack. When attack by a monster, strikes back using SP each time.");
\r
5534 if (p_ptr->riding)
\r
5536 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
\r
5539 msg_print(_("相手の攻撃に対して身構えた。", "You prepare to counter blow."));
\r
5540 p_ptr->counter = TRUE;
\r
5545 if (name) return _("払い抜け", "Harainuke");
\r
5546 if (desc) return _("攻撃した後、反対側に抜ける。",
\r
5547 "Attacks monster with your weapons normally, then move through counter side of the monster.");
\r
5553 if (p_ptr->riding)
\r
5555 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
\r
5559 if (!get_rep_dir2(&dir)) return NULL;
\r
5561 if (dir == 5) return NULL;
\r
5562 y = p_ptr->y + ddy[dir];
\r
5563 x = p_ptr->x + ddx[dir];
\r
5565 if (!cave[y][x].m_idx)
\r
5567 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
5571 py_attack(y, x, 0);
\r
5573 if (!player_can_enter(cave[y][x].feat, 0) || is_trap(cave[y][x].feat))
\r
5579 if (player_can_enter(cave[y][x].feat, 0) && !is_trap(cave[y][x].feat) && !cave[y][x].m_idx)
\r
5583 /* Move the player */
\r
5584 (void)move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);
\r
5590 if (name) return _("サーペンツタン", "Serpent's Tongue");
\r
5591 if (desc) return _("毒耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to poison.");
\r
5597 if (!get_rep_dir2(&dir)) return NULL;
\r
5598 if (dir == 5) return NULL;
\r
5600 y = p_ptr->y + ddy[dir];
\r
5601 x = p_ptr->x + ddx[dir];
\r
5603 if (cave[y][x].m_idx)
\r
5604 py_attack(y, x, HISSATSU_POISON);
\r
5607 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
5614 if (name) return _("斬魔剣弐の太刀", "Zammaken");
\r
5615 if (desc) return _("生命のない邪悪なモンスターに大ダメージを与えるが、他のモンスターには全く効果がない。",
\r
5616 "Attacks an evil unliving monster with great damage. No effect to other monsters.");
\r
5622 if (!get_rep_dir2(&dir)) return NULL;
\r
5623 if (dir == 5) return NULL;
\r
5625 y = p_ptr->y + ddy[dir];
\r
5626 x = p_ptr->x + ddx[dir];
\r
5628 if (cave[y][x].m_idx)
\r
5629 py_attack(y, x, HISSATSU_ZANMA);
\r
5632 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
5639 if (name) return _("裂風剣", "Wind Blast");
\r
5640 if (desc) return _("攻撃した相手を後方へ吹き飛ばす。", "Attacks an adjacent monster, and blow it away.");
\r
5646 if (!get_rep_dir2(&dir)) return NULL;
\r
5647 if (dir == 5) return NULL;
\r
5649 y = p_ptr->y + ddy[dir];
\r
5650 x = p_ptr->x + ddx[dir];
\r
5652 if (cave[y][x].m_idx)
\r
5653 py_attack(y, x, 0);
\r
5656 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
5659 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
\r
5663 if (cave[y][x].m_idx)
\r
5666 POSITION ty = y, tx = x;
\r
5667 POSITION oy = y, ox = x;
\r
5668 MONSTER_IDX m_idx = cave[y][x].m_idx;
\r
5669 monster_type *m_ptr = &m_list[m_idx];
\r
5672 monster_desc(m_name, m_ptr, 0);
\r
5674 for (i = 0; i < 5; i++)
\r
5678 if (cave_empty_bold(y, x))
\r
5685 if ((ty != oy) || (tx != ox))
\r
5687 msg_format(_("%sを吹き飛ばした!", "You blow %s away!"), m_name);
\r
5688 cave[oy][ox].m_idx = 0;
\r
5689 cave[ty][tx].m_idx = m_idx;
\r
5693 update_mon(m_idx, TRUE);
\r
5694 lite_spot(oy, ox);
\r
5695 lite_spot(ty, tx);
\r
5697 if (r_info[m_ptr->r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))
\r
5698 p_ptr->update |= (PU_MON_LITE);
\r
5705 if (name) return _("刀匠の目利き", "Judge");
\r
5706 if (desc) return _("武器・防具を1つ識別する。レベル45以上で武器・防具の能力を完全に知ることができる。",
\r
5707 "Identifies a weapon or armor. Or *identifies* these at level 45.");
\r
5713 if (!identify_fully(TRUE)) return NULL;
\r
5717 if (!ident_spell(TRUE)) return NULL;
\r
5723 if (name) return _("破岩斬", "Rock Smash");
\r
5724 if (desc) return _("岩を壊し、岩石系のモンスターに大ダメージを与える。", "Breaks rock. Or greatly damage a monster made by rocks.");
\r
5730 if (!get_rep_dir2(&dir)) return NULL;
\r
5731 if (dir == 5) return NULL;
\r
5733 y = p_ptr->y + ddy[dir];
\r
5734 x = p_ptr->x + ddx[dir];
\r
5736 if (cave[y][x].m_idx)
\r
5737 py_attack(y, x, HISSATSU_HAGAN);
\r
5739 if (!cave_have_flag_bold(y, x, FF_HURT_ROCK)) break;
\r
5741 /* Destroy the feature */
\r
5742 cave_alter_feat(y, x, FF_HURT_ROCK);
\r
5744 /* Update some things */
\r
5745 p_ptr->update |= (PU_FLOW);
\r
5750 if (name) return _("乱れ雪月花", "Midare-Setsugekka");
\r
5751 if (desc) return _("攻撃回数が増え、冷気耐性のないモンスターに大ダメージを与える。",
\r
5752 "Attacks a monster with increased number of attacks and more damage unless it has resistance to cold.");
\r
5758 if (!get_rep_dir2(&dir)) return NULL;
\r
5759 if (dir == 5) return NULL;
\r
5761 y = p_ptr->y + ddy[dir];
\r
5762 x = p_ptr->x + ddx[dir];
\r
5764 if (cave[y][x].m_idx)
\r
5765 py_attack(y, x, HISSATSU_COLD);
\r
5768 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
5775 if (name) return _("急所突き", "Spot Aiming");
\r
5776 if (desc) return _("モンスターを一撃で倒す攻撃を繰り出す。失敗すると1点しかダメージを与えられない。",
\r
5777 "Attempts to kill a monster instantly. If failed cause only 1HP of damage.");
\r
5783 if (!get_rep_dir2(&dir)) return NULL;
\r
5784 if (dir == 5) return NULL;
\r
5786 y = p_ptr->y + ddy[dir];
\r
5787 x = p_ptr->x + ddx[dir];
\r
5789 if (cave[y][x].m_idx)
\r
5790 py_attack(y, x, HISSATSU_KYUSHO);
\r
5793 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
5800 if (name) return _("魔神斬り", "Majingiri");
\r
5801 if (desc) return _("会心の一撃で攻撃する。攻撃がかわされやすい。",
\r
5802 "Attempts to attack with critical hit. But this attack is easy to evade for a monster.");
\r
5808 if (!get_rep_dir2(&dir)) return NULL;
\r
5809 if (dir == 5) return NULL;
\r
5811 y = p_ptr->y + ddy[dir];
\r
5812 x = p_ptr->x + ddx[dir];
\r
5814 if (cave[y][x].m_idx)
\r
5815 py_attack(y, x, HISSATSU_MAJIN);
\r
5818 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
5825 if (name) return _("捨て身", "Desperate Attack");
\r
5826 if (desc) return _("強力な攻撃を繰り出す。次のターンまでの間、食らうダメージが増える。",
\r
5827 "Attacks with all of your power. But all damages you take will be doubled for one turn.");
\r
5833 if (!get_rep_dir2(&dir)) return NULL;
\r
5834 if (dir == 5) return NULL;
\r
5836 y = p_ptr->y + ddy[dir];
\r
5837 x = p_ptr->x + ddx[dir];
\r
5839 if (cave[y][x].m_idx)
\r
5840 py_attack(y, x, HISSATSU_SUTEMI);
\r
5843 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
5846 p_ptr->sutemi = TRUE;
\r
5851 if (name) return _("雷撃鷲爪斬", "Lightning Eagle");
\r
5852 if (desc) return _("電撃耐性のないモンスターに非常に大きいダメージを与える。",
\r
5853 "Attacks a monster with more damage unless it has resistance to electricity.");
\r
5859 if (!get_rep_dir2(&dir)) return NULL;
\r
5860 if (dir == 5) return NULL;
\r
5862 y = p_ptr->y + ddy[dir];
\r
5863 x = p_ptr->x + ddx[dir];
\r
5865 if (cave[y][x].m_idx)
\r
5866 py_attack(y, x, HISSATSU_ELEC);
\r
5869 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
5876 if (name) return _("入身", "Rush Attack");
\r
5877 if (desc) return _("素早く相手に近寄り攻撃する。", "Steps close to a monster and attacks at a time.");
\r
5881 if (!rush_attack(NULL)) return NULL;
\r
5886 if (name) return _("赤流渦", "Bloody Maelstrom");
\r
5887 if (desc) return _("自分自身も傷を作りつつ、その傷が深いほど大きい威力で全方向の敵を攻撃できる。生きていないモンスターには効果がない。",
\r
5888 "Attacks all adjacent monsters with power corresponding to your cut status. Then increases your cut status. No effect to unliving monsters.");
\r
5895 monster_type *m_ptr;
\r
5897 if (p_ptr->cut < 300)
\r
5898 set_cut(p_ptr->cut + 300);
\r
5900 set_cut(p_ptr->cut * 2);
\r
5902 for (dir = 0; dir < 8; dir++)
\r
5904 y = p_ptr->y + ddy_ddd[dir];
\r
5905 x = p_ptr->x + ddx_ddd[dir];
\r
5906 c_ptr = &cave[y][x];
\r
5908 /* Get the monster */
\r
5909 m_ptr = &m_list[c_ptr->m_idx];
\r
5911 /* Hack -- attack monsters */
\r
5912 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
\r
5914 if (!monster_living(&r_info[m_ptr->r_idx]))
\r
5918 monster_desc(m_name, m_ptr, 0);
\r
5919 msg_format(_("%sには効果がない!", "%s is unharmed!"), m_name);
\r
5921 else py_attack(y, x, HISSATSU_SEKIRYUKA);
\r
5928 if (name) return _("激震撃", "Earthquake Blow");
\r
5929 if (desc) return _("地震を起こす。", "Shakes dungeon structure, and results in random swapping of floors and walls.");
\r
5935 if (!get_rep_dir2(&dir)) return NULL;
\r
5936 if (dir == 5) return NULL;
\r
5938 y = p_ptr->y + ddy[dir];
\r
5939 x = p_ptr->x + ddx[dir];
\r
5941 if (cave[y][x].m_idx)
\r
5942 py_attack(y, x, HISSATSU_QUAKE);
\r
5944 earthquake(p_ptr->y, p_ptr->x, 10);
\r
5949 if (name) return _("地走り", "Crack");
\r
5950 if (desc) return _("衝撃波のビームを放つ。", "Fires a beam of shock wave.");
\r
5954 int total_damage = 0, basedam, i;
\r
5955 u32b flgs[TR_FLAG_SIZE];
\r
5956 object_type *o_ptr;
\r
5957 if (!get_aim_dir(&dir)) return NULL;
\r
5958 msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
\r
5959 for (i = 0; i < 2; i++)
\r
5963 if (!buki_motteruka(INVEN_RARM+i)) break;
\r
5964 o_ptr = &inventory[INVEN_RARM+i];
\r
5965 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
\r
5966 damage = o_ptr->to_d * 100;
\r
5967 object_flags(o_ptr, flgs);
\r
5968 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
\r
5970 /* vorpal blade */
\r
5974 else if (have_flag(flgs, TR_VORPAL))
\r
5976 /* vorpal flag only */
\r
5980 damage += basedam;
\r
5981 damage *= p_ptr->num_blow[i];
\r
5982 total_damage += damage / 200;
\r
5983 if (i) total_damage = total_damage*7/10;
\r
5985 fire_beam(GF_FORCE, dir, total_damage);
\r
5990 if (name) return _("気迫の雄叫び", "War Cry");
\r
5991 if (desc) return _("視界内の全モンスターに対して轟音の攻撃を行う。さらに、近くにいるモンスターを怒らせる。",
\r
5992 "Damages all monsters in sight with sound. Aggravate nearby monsters.");
\r
5996 msg_print(_("雄叫びをあげた!", "You roar out!"));
\r
5997 project_hack(GF_SOUND, randint1(plev * 3));
\r
5998 aggravate_monsters(0);
\r
6003 if (name) return _("無双三段", "Musou-Sandan");
\r
6004 if (desc) return _("強力な3段攻撃を繰り出す。", "Attacks with powerful 3 strikes.");
\r
6010 if (!get_rep_dir2(&dir)) return NULL;
\r
6011 if (dir == 5) return NULL;
\r
6013 for (i = 0; i < 3; i++)
\r
6017 MONSTER_IDX m_idx;
\r
6019 monster_type *m_ptr;
\r
6021 y = p_ptr->y + ddy[dir];
\r
6022 x = p_ptr->x + ddx[dir];
\r
6023 c_ptr = &cave[y][x];
\r
6026 py_attack(y, x, HISSATSU_3DAN);
\r
6029 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
6033 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
\r
6038 /* Monster is dead? */
\r
6039 if (!c_ptr->m_idx) break;
\r
6041 ny = y + ddy[dir];
\r
6042 nx = x + ddx[dir];
\r
6043 m_idx = c_ptr->m_idx;
\r
6044 m_ptr = &m_list[m_idx];
\r
6046 /* Monster cannot move back? */
\r
6047 if (!monster_can_enter(ny, nx, &r_info[m_ptr->r_idx], 0))
\r
6050 if (i < 2) msg_print(NULL);
\r
6055 cave[ny][nx].m_idx = m_idx;
\r
6059 update_mon(m_idx, TRUE);
\r
6061 /* Redraw the old spot */
\r
6064 /* Redraw the new spot */
\r
6065 lite_spot(ny, nx);
\r
6067 /* Player can move forward? */
\r
6068 if (player_can_enter(c_ptr->feat, 0))
\r
6070 /* Move the player */
\r
6071 if (!move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP)) break;
\r
6079 if (i < 2) msg_print(NULL);
\r
6085 if (name) return _("吸血鬼の牙", "Vampire's Fang");
\r
6086 if (desc) return _("攻撃した相手の体力を吸いとり、自分の体力を回復させる。生命を持たないモンスターには通じない。",
\r
6087 "Attacks with vampiric strikes which absorbs HP from a monster and gives them to you. No effect to unliving monsters.");
\r
6093 if (!get_rep_dir2(&dir)) return NULL;
\r
6094 if (dir == 5) return NULL;
\r
6096 y = p_ptr->y + ddy[dir];
\r
6097 x = p_ptr->x + ddx[dir];
\r
6099 if (cave[y][x].m_idx)
\r
6100 py_attack(y, x, HISSATSU_DRAIN);
\r
6103 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
6110 if (name) return _("幻惑", "Moon Dazzling");
\r
6111 if (desc) return _("視界内の起きている全モンスターに朦朧、混乱、眠りを与えようとする。", "Attempts to stun, confuse and sleep all waking monsters.");
\r
6115 msg_print(_("武器を不規則に揺らした...", "You irregularly wave your weapon..."));
\r
6116 project_hack(GF_ENGETSU, plev * 4);
\r
6117 project_hack(GF_ENGETSU, plev * 4);
\r
6118 project_hack(GF_ENGETSU, plev * 4);
\r
6123 if (name) return _("百人斬り", "Hundred Slaughter");
\r
6124 if (desc) return _("連続して入身でモンスターを攻撃する。攻撃するたびにMPを消費。MPがなくなるか、モンスターを倒せなかったら百人斬りは終了する。",
\r
6125 "Performs a series of rush attacks. The series continues while killing each monster in a time and SP remains.");
\r
6129 const int mana_cost_per_monster = 8;
\r
6130 bool is_new = TRUE;
\r
6135 if (!rush_attack(&mdeath)) break;
\r
6138 /* Reserve needed mana point */
\r
6139 p_ptr->csp -= technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
\r
6143 p_ptr->csp -= mana_cost_per_monster;
\r
6145 if (!mdeath) break;
\r
6148 p_ptr->redraw |= PR_MANA;
\r
6151 while (p_ptr->csp > mana_cost_per_monster);
\r
6153 if (is_new) return NULL;
\r
6155 /* Restore reserved mana */
\r
6156 p_ptr->csp += technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
\r
6161 if (name) return _("天翔龍閃", "Dragonic Flash");
\r
6162 if (desc) return _("視界内の場所を指定して、その場所と自分の間にいる全モンスターを攻撃し、その場所に移動する。",
\r
6163 "Runs toward given location while attacking all monsters on the path.");
\r
6169 if (!tgt_pt(&x, &y)) return NULL;
\r
6171 if (!cave_player_teleportable_bold(y, x, 0L) ||
\r
6172 (distance(y, x, p_ptr->y, p_ptr->x) > MAX_SIGHT / 2) ||
\r
6173 !projectable(p_ptr->y, p_ptr->x, y, x))
\r
6175 msg_print(_("失敗!", "You cannot move to that place!"));
\r
6178 if (p_ptr->anti_tele)
\r
6180 msg_print(_("不思議な力がテレポートを防いだ!", "A mysterious force prevents you from teleporting!"));
\r
6183 project(0, 0, y, x, HISSATSU_ISSEN, GF_ATTACK, PROJECT_BEAM | PROJECT_KILL, -1);
\r
6184 teleport_player_to(y, x, 0L);
\r
6189 if (name) return _("二重の剣撃", "Twin Slash");
\r
6190 if (desc) return _("1ターンで2度攻撃を行う。", "double attacks at a time.");
\r
6196 if (!get_rep_dir(&dir, FALSE)) return NULL;
\r
6198 y = p_ptr->y + ddy[dir];
\r
6199 x = p_ptr->x + ddx[dir];
\r
6201 if (cave[y][x].m_idx)
\r
6203 py_attack(y, x, 0);
\r
6204 if (cave[y][x].m_idx)
\r
6207 py_attack(y, x, 0);
\r
6212 msg_print(_("その方向にはモンスターはいません。", "You don't see any monster in this direction"));
\r
6219 if (name) return _("虎伏絶刀勢", "Kofuku-Zettousei");
\r
6220 if (desc) return _("強力な攻撃を行い、近くの場所にも効果が及ぶ。", "Performs a powerful attack which even effect nearby monsters.");
\r
6224 int total_damage = 0, basedam, i;
\r
6226 u32b flgs[TR_FLAG_SIZE];
\r
6227 object_type *o_ptr;
\r
6229 if (!get_rep_dir2(&dir)) return NULL;
\r
6230 if (dir == 5) return NULL;
\r
6232 y = p_ptr->y + ddy[dir];
\r
6233 x = p_ptr->x + ddx[dir];
\r
6235 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
\r
6237 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));
\r
6240 msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
\r
6241 for (i = 0; i < 2; i++)
\r
6244 if (!buki_motteruka(INVEN_RARM+i)) break;
\r
6245 o_ptr = &inventory[INVEN_RARM+i];
\r
6246 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
\r
6247 damage = o_ptr->to_d * 100;
\r
6248 object_flags(o_ptr, flgs);
\r
6249 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
\r
6251 /* vorpal blade */
\r
6255 else if (have_flag(flgs, TR_VORPAL))
\r
6257 /* vorpal flag only */
\r
6261 damage += basedam;
\r
6262 damage += p_ptr->to_d[i] * 100;
\r
6263 damage *= p_ptr->num_blow[i];
\r
6264 total_damage += (damage / 100);
\r
6266 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
6271 if (name) return _("慶雲鬼忍剣", "Keiun-Kininken");
\r
6272 if (desc) return _("自分もダメージをくらうが、相手に非常に大きなダメージを与える。アンデッドには特に効果がある。",
\r
6273 "Attacks a monster with extremely powerful damage. But you also takes some damages. Hurts a undead monster greatly.");
\r
6279 if (!get_rep_dir2(&dir)) return NULL;
\r
6280 if (dir == 5) return NULL;
\r
6282 y = p_ptr->y + ddy[dir];
\r
6283 x = p_ptr->x + ddx[dir];
\r
6285 if (cave[y][x].m_idx)
\r
6286 py_attack(y, x, HISSATSU_UNDEAD);
\r
6289 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
6292 take_hit(DAMAGE_NOESCAPE, 100 + randint1(100), _("慶雲鬼忍剣を使った衝撃", "exhaustion on using Keiun-Kininken"), -1);
\r
6297 if (name) return _("切腹", "Harakiri");
\r
6298 if (desc) return _("「武士道とは、死ぬことと見つけたり。」", "'Busido is found in death'");
\r
6303 if (!get_check(_("本当に自殺しますか?", "Do you really want to commit suicide? "))) return NULL;
\r
6304 /* Special Verification for suicide */
\r
6305 prt(_("確認のため '@' を押して下さい。", "Please verify SUICIDE by typing the '@' sign: "), 0, 0);
\r
6310 if (i != '@') return NULL;
\r
6311 if (p_ptr->total_winner)
\r
6313 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
\r
6314 p_ptr->total_winner = TRUE;
\r
6318 msg_print(_("武士道とは、死ぬことと見つけたり。", "Meaning of Bushi-do is found in the death."));
\r
6319 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
\r
6329 * @brief 呪術領域の武器呪縛の対象にできる武器かどうかを返す。 / An "item_tester_hook" for offer
\r
6330 * @param o_ptr オブジェクト構造体の参照ポインタ
\r
6331 * @return 呪縛可能な武器ならばTRUEを返す
\r
6333 static bool item_tester_hook_weapon_except_bow(object_type *o_ptr)
\r
6335 switch (o_ptr->tval)
\r
6350 * @brief 呪術領域の各処理に使える呪われた装備かどうかを返す。 / An "item_tester_hook" for offer
\r
6351 * @param o_ptr オブジェクト構造体の参照ポインタ
\r
6352 * @return 使える装備ならばTRUEを返す
\r
6354 static bool item_tester_hook_cursed(object_type *o_ptr)
\r
6356 return (bool)(object_is_cursed(o_ptr));
\r
6360 * @brief 呪術領域魔法の各処理を行う
\r
6361 * @param spell 魔法ID
\r
6362 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_CONT / SPELL_STOP)
\r
6363 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
\r
6365 static cptr do_hex_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
6367 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
6368 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
6369 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
6370 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
6371 bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
\r
6372 bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
\r
6376 PLAYER_LEVEL plev = p_ptr->lev;
\r
6381 /*** 1st book (0-7) ***/
\r
6383 if (name) return _("邪なる祝福", "Evily blessing");
\r
6384 if (desc) return _("祝福により攻撃精度と防御力が上がる。", "Attempts to increase +to_hit of a weapon and AC");
\r
6387 if (!p_ptr->blessed)
\r
6389 msg_print(_("高潔な気分になった!", "You feel righteous!"));
\r
6394 if (!p_ptr->blessed)
\r
6396 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
\r
6402 if (name) return _("軽傷の治癒", "Cure light wounds");
\r
6403 if (desc) return _("HPや傷を少し回復させる。", "Heals cut and HP a little.");
\r
6404 if (info) return info_heal(1, 10, 0);
\r
6407 msg_print(_("気分が良くなってくる。", "You feel better and better."));
\r
6411 hp_player(damroll(1, 10));
\r
6412 set_cut(p_ptr->cut - 10);
\r
6417 if (name) return _("悪魔のオーラ", "Demonic aura");
\r
6418 if (desc) return _("炎のオーラを身にまとい、回復速度が速くなる。", "Gives fire aura and regeneration.");
\r
6421 msg_print(_("体が炎のオーラで覆われた。", "You have enveloped by fiery aura!"));
\r
6425 msg_print(_("炎のオーラが消え去った。", "Fiery aura disappeared."));
\r
6430 if (name) return _("悪臭霧", "Stinking mist");
\r
6431 if (desc) return _("視界内のモンスターに微弱量の毒のダメージを与える。", "Deals few damages of poison to all monsters in your sight.");
\r
6432 power = plev / 2 + 5;
\r
6433 if (info) return info_damage(1, power, 0);
\r
6436 project_hack(GF_POIS, randint1(power));
\r
6441 if (name) return _("腕力強化", "Extra might");
\r
6442 if (desc) return _("術者の腕力を上昇させる。", "Attempts to increase your strength.");
\r
6445 msg_print(_("何だか力が湧いて来る。", "You feel you get stronger."));
\r
6450 if (name) return _("武器呪縛", "Curse weapon");
\r
6451 if (desc) return _("装備している武器を呪う。", "Curses your weapon.");
\r
6456 char o_name[MAX_NLEN];
\r
6457 object_type *o_ptr;
\r
6458 u32b f[TR_FLAG_SIZE];
\r
6460 item_tester_hook = item_tester_hook_weapon_except_bow;
\r
6461 q = _("どれを呪いますか?", "Which weapon do you curse?");
\r
6462 s = _("武器を装備していない。", "You wield no weapons.");
\r
6464 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
\r
6466 o_ptr = &inventory[item];
\r
6467 object_desc(o_name, o_ptr, OD_NAME_ONLY);
\r
6468 object_flags(o_ptr, f);
\r
6470 if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
\r
6472 if (!one_in_(3) &&
\r
6473 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
\r
6475 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
\r
6478 if (o_ptr->to_d > 0)
\r
6480 o_ptr->to_d -= randint1(3) % 2;
\r
6481 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
\r
6483 if (o_ptr->to_h > 0)
\r
6485 o_ptr->to_h -= randint1(3) % 2;
\r
6486 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
\r
6488 if (o_ptr->to_a > 0)
\r
6490 o_ptr->to_a -= randint1(3) % 2;
\r
6491 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
\r
6493 msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
\r
6498 int curse_rank = 0;
\r
6499 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
\r
6500 o_ptr->curse_flags |= (TRC_CURSED);
\r
6502 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
\r
6505 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
\r
6508 o_ptr->curse_flags |= (TRC_TY_CURSE);
\r
6509 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
\r
6511 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
\r
6512 add_flag(o_ptr->art_flags, TR_VORPAL);
\r
6513 add_flag(o_ptr->art_flags, TR_VAMPIRIC);
\r
6514 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
\r
6519 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);
\r
6522 p_ptr->update |= (PU_BONUS);
\r
6528 if (name) return _("邪悪感知", "Evil detection");
\r
6529 if (desc) return _("周囲の邪悪なモンスターを感知する。", "Detects evil monsters.");
\r
6530 if (info) return info_range(MAX_SIGHT);
\r
6533 msg_print(_("邪悪な生物の存在を感じ取ろうとした。", "You attend to the presence of evil creatures."));
\r
6538 if (name) return _("我慢", "Patience");
\r
6539 if (desc) return _("数ターン攻撃を耐えた後、受けたダメージを地獄の業火として周囲に放出する。",
\r
6540 "Bursts hell fire strongly after patients any damage while few turns.");
\r
6541 power = MIN(200, (HEX_REVENGE_POWER(p_ptr) * 2));
\r
6542 if (info) return info_damage(0, 0, power);
\r
6545 int a = 3 - (p_ptr->pspeed - 100) / 10;
\r
6546 MAGIC_NUM2 r = 3 + randint1(3) + MAX(0, MIN(3, a));
\r
6548 if (HEX_REVENGE_TURN(p_ptr) > 0)
\r
6550 msg_print(_("すでに我慢をしている。", "You are already patienting."));
\r
6554 HEX_REVENGE_TYPE(p_ptr) = 1;
\r
6555 HEX_REVENGE_TURN(p_ptr) = r;
\r
6556 HEX_REVENGE_POWER(p_ptr) = 0;
\r
6557 msg_print(_("じっと耐えることにした。", "You decide to patient all damages."));
\r
6562 int rad = 2 + (power / 50);
\r
6564 HEX_REVENGE_TURN(p_ptr)--;
\r
6566 if ((HEX_REVENGE_TURN(p_ptr) <= 0) || (power >= 200))
\r
6568 msg_print(_("我慢が解かれた!", "Time for end of patioence!"));
\r
6571 project(0, rad, p_ptr->y, p_ptr->x, power, GF_HELL_FIRE,
\r
6572 (PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);
\r
6574 if (p_ptr->wizard)
\r
6576 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
\r
6580 HEX_REVENGE_TYPE(p_ptr) = 0;
\r
6581 HEX_REVENGE_TURN(p_ptr) = 0;
\r
6582 HEX_REVENGE_POWER(p_ptr) = 0;
\r
6587 /*** 2nd book (8-15) ***/
\r
6589 if (name) return _("氷の鎧", "Ice armor");
\r
6590 if (desc) return _("氷のオーラを身にまとい、防御力が上昇する。", "Gives fire aura and bonus to AC.");
\r
6593 msg_print(_("体が氷の鎧で覆われた。", "You have enveloped by ice armor!"));
\r
6597 msg_print(_("氷の鎧が消え去った。", "Ice armor disappeared."));
\r
6602 if (name) return _("重傷の治癒", "Cure serious wounds");
\r
6603 if (desc) return _("体力や傷を多少回復させる。", "Heals cut and HP more.");
\r
6604 if (info) return info_heal(2, 10, 0);
\r
6607 msg_print(_("気分が良くなってくる。", "You feel better and better."));
\r
6611 hp_player(damroll(2, 10));
\r
6612 set_cut((p_ptr->cut / 2) - 10);
\r
6617 if (name) return _("薬品吸入", "Inhail potion");
\r
6618 if (desc) return _("呪文詠唱を中止することなく、薬の効果を得ることができる。", "Quaffs a potion without canceling of casting a spell.");
\r
6621 CASTING_HEX_FLAGS(p_ptr) |= (1L << HEX_INHAIL);
\r
6622 do_cmd_quaff_potion();
\r
6623 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_INHAIL);
\r
6629 if (name) return _("衰弱の霧", "Hypodynamic mist");
\r
6630 if (desc) return _("視界内のモンスターに微弱量の衰弱属性のダメージを与える。",
\r
6631 "Deals few damages of hypodynamia to all monsters in your sight.");
\r
6632 power = (plev / 2) + 5;
\r
6633 if (info) return info_damage(1, power, 0);
\r
6636 project_hack(GF_HYPODYNAMIA, randint1(power));
\r
6641 if (name) return _("魔剣化", "Swords to runeswords");
\r
6642 if (desc) return _("武器の攻撃力を上げる。切れ味を得、呪いに応じて与えるダメージが上昇し、善良なモンスターに対するダメージが2倍になる。",
\r
6643 "Gives vorpal ability to your weapon. Increases damages by your weapon acccording to curse of your weapon.");
\r
6647 msg_print("あなたの武器が黒く輝いた。");
\r
6649 if (!empty_hands(FALSE))
\r
6650 msg_print("Your weapons glow bright black.");
\r
6652 msg_print("Your weapon glows bright black.");
\r
6658 msg_print("武器の輝きが消え去った。");
\r
6660 msg_format("Brightness of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
\r
6666 if (name) return _("混乱の手", "Touch of confusion");
\r
6667 if (desc) return _("攻撃した際モンスターを混乱させる。", "Confuses a monster when you attack.");
\r
6670 msg_print(_("あなたの手が赤く輝き始めた。", "Your hands glow bright red."));
\r
6674 msg_print(_("手の輝きがなくなった。", "Brightness on your hands disappeard."));
\r
6679 if (name) return _("肉体強化", "Building up");
\r
6680 if (desc) return _("術者の腕力、器用さ、耐久力を上昇させる。攻撃回数の上限を 1 増加させる。",
\r
6681 "Attempts to increases your strength, dexterity and constitusion.");
\r
6684 msg_print(_("身体が強くなった気がした。", "You feel your body is developed more now."));
\r
6689 if (name) return _("反テレポート結界", "Anti teleport barrier");
\r
6690 if (desc) return _("視界内のモンスターのテレポートを阻害するバリアを張る。", "Obstructs all teleportations by monsters in your sight.");
\r
6691 power = plev * 3 / 2;
\r
6692 if (info) return info_power(power);
\r
6695 msg_print(_("テレポートを防ぐ呪いをかけた。", "You feel anyone can not teleport except you."));
\r
6699 /*** 3rd book (16-23) ***/
\r
6701 if (name) return _("衝撃のクローク", "Cloak of shock");
\r
6702 if (desc) return _("電気のオーラを身にまとい、動きが速くなる。", "Gives lightning aura and a bonus to speed.");
\r
6705 msg_print(_("体が稲妻のオーラで覆われた。", "You have enveloped by electrical aura!"));
\r
6709 msg_print(_("稲妻のオーラが消え去った。", "Electrical aura disappeared."));
\r
6714 if (name) return _("致命傷の治癒", "Cure critical wounds");
\r
6715 if (desc) return _("体力や傷を回復させる。", "Heals cut and HP greatry.");
\r
6716 if (info) return info_heal(4, 10, 0);
\r
6719 msg_print(_("気分が良くなってくる。", "You feel better and better."));
\r
6723 hp_player(damroll(4, 10));
\r
6731 if (name) return _("呪力封入", "Recharging");
\r
6732 if (desc) return _("魔法の道具に魔力を再充填する。", "Recharges a magic device.");
\r
6734 if (info) return info_power(power);
\r
6737 if (!recharge(power)) return NULL;
\r
6743 if (name) return _("死者復活", "Animate Dead");
\r
6744 if (desc) return _("死体を蘇らせてペットにする。", "Raises corpses and skeletons from dead.");
\r
6747 msg_print(_("死者への呼びかけを始めた。", "You start to call deads.!"));
\r
6751 animate_dead(0, p_ptr->y, p_ptr->x);
\r
6756 if (name) return _("防具呪縛", "Curse armor");
\r
6757 if (desc) return _("装備している防具に呪いをかける。", "Curse a piece of armour that you wielding.");
\r
6762 char o_name[MAX_NLEN];
\r
6763 object_type *o_ptr;
\r
6764 u32b f[TR_FLAG_SIZE];
\r
6766 item_tester_hook = object_is_armour;
\r
6767 q = _("どれを呪いますか?", "Which piece of armour do you curse?");
\r
6768 s = _("防具を装備していない。", "You wield no piece of armours.");
\r
6770 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
\r
6772 o_ptr = &inventory[item];
\r
6773 object_desc(o_name, o_ptr, OD_NAME_ONLY);
\r
6774 object_flags(o_ptr, f);
\r
6776 if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
\r
6778 if (!one_in_(3) &&
\r
6779 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
\r
6781 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
\r
6784 if (o_ptr->to_d > 0)
\r
6786 o_ptr->to_d -= randint1(3) % 2;
\r
6787 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
\r
6789 if (o_ptr->to_h > 0)
\r
6791 o_ptr->to_h -= randint1(3) % 2;
\r
6792 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
\r
6794 if (o_ptr->to_a > 0)
\r
6796 o_ptr->to_a -= randint1(3) % 2;
\r
6797 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
\r
6799 msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
\r
6804 int curse_rank = 0;
\r
6805 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
\r
6806 o_ptr->curse_flags |= (TRC_CURSED);
\r
6808 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
\r
6811 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
\r
6814 o_ptr->curse_flags |= (TRC_TY_CURSE);
\r
6815 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
\r
6817 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
\r
6818 add_flag(o_ptr->art_flags, TR_RES_POIS);
\r
6819 add_flag(o_ptr->art_flags, TR_RES_DARK);
\r
6820 add_flag(o_ptr->art_flags, TR_RES_NETHER);
\r
6821 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
\r
6826 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);
\r
6829 p_ptr->update |= (PU_BONUS);
\r
6835 if (name) return _("影のクローク", "Cloak of shadow");
\r
6836 if (desc) return _("影のオーラを身にまとい、敵に影のダメージを与える。", "Gives aura of shadow.");
\r
6839 object_type *o_ptr = &inventory[INVEN_OUTER];
\r
6841 if (!o_ptr->k_idx)
\r
6843 msg_print(_("クロークを身につけていない!", "You don't ware any cloak."));
\r
6846 else if (!object_is_cursed(o_ptr))
\r
6848 msg_print(_("クロークは呪われていない!", "Your cloak is not cursed."));
\r
6853 msg_print(_("影のオーラを身にまとった。", "You have enveloped by shadow aura!"));
\r
6858 object_type *o_ptr = &inventory[INVEN_OUTER];
\r
6860 if ((!o_ptr->k_idx) || (!object_is_cursed(o_ptr)))
\r
6862 do_spell(REALM_HEX, spell, SPELL_STOP);
\r
6863 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << spell);
\r
6864 CASTING_HEX_NUM(p_ptr)--;
\r
6865 if (!SINGING_SONG_ID(p_ptr)) set_action(ACTION_NONE);
\r
6870 msg_print(_("影のオーラが消え去った。", "Shadow aura disappeared."));
\r
6875 if (name) return _("苦痛を魔力に", "Pains to mana");
\r
6876 if (desc) return _("視界内のモンスターに精神ダメージ与え、魔力を吸い取る。", "Deals psychic damages to all monsters in sight, and drains some mana.");
\r
6877 power = plev * 3 / 2;
\r
6878 if (info) return info_damage(1, power, 0);
\r
6881 project_hack(GF_PSI_DRAIN, randint1(power));
\r
6886 if (name) return _("目には目を", "Eye for an eye");
\r
6887 if (desc) return _("打撃や魔法で受けたダメージを、攻撃元のモンスターにも与える。", "Returns same damage which you got to the monster which damaged you.");
\r
6890 msg_print(_("復讐したい欲望にかられた。", "You wish strongly you want to revenge anything."));
\r
6894 /*** 4th book (24-31) ***/
\r
6896 if (name) return _("反増殖結界", "Anti multiply barrier");
\r
6897 if (desc) return _("その階の増殖するモンスターの増殖を阻止する。", "Obstructs all multiplying by monsters in entire floor.");
\r
6900 msg_print(_("増殖を阻止する呪いをかけた。", "You feel anyone can not already multiply."));
\r
6905 if (name) return _("全復活", "Restoration");
\r
6906 if (desc) return _("経験値を徐々に復活し、減少した能力値を回復させる。", "Restores experience and status.");
\r
6909 msg_print(_("体が元の活力を取り戻し始めた。", "You feel your lost status starting to return."));
\r
6913 bool flag = FALSE;
\r
6914 int d = (p_ptr->max_exp - p_ptr->exp);
\r
6915 int r = (p_ptr->exp / 20);
\r
6921 p_ptr->exp = p_ptr->max_exp;
\r
6925 /* Check the experience */
\r
6926 check_experience();
\r
6930 for (i = A_STR; i < 6; i ++)
\r
6932 if (p_ptr->stat_cur[i] < p_ptr->stat_max[i])
\r
6934 if (p_ptr->stat_cur[i] < 18)
\r
6935 p_ptr->stat_cur[i]++;
\r
6937 p_ptr->stat_cur[i] += 10;
\r
6939 if (p_ptr->stat_cur[i] > p_ptr->stat_max[i])
\r
6940 p_ptr->stat_cur[i] = p_ptr->stat_max[i];
\r
6942 /* Recalculate bonuses */
\r
6943 p_ptr->update |= (PU_BONUS);
\r
6951 msg_format(_("%sの呪文の詠唱をやめた。", "Finish casting '%^s'."), do_spell(REALM_HEX, HEX_RESTORE, SPELL_NAME));
\r
6952 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_RESTORE);
\r
6953 if (cont) CASTING_HEX_NUM(p_ptr)--;
\r
6954 if (CASTING_HEX_NUM(p_ptr)) p_ptr->action = ACTION_NONE;
\r
6956 /* Redraw status */
\r
6957 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
\r
6958 p_ptr->redraw |= (PR_EXTRA);
\r
6966 if (name) return _("呪力吸収", "Drain curse power");
\r
6967 if (desc) return _("呪われた武器の呪いを吸収して魔力を回復する。", "Drains curse on your weapon and heals SP a little.");
\r
6972 u32b f[TR_FLAG_SIZE];
\r
6973 object_type *o_ptr;
\r
6975 item_tester_hook = item_tester_hook_cursed;
\r
6976 q = _("どの装備品から吸収しますか?", "Which cursed equipment do you drain mana from?");
\r
6977 s = _("呪われたアイテムを装備していない。", "You have no cursed equipment.");
\r
6979 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
\r
6981 o_ptr = &inventory[item];
\r
6982 object_flags(o_ptr, f);
\r
6984 p_ptr->csp += (p_ptr->lev / 5) + randint1(p_ptr->lev / 5);
\r
6985 if (have_flag(f, TR_TY_CURSE) || (o_ptr->curse_flags & TRC_TY_CURSE)) p_ptr->csp += randint1(5);
\r
6986 if (p_ptr->csp > p_ptr->msp) p_ptr->csp = p_ptr->msp;
\r
6988 if (o_ptr->curse_flags & TRC_PERMA_CURSE)
\r
6992 else if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
\r
6996 msg_print(_("呪いを全て吸い取った。", "Heavy curse vanished away."));
\r
6997 o_ptr->curse_flags = 0L;
\r
7000 else if ((o_ptr->curse_flags & (TRC_CURSED)) && one_in_(3))
\r
7002 msg_print(_("呪いを全て吸い取った。", "Curse vanished away."));
\r
7003 o_ptr->curse_flags = 0L;
\r
7011 if (name) return _("吸血の刃", "Swords to vampires");
\r
7012 if (desc) return _("吸血属性で攻撃する。", "Gives vampiric ability to your weapon.");
\r
7016 msg_print("あなたの武器が血を欲している。");
\r
7018 if (!empty_hands(FALSE))
\r
7019 msg_print("Your weapons want more blood now.");
\r
7021 msg_print("Your weapon wants more blood now.");
\r
7027 msg_print("武器の渇望が消え去った。");
\r
7029 msg_format("Thirsty of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
\r
7035 if (name) return _("朦朧の言葉", "Word of stun");
\r
7036 if (desc) return _("視界内のモンスターを朦朧とさせる。", "Stuns all monsters in your sight.");
\r
7038 if (info) return info_power(power);
\r
7041 stun_monsters(power);
\r
7046 if (name) return _("影移動", "Moving into shadow");
\r
7047 if (desc) return _("モンスターの隣のマスに瞬間移動する。", "Teleports you close to a monster.");
\r
7054 for (i = 0; i < 3; i++)
\r
7056 if (!tgt_pt(&x, &y)) return FALSE;
\r
7060 for (dir = 0; dir < 8; dir++)
\r
7062 int dy = y + ddy_ddd[dir];
\r
7063 int dx = x + ddx_ddd[dir];
\r
7064 if (dir == 5) continue;
\r
7065 if(cave[dy][dx].m_idx) flag = TRUE;
\r
7068 if (!cave_empty_bold(y, x) || (cave[y][x].info & CAVE_ICKY) ||
\r
7069 (distance(y, x, p_ptr->y, p_ptr->x) > plev + 2))
\r
7071 msg_print(_("そこには移動できない。", "Can not teleport to there."));
\r
7077 if (flag && randint0(plev * plev / 2))
\r
7079 teleport_player_to(y, x, 0L);
\r
7083 msg_print(_("おっと!", "Oops!"));
\r
7084 teleport_player(30, 0L);
\r
7092 if (name) return _("反魔法結界", "Anti magic barrier");
\r
7093 if (desc) return _("視界内のモンスターの魔法を阻害するバリアを張る。", "Obstructs all magic spell of monsters in your sight.");
\r
7094 power = plev * 3 / 2;
\r
7095 if (info) return info_power(power);
\r
7098 msg_print(_("魔法を防ぐ呪いをかけた。", "You feel anyone can not cast spells except you."));
\r
7103 if (name) return _("復讐の宣告", "Revenge sentence");
\r
7104 if (desc) return _("数ターン後にそれまで受けたダメージに応じた威力の地獄の劫火の弾を放つ。",
\r
7105 "Fires a ball of hell fire to try revenging after few turns.");
\r
7106 power = HEX_REVENGE_POWER(p_ptr);
\r
7107 if (info) return info_damage(0, 0, power);
\r
7111 int a = 3 - (p_ptr->pspeed - 100) / 10;
\r
7112 r = 1 + randint1(2) + MAX(0, MIN(3, a));
\r
7114 if (HEX_REVENGE_TURN(p_ptr) > 0)
\r
7116 msg_print(_("すでに復讐は宣告済みだ。", "You already pronounced your revenge."));
\r
7120 HEX_REVENGE_TYPE(p_ptr) = 2;
\r
7121 HEX_REVENGE_TURN(p_ptr) = r;
\r
7122 msg_format(_("あなたは復讐を宣告した。あと %d ターン。", "You pronounce your revenge. %d turns left."), r);
\r
7127 HEX_REVENGE_TURN(p_ptr)--;
\r
7129 if (HEX_REVENGE_TURN(p_ptr) <= 0)
\r
7139 msg_print(_("復讐の時だ!", "Time to revenge!"));
\r
7141 while (!get_aim_dir(&dir));
\r
7143 fire_ball(GF_HELL_FIRE, dir, power, 1);
\r
7145 if (p_ptr->wizard)
\r
7147 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
\r
7152 msg_print(_("復讐する気が失せた。", "You are not a mood to revenge."));
\r
7154 HEX_REVENGE_POWER(p_ptr) = 0;
\r
7160 /* start casting */
\r
7161 if ((cast) && (add))
\r
7164 CASTING_HEX_FLAGS(p_ptr) |= 1L << (spell);
\r
7165 CASTING_HEX_NUM(p_ptr)++;
\r
7167 if (p_ptr->action != ACTION_SPELL) set_action(ACTION_SPELL);
\r
7170 /* Redraw status */
\r
7173 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
\r
7174 p_ptr->redraw |= (PR_EXTRA | PR_HP | PR_MANA);
\r
7182 * @brief 魔法処理のメインルーチン
\r
7183 * @param realm 魔法領域のID
\r
7184 * @param spell 各領域の魔法ID
\r
7185 * @param mode 求める処理
\r
7186 * @return 各領域魔法に各種テキストを求めた場合は文字列参照ポインタ、そうでない場合はNULLポインタを返す。
\r
7188 cptr do_spell(REALM_IDX realm, SPELL_IDX spell, BIT_FLAGS mode)
\r
7192 case REALM_LIFE: return do_life_spell(spell, mode);
\r
7193 case REALM_SORCERY: return do_sorcery_spell(spell, mode);
\r
7194 case REALM_NATURE: return do_nature_spell(spell, mode);
\r
7195 case REALM_CHAOS: return do_chaos_spell(spell, mode);
\r
7196 case REALM_DEATH: return do_death_spell(spell, mode);
\r
7197 case REALM_TRUMP: return do_trump_spell(spell, mode);
\r
7198 case REALM_ARCANE: return do_arcane_spell(spell, mode);
\r
7199 case REALM_CRAFT: return do_craft_spell(spell, mode);
\r
7200 case REALM_DAEMON: return do_daemon_spell(spell, mode);
\r
7201 case REALM_CRUSADE: return do_crusade_spell(spell, mode);
\r
7202 case REALM_MUSIC: return do_music_spell(spell, mode);
\r
7203 case REALM_HISSATSU: return do_hissatsu_spell(spell, mode);
\r
7204 case REALM_HEX: return do_hex_spell(spell, mode);
\r