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
18 * 魔法の効果を「キャプション:ダイス+定数値」のフォーマットで出力する / Generate dice info string such as "foo 2d10"
\r
23 * @return フォーマットに従い整形された文字列
\r
25 cptr info_string_dice(cptr str, int dice, int sides, int base)
\r
29 return format("%s%d", str, base);
\r
33 return format("%s%dd%d", str, dice, sides);
\r
35 /* Dice plus base value */
\r
37 return format("%s%dd%d%+d", str, dice, sides, base);
\r
42 * @brief 魔法によるダメージを出力する / Generate damage-dice info string such as "dam 2d10"
\r
46 * @return フォーマットに従い整形された文字列
\r
48 cptr info_damage(int dice, int sides, int base)
\r
50 return info_string_dice(_("損傷:", "dam "), dice, sides, base);
\r
54 * @brief 魔法の効果時間を出力する / Generate duration info string such as "dur 20+1d20"
\r
57 * @return フォーマットに従い整形された文字列
\r
59 cptr info_duration(int base, int sides)
\r
61 return format(_("期間:%d+1d%d", "dur %d+1d%d"), base, sides);
\r
65 * @brief 魔法の効果範囲を出力する / Generate range info string such as "range 5"
\r
67 * @return フォーマットに従い整形された文字列
\r
69 cptr info_range(POSITION range)
\r
71 return format(_("範囲:%d", "range %d"), range);
\r
75 * @brief 魔法による回復量を出力する / Generate heal info string such as "heal 2d8"
\r
79 * @return フォーマットに従い整形された文字列
\r
81 cptr info_heal(int dice, int sides, int base)
\r
83 return info_string_dice(_("回復:", "heal "), dice, sides, base);
\r
87 * @brief 魔法効果発動までの遅延ターンを出力する / Generate delay info string such as "delay 15+1d15"
\r
90 * @return フォーマットに従い整形された文字列
\r
92 cptr info_delay(int base, int sides)
\r
94 return format(_("遅延:%d+1d%d", "delay %d+1d%d"), base, sides);
\r
99 * @brief 魔法によるダメージを出力する(固定値&複数回処理) / Generate multiple-damage info string such as "dam 25 each"
\r
101 * @return フォーマットに従い整形された文字列
\r
103 cptr info_multi_damage(HIT_POINT dam)
\r
105 return format(_("損傷:各%d", "dam %d each"), dam);
\r
110 * @brief 魔法によるダメージを出力する(ダイスのみ&複数回処理) / Generate multiple-damage-dice info string such as "dam 5d2 each"
\r
112 * @param sides ダイス目
\r
113 * @return フォーマットに従い整形された文字列
\r
115 cptr info_multi_damage_dice(int dice, int sides)
\r
117 return format(_("損傷:各%dd%d", "dam %dd%d each"), dice, sides);
\r
121 * @brief 魔法による一般的な効力値を出力する(固定値) / Generate power info string such as "power 100"
\r
123 * @return フォーマットに従い整形された文字列
\r
125 cptr info_power(int power)
\r
127 return format(_("効力:%d", "power %d"), power);
\r
132 * @brief 魔法による一般的な効力値を出力する(ダイス値) / Generate power info string such as "power 100"
\r
134 * @param sides ダイス目
\r
135 * @return フォーマットに従い整形された文字列
\r
138 * Generate power info string such as "power 1d100"
\r
140 cptr info_power_dice(int dice, int sides)
\r
142 return format(_("効力:%dd%d", "power %dd%d"), dice, sides);
\r
147 * @brief 魔法の効果半径を出力する / Generate radius info string such as "rad 100"
\r
149 * @return フォーマットに従い整形された文字列
\r
151 cptr info_radius(int rad)
\r
153 return format(_("半径:%d", "rad %d"), rad);
\r
158 * @brief 魔法効果の限界重量を出力する / Generate weight info string such as "max wgt 15"
\r
159 * @param weight 最大重量
\r
160 * @return フォーマットに従い整形された文字列
\r
162 cptr info_weight(int weight)
\r
165 return format("最大重量:%d.%dkg", lbtokg1(weight), lbtokg2(weight));
\r
167 return format("max wgt %d", weight/10);
\r
173 * @brief 歌の開始を処理する / Start singing if the player is a Bard
\r
174 * @param spell 領域魔法としてのID
\r
175 * @param song 魔法効果のID
\r
178 static void start_singing(SPELL_IDX spell, MAGIC_NUM1 song)
\r
180 /* Remember the song index */
\r
181 SINGING_SONG_EFFECT(p_ptr) = (MAGIC_NUM1)song;
\r
183 /* Remember the index of the spell which activated the song */
\r
184 SINGING_SONG_ID(p_ptr) = (MAGIC_NUM2)spell;
\r
187 /* Now the player is singing */
\r
188 set_action(ACTION_SING);
\r
191 /* Recalculate bonuses */
\r
192 p_ptr->update |= (PU_BONUS);
\r
194 /* Redraw status bar */
\r
195 p_ptr->redraw |= (PR_STATUS);
\r
199 * @brief 歌の停止を処理する / Stop singing if the player is a Bard
\r
202 void stop_singing(void)
\r
204 if (p_ptr->pclass != CLASS_BARD) return;
\r
206 /* Are there interupted song? */
\r
207 if (INTERUPTING_SONG_EFFECT(p_ptr))
\r
209 /* Forget interupted song */
\r
210 INTERUPTING_SONG_EFFECT(p_ptr) = MUSIC_NONE;
\r
214 /* The player is singing? */
\r
215 if (!SINGING_SONG_EFFECT(p_ptr)) return;
\r
217 /* Hack -- if called from set_action(), avoid recursive loop */
\r
218 if (p_ptr->action == ACTION_SING) set_action(ACTION_NONE);
\r
220 /* Message text of each song or etc. */
\r
221 do_spell(REALM_MUSIC, SINGING_SONG_ID(p_ptr), SPELL_STOP);
\r
223 SINGING_SONG_EFFECT(p_ptr) = MUSIC_NONE;
\r
224 SINGING_SONG_ID(p_ptr) = 0;
\r
226 /* Recalculate bonuses */
\r
227 p_ptr->update |= (PU_BONUS);
\r
229 /* Redraw status bar */
\r
230 p_ptr->redraw |= (PR_STATUS);
\r
235 * @brief 生命領域魔法の各処理を行う
\r
236 * @param spell 魔法ID
\r
237 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
238 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
240 static cptr do_life_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
242 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
243 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
244 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
245 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
248 int plev = p_ptr->lev;
\r
253 if (name) return _("軽傷の治癒", "Cure Light Wounds");
\r
254 if (desc) return _("怪我と体力を少し回復させる。", "Heals cut and HP a little.");
\r
259 if (info) return info_heal(dice, sides, 0);
\r
263 hp_player(damroll(dice, sides));
\r
264 set_cut(p_ptr->cut - 10);
\r
270 if (name) return _("祝福", "Bless");
\r
271 if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
\r
275 if (info) return info_duration(base, base);
\r
279 set_blessed(randint1(base) + base, FALSE);
\r
285 if (name) return _("軽傷", "Cause Light Wounds");
\r
286 if (desc) return _("1体のモンスターに小ダメージを与える。抵抗されると無効。", "Wounds a monster a little unless resisted.");
\r
288 int dice = 3 + (plev - 1) / 5;
\r
291 if (info) return info_damage(dice, sides, 0);
\r
295 if (!get_aim_dir(&dir)) return NULL;
\r
296 fire_ball_hide(GF_WOUNDS, dir, damroll(dice, sides), 0);
\r
302 if (name) return _("光の召喚", "Call Light");
\r
303 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
\r
306 int sides = plev / 2;
\r
307 int rad = plev / 10 + 1;
\r
309 if (info) return info_damage(dice, sides, 0);
\r
313 lite_area(damroll(dice, sides), rad);
\r
319 if (name) return _("罠 & 隠し扉感知", "Detect Doors & Traps");
\r
320 if (desc) return _("近くの全ての罠と扉と階段を感知する。", "Detects traps, doors, and stairs in your vicinity.");
\r
322 int rad = DETECT_RAD_DEFAULT;
\r
324 if (info) return info_radius(rad);
\r
328 detect_traps(rad, TRUE);
\r
330 detect_stairs(rad);
\r
336 if (name) return _("重傷の治癒", "Cure Medium Wounds");
\r
337 if (desc) return _("怪我と体力を中程度回復させる。", "Heals cut and HP more.");
\r
342 if (info) return info_heal(dice, sides, 0);
\r
346 hp_player(damroll(dice, sides));
\r
347 set_cut((p_ptr->cut / 2) - 20);
\r
353 if (name) return _("解毒", "Cure Poison");
\r
354 if (desc) return _("体内の毒を取り除く。", "Cure poison status.");
\r
364 if (name) return _("空腹充足", "Satisfy Hunger");
\r
365 if (desc) return _("満腹にする。", "Satisfies hunger.");
\r
369 set_food(PY_FOOD_MAX - 1);
\r
375 if (name) return _("解呪", "Remove Curse");
\r
376 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
\r
380 if (remove_curse())
\r
382 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
389 if (name) return _("重傷", "Cause Medium Wounds");
\r
390 if (desc) return _("1体のモンスターに中ダメージを与える。抵抗されると無効。", "Wounds a monster unless resisted.");
\r
392 int sides = 8 + (plev - 5) / 4;
\r
395 if (info) return info_damage(dice, sides, 0);
\r
399 if (!get_aim_dir(&dir)) return NULL;
\r
400 fire_ball_hide(GF_WOUNDS, dir, damroll(dice, sides), 0);
\r
406 if (name) return _("致命傷の治癒", "Cure Critical Wounds");
\r
407 if (desc) return _("体力を大幅に回復させ、負傷と朦朧状態も全快する。", "Heals cut, stun and HP greatly.");
\r
412 if (info) return info_heal(dice, sides, 0);
\r
416 hp_player(damroll(dice, sides));
\r
424 if (name) return _("耐熱耐寒", "Resist Heat and Cold");
\r
425 if (desc) return _("一定時間、火炎と冷気に対する耐性を得る。装備による耐性に累積する。",
\r
426 "Gives resistance to fire and cold. These resistances can be added to which from equipment for more powerful resistances.");
\r
431 if (info) return info_duration(base, base);
\r
435 set_oppose_cold(randint1(base) + base, FALSE);
\r
436 set_oppose_fire(randint1(base) + base, FALSE);
\r
442 if (name) return _("周辺感知", "Sense Surroundings");
\r
443 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
\r
446 int rad = DETECT_RAD_MAP;
\r
448 if (info) return info_radius(rad);
\r
458 if (name) return _("パニック・アンデッド", "Turn Undead");
\r
459 if (desc) return _("視界内のアンデッドを恐怖させる。抵抗されると無効。", "Attempts to scare undead monsters in sight.");
\r
470 if (name) return _("体力回復", "Healing");
\r
471 if (desc) return _("極めて強力な回復呪文で、負傷と朦朧状態も全快する。", "Much powerful healing magic, and heals cut and stun completely.");
\r
476 if (info) return info_heal(0, 0, heal);
\r
488 if (name) return _("結界の紋章", "Glyph of Warding");
\r
489 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。",
\r
490 "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
501 if (name) return _("*解呪*", "Dispel Curse");
\r
502 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
\r
507 if (remove_all_curse())
\r
509 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
516 if (name) return _("鑑識", "Perception");
\r
517 if (desc) return _("アイテムを識別する。", "Identifies an item.");
\r
522 if (!ident_spell(FALSE)) return NULL;
\r
528 if (name) return _("アンデッド退散", "Dispel Undead");
\r
529 if (desc) return _("視界内の全てのアンデッドにダメージを与える。", "Damages all undead monsters in sight.");
\r
533 int sides = plev * 5;
\r
535 if (info) return info_damage(dice, sides, 0);
\r
539 dispel_undead(damroll(dice, sides));
\r
545 if (name) return _("凪の刻", "Day of the Dove");
\r
546 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
\r
549 int power = plev * 2;
\r
551 if (info) return info_power(power);
\r
555 charm_monsters(power);
\r
561 if (name) return _("致命傷", "Cause Critical Wounds");
\r
562 if (desc) return _("1体のモンスターに大ダメージを与える。抵抗されると無効。", "Wounds a monster critically unless resisted.");
\r
565 int dice = 5 + (plev - 5) / 3;
\r
568 if (info) return info_damage(dice, sides, 0);
\r
572 if (!get_aim_dir(&dir)) return NULL;
\r
573 fire_ball_hide(GF_WOUNDS, dir, damroll(dice, sides), 0);
\r
579 if (name) return _("帰還の詔", "Word of Recall");
\r
580 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。", "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
\r
586 if (info) return info_delay(base, sides);
\r
590 if (!word_of_recall()) return NULL;
\r
596 if (name) return _("真実の祭壇", "Alter Reality");
\r
597 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
\r
603 if (info) return info_delay(base, sides);
\r
613 if (name) return _("真・結界", "Warding True");
\r
614 if (desc) return _("自分のいる床と周囲8マスの床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。", "Creates glyphs in all adjacent squares and under you.");
\r
619 if (info) return info_radius(rad);
\r
630 if (name) return _("不毛化", "Sterilization");
\r
631 if (desc) return _("この階の増殖するモンスターが増殖できなくなる。", "Prevents any breeders on current level from breeding.");
\r
636 num_repro += MAX_REPRO;
\r
642 if (name) return _("全感知", "Detection");
\r
643 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。", "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
\r
646 int rad = DETECT_RAD_DEFAULT;
\r
648 if (info) return info_radius(rad);
\r
658 if (name) return _("アンデッド消滅", "Annihilate Undead");
\r
659 if (desc) return _("自分の周囲にいるアンデッドを現在の階から消し去る。抵抗されると無効。",
\r
660 "Eliminates all nearby undead monsters, exhausting you. Powerful or unique monsters may be able to resist.");
\r
663 int power = plev + 50;
\r
665 if (info) return info_power(power);
\r
669 mass_genocide_undead(power, TRUE);
\r
675 if (name) return _("千里眼", "Clairvoyance");
\r
676 if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。", "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");
\r
687 if (name) return _("全復活", "Restoration");
\r
688 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
\r
693 do_res_stat(A_STR);
\r
694 do_res_stat(A_INT);
\r
695 do_res_stat(A_WIS);
\r
696 do_res_stat(A_DEX);
\r
697 do_res_stat(A_CON);
\r
698 do_res_stat(A_CHR);
\r
705 if (name) return _("*体力回復*", "Healing True");
\r
706 if (desc) return _("最強の治癒の魔法で、負傷と朦朧状態も全快する。", "The greatest healing magic. Heals all HP, cut and stun.");
\r
711 if (info) return info_heal(0, 0, heal);
\r
723 if (name) return _("聖なるビジョン", "Holy Vision");
\r
724 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
\r
729 if (!identify_fully(FALSE)) return NULL;
\r
735 if (name) return _("究極の耐性", "Ultimate Resistance");
\r
736 if (desc) return _("一定時間、あらゆる耐性を付け、ACと魔法防御能力を上昇させる。", "Gives ultimate resistance, bonus to AC and speed.");
\r
739 TIME_EFFECT base = (TIME_EFFECT)plev / 2;
\r
741 if (info) return info_duration(base, base);
\r
745 TIME_EFFECT v = randint1(base) + base;
\r
746 set_fast(v, FALSE);
\r
747 set_oppose_acid(v, FALSE);
\r
748 set_oppose_elec(v, FALSE);
\r
749 set_oppose_fire(v, FALSE);
\r
750 set_oppose_cold(v, FALSE);
\r
751 set_oppose_pois(v, FALSE);
\r
752 set_ultimate_res(v, FALSE);
\r
762 * @brief 仙術領域魔法の各処理を行う
\r
763 * @param spell 魔法ID
\r
764 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
765 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
767 static cptr do_sorcery_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
769 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
770 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
771 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
772 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
775 int plev = p_ptr->lev;
\r
780 if (name) return _("モンスター感知", "Detect Monsters");
\r
781 if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
\r
784 int rad = DETECT_RAD_DEFAULT;
\r
786 if (info) return info_radius(rad);
\r
790 detect_monsters_normal(rad);
\r
796 if (name) return _("ショート・テレポート", "Phase Door");
\r
797 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");
\r
800 POSITION range = 10;
\r
802 if (info) return info_range(range);
\r
806 teleport_player(range, 0L);
\r
812 if (name) return _("罠と扉感知", "Detect Doors and Traps");
\r
813 if (desc) return _("近くの全ての扉と罠を感知する。", "Detects traps, doors, and stairs in your vicinity.");
\r
816 int rad = DETECT_RAD_DEFAULT;
\r
818 if (info) return info_radius(rad);
\r
822 detect_traps(rad, TRUE);
\r
824 detect_stairs(rad);
\r
830 if (name) return _("ライト・エリア", "Light Area");
\r
831 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
\r
835 int sides = plev / 2;
\r
836 int rad = plev / 10 + 1;
\r
838 if (info) return info_damage(dice, sides, 0);
\r
842 lite_area(damroll(dice, sides), rad);
\r
848 if (name) return _("パニック・モンスター", "Confuse Monster");
\r
849 if (desc) return _("モンスター1体を混乱させる。抵抗されると無効。", "Attempts to confuse a monster.");
\r
852 int power = (plev * 3) / 2;
\r
854 if (info) return info_power(power);
\r
858 if (!get_aim_dir(&dir)) return NULL;
\r
860 confuse_monster(dir, power);
\r
866 if (name) return _("テレポート", "Teleport");
\r
867 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
\r
870 POSITION range = plev * 5;
\r
872 if (info) return info_range(range);
\r
876 teleport_player(range, 0L);
\r
882 if (name) return _("スリープ・モンスター", "Sleep Monster");
\r
883 if (desc) return _("モンスター1体を眠らせる。抵抗されると無効。", "Attempts to sleep a monster.");
\r
888 if (info) return info_power(power);
\r
892 if (!get_aim_dir(&dir)) return NULL;
\r
894 sleep_monster(dir, plev);
\r
900 if (name) return _("魔力充填", "Recharging");
\r
901 if (desc) return _("杖/魔法棒の充填回数を増やすか、充填中のロッドの充填時間を減らす。", "Recharges staffs, wands or rods.");
\r
904 int power = plev * 4;
\r
906 if (info) return info_power(power);
\r
910 if (!recharge(power)) return NULL;
\r
916 if (name) return _("魔法の地図", "Magic Mapping");
\r
917 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
\r
920 int rad = DETECT_RAD_MAP;
\r
922 if (info) return info_radius(rad);
\r
932 if (name) return _("鑑定", "Identify");
\r
933 if (desc) return _("アイテムを識別する。", "Identifies an item.");
\r
938 if (!ident_spell(FALSE)) return NULL;
\r
944 if (name) return _("スロウ・モンスター", "Slow Monster");
\r
945 if (desc) return _("モンスター1体を減速さる。抵抗されると無効。", "Attempts to slow a monster.");
\r
950 if (info) return info_power(power);
\r
954 if (!get_aim_dir(&dir)) return NULL;
\r
956 slow_monster(dir, plev);
\r
962 if (name) return _("周辺スリープ", "Mass Sleep");
\r
963 if (desc) return _("視界内の全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep all monsters in sight.");
\r
968 if (info) return info_power(power);
\r
972 sleep_monsters(plev);
\r
978 if (name) return _("テレポート・モンスター", "Teleport Away");
\r
979 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
\r
984 if (info) return info_power(power);
\r
988 if (!get_aim_dir(&dir)) return NULL;
\r
990 fire_beam(GF_AWAY_ALL, dir, power);
\r
996 if (name) return _("スピード", "Haste Self");
\r
997 if (desc) return _("一定時間、加速する。", "Hastes you for a while.");
\r
1001 int sides = 20 + plev;
\r
1003 if (info) return info_duration(base, sides);
\r
1007 set_fast(randint1(sides) + base, FALSE);
\r
1013 if (name) return _("真・感知", "Detection True");
\r
1014 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
\r
1015 "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
\r
1018 int rad = DETECT_RAD_DEFAULT;
\r
1020 if (info) return info_radius(rad);
\r
1030 if (name) return _("真・鑑定", "Identify True");
\r
1031 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
\r
1036 if (!identify_fully(FALSE)) return NULL;
\r
1042 if (name) return _("物体と財宝感知", "Detect items and Treasure");
\r
1043 if (desc) return _("近くの全てのアイテムと財宝を感知する。", "Detects all treasures and items in your vicinity.");
\r
1046 int rad = DETECT_RAD_DEFAULT;
\r
1048 if (info) return info_radius(rad);
\r
1052 detect_objects_normal(rad);
\r
1053 detect_treasure(rad);
\r
1054 detect_objects_gold(rad);
\r
1060 if (name) return _("チャーム・モンスター", "Charm Monster");
\r
1061 if (desc) return _("モンスター1体を魅了する。抵抗されると無効。", "Attempts to charm a monster.");
\r
1066 if (info) return info_power(power);
\r
1070 if (!get_aim_dir(&dir)) return NULL;
\r
1072 charm_monster(dir, power);
\r
1078 if (name) return _("精神感知", "Sense Minds");
\r
1079 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
\r
1085 if (info) return info_duration(base, sides);
\r
1089 set_tim_esp(randint1(sides) + base, FALSE);
\r
1095 if (name) return _("街移動", "Teleport to town");
\r
1096 if (desc) return _("街へ移動する。地上にいるときしか使えない。", "Teleport to a town which you choose in a moment. Can only be used outdoors.");
\r
1101 if (!tele_town()) return NULL;
\r
1107 if (name) return _("自己分析", "Self Knowledge");
\r
1108 if (desc) return _("現在の自分の状態を完全に知る。",
\r
1109 "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");
\r
1120 if (name) return _("テレポート・レベル", "Teleport Level");
\r
1121 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");
\r
1126 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
\r
1127 teleport_level(0);
\r
1133 if (name) return _("帰還の呪文", "Word of Recall");
\r
1134 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
\r
1135 "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
\r
1141 if (info) return info_delay(base, sides);
\r
1145 if (!word_of_recall()) return NULL;
\r
1151 if (name) return _("次元の扉", "Dimension Door");
\r
1152 if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleport to given location.");
\r
1155 POSITION range = plev / 2 + 10;
\r
1157 if (info) return info_range(range);
\r
1161 msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));
\r
1162 if (!dimension_door()) return NULL;
\r
1168 if (name) return _("調査", "Probing");
\r
1169 if (desc) return _("モンスターの属性、残り体力、最大体力、スピード、正体を知る。",
\r
1170 "Proves all monsters' alignment, HP, speed and their true character.");
\r
1181 if (name) return _("爆発のルーン", "Explosive Rune");
\r
1182 if (desc) return _("自分のいる床の上に、モンスターが通ると爆発してダメージを与えるルーンを描く。",
\r
1183 "Sets a glyph under you. The glyph will explode when a monster moves on it.");
\r
1190 if (info) return info_damage(dice, sides, base);
\r
1200 if (name) return _("念動力", "Telekinesis");
\r
1201 if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");
\r
1204 int weight = plev * 15;
\r
1206 if (info) return info_weight(weight);
\r
1210 if (!get_aim_dir(&dir)) return NULL;
\r
1212 fetch(dir, weight, FALSE);
\r
1218 if (name) return _("千里眼", "Clairvoyance");
\r
1219 if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。さらに、一定時間テレパシー能力を得る。",
\r
1220 "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");
\r
1226 if (info) return info_duration(base, sides);
\r
1230 chg_virtue(V_KNOWLEDGE, 1);
\r
1231 chg_virtue(V_ENLIGHTEN, 1);
\r
1235 if (!p_ptr->telepathy)
\r
1237 set_tim_esp(randint1(sides) + base, FALSE);
\r
1244 if (name) return _("魅了の視線", "Charm monsters");
\r
1245 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
\r
1248 int power = plev * 2;
\r
1250 if (info) return info_power(power);
\r
1254 charm_monsters(power);
\r
1260 if (name) return _("錬金術", "Alchemy");
\r
1261 if (desc) return _("アイテム1つをお金に変える。", "Turns an item into 1/3 of its value in gold.");
\r
1266 if (!alchemy()) return NULL;
\r
1272 if (name) return _("怪物追放", "Banishment");
\r
1273 if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");
\r
1276 int power = plev * 4;
\r
1278 if (info) return info_power(power);
\r
1282 banish_monsters(power);
\r
1288 if (name) return _("無傷の球", "Globe of Invulnerability");
\r
1289 if (desc) return _("一定時間、ダメージを受けなくなるバリアを張る。切れた瞬間に少しターンを消費するので注意。",
\r
1290 "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
1295 if (info) return info_duration(base, base);
\r
1299 set_invuln(randint1(base) + base, FALSE);
\r
1310 * @brief 自然領域魔法の各処理を行う
\r
1311 * @param spell 魔法ID
\r
1312 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
1313 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
1315 static cptr do_nature_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
1317 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
1318 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
1319 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
1320 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
1322 static const char s_dam[] = _("損傷:", "dam ");
\r
1323 static const char s_rng[] = _("射程", "rng ");
\r
1326 int plev = p_ptr->lev;
\r
1331 if (name) return _("モンスター感知", "Detect Creatures");
\r
1332 if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
\r
1335 int rad = DETECT_RAD_DEFAULT;
\r
1337 if (info) return info_radius(rad);
\r
1341 detect_monsters_normal(rad);
\r
1347 if (name) return _("稲妻", "Lightning");
\r
1348 if (desc) return _("電撃の短いビームを放つ。", "Fires a short beam of lightning.");
\r
1351 int dice = 3 + (plev - 1) / 5;
\r
1353 POSITION range = plev / 6 + 2;
\r
1355 if (info) return format("%s%dd%d %s%d", s_dam, dice, sides, s_rng, range);
\r
1359 project_length = range;
\r
1361 if (!get_aim_dir(&dir)) return NULL;
\r
1363 fire_beam(GF_ELEC, dir, damroll(dice, sides));
\r
1369 if (name) return _("罠と扉感知", "Detect Doors and Traps");
\r
1370 if (desc) return _("近くの全ての罠と扉を感知する。", "Detects traps, doors, and stairs in your vicinity.");
\r
1373 int rad = DETECT_RAD_DEFAULT;
\r
1375 if (info) return info_radius(rad);
\r
1379 detect_traps(rad, TRUE);
\r
1380 detect_doors(rad);
\r
1381 detect_stairs(rad);
\r
1387 if (name) return _("食糧生成", "Produce Food");
\r
1388 if (desc) return _("食料を一つ作り出す。", "Produces a Ration of Food.");
\r
1393 object_type forge, *q_ptr = &forge;
\r
1394 msg_print(_("食料を生成した。", "A food ration is produced."));
\r
1396 /* Create the food ration */
\r
1397 object_prep(q_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION));
\r
1399 /* Drop the object from heaven */
\r
1400 drop_near(q_ptr, -1, p_ptr->y, p_ptr->x);
\r
1406 if (name) return _("日の光", "Daylight");
\r
1407 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
\r
1411 int sides = plev / 2;
\r
1412 int rad = (plev / 10) + 1;
\r
1414 if (info) return info_damage(dice, sides, 0);
\r
1418 lite_area(damroll(dice, sides), rad);
\r
1420 if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)
\r
1422 msg_print(_("日の光があなたの肉体を焦がした!", "The daylight scorches your flesh!"));
\r
1423 take_hit(DAMAGE_NOESCAPE, damroll(2, 2), _("日の光", "daylight"), -1);
\r
1430 if (name) return _("動物習し", "Animal Taming");
\r
1431 if (desc) return _("動物1体を魅了する。抵抗されると無効。", "Attempts to charm an animal.");
\r
1436 if (info) return info_power(power);
\r
1440 if (!get_aim_dir(&dir)) return NULL;
\r
1442 charm_animal(dir, power);
\r
1448 if (name) return _("環境への耐性", "Resist Environment");
\r
1449 if (desc) return _("一定時間、冷気、炎、電撃に対する耐性を得る。装備による耐性に累積する。",
\r
1450 "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");
\r
1455 if (info) return info_duration(base, base);
\r
1459 set_oppose_cold(randint1(base) + base, FALSE);
\r
1460 set_oppose_fire(randint1(base) + base, FALSE);
\r
1461 set_oppose_elec(randint1(base) + base, FALSE);
\r
1467 if (name) return _("傷と毒治療", "Cure Wounds & Poison");
\r
1468 if (desc) return _("怪我を全快させ、毒を体から完全に取り除き、体力を少し回復させる。", "Heals all cut and poison status. Heals HP a little.");
\r
1474 if (info) return info_heal(dice, sides, 0);
\r
1478 hp_player(damroll(dice, sides));
\r
1486 if (name) return _("岩石溶解", "Stone to Mud");
\r
1487 if (desc) return _("壁を溶かして床にする。", "Turns one rock square to mud.");
\r
1494 if (info) return info_damage(dice, sides, base);
\r
1498 if (!get_aim_dir(&dir)) return NULL;
\r
1500 wall_to_mud(dir, 20 + randint1(30));
\r
1506 if (name) return _("アイス・ボルト", "Frost Bolt");
\r
1507 if (desc) return _("冷気のボルトもしくはビームを放つ。", "Fires a bolt or beam of cold.");
\r
1510 int dice = 3 + (plev - 5) / 4;
\r
1513 if (info) return info_damage(dice, sides, 0);
\r
1517 if (!get_aim_dir(&dir)) return NULL;
\r
1518 fire_bolt_or_beam(beam_chance() - 10, GF_COLD, dir, damroll(dice, sides));
\r
1524 if (name) return _("自然の覚醒", "Nature Awareness");
\r
1525 if (desc) return _("周辺の地形を感知し、近くの罠、扉、階段、全てのモンスターを感知する。",
\r
1526 "Maps nearby area. Detects all monsters, traps, doors and stairs.");
\r
1529 int rad1 = DETECT_RAD_MAP;
\r
1530 int rad2 = DETECT_RAD_DEFAULT;
\r
1532 if (info) return info_radius(MAX(rad1, rad2));
\r
1537 detect_traps(rad2, TRUE);
\r
1538 detect_doors(rad2);
\r
1539 detect_stairs(rad2);
\r
1540 detect_monsters_normal(rad2);
\r
1546 if (name) return _("ファイア・ボルト", "Fire Bolt");
\r
1547 if (desc) return _("火炎のボルトもしくはビームを放つ。", "Fires a bolt or beam of fire.");
\r
1550 int dice = 5 + (plev - 5) / 4;
\r
1553 if (info) return info_damage(dice, sides, 0);
\r
1557 if (!get_aim_dir(&dir)) return NULL;
\r
1558 fire_bolt_or_beam(beam_chance() - 10, GF_FIRE, dir, damroll(dice, sides));
\r
1564 if (name) return _("太陽光線", "Ray of Sunlight");
\r
1565 if (desc) return _("光線を放つ。光りを嫌うモンスターに効果がある。", "Fires a beam of light which damages to light-sensitive monsters.");
\r
1571 if (info) return info_damage(dice, sides, 0);
\r
1575 if (!get_aim_dir(&dir)) return NULL;
\r
1576 msg_print(_("太陽光線が現れた。", "A line of sunlight appears."));
\r
1577 lite_line(dir, damroll(6, 8));
\r
1583 if (name) return _("足かせ", "Entangle");
\r
1584 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
\r
1589 if (info) return info_power(power);
\r
1593 slow_monsters(plev);
\r
1599 if (name) return _("動物召喚", "Summon Animal");
\r
1600 if (desc) return _("動物を1体召喚する。", "Summons an animal.");
\r
1605 if (!(summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_ANIMAL_RANGER, (PM_ALLOW_GROUP | PM_FORCE_PET))))
\r
1607 msg_print(_("動物は現れなかった。", "No animals arrive."));
\r
1615 if (name) return _("薬草治療", "Herbal Healing");
\r
1616 if (desc) return _("体力を大幅に回復させ、負傷、朦朧状態、毒から全快する。", "Heals HP greatly. And heals cut, stun and poison completely.");
\r
1621 if (info) return info_heal(0, 0, heal);
\r
1634 if (name) return _("階段生成", "Stair Building");
\r
1635 if (desc) return _("自分のいる位置に階段を作る。", "Creates a stair which goes down or up.");
\r
1646 if (name) return _("肌石化", "Stone Skin");
\r
1647 if (desc) return _("一定時間、ACを上昇させる。", "Gives bonus to AC for a while.");
\r
1653 if (info) return info_duration(base, sides);
\r
1657 set_shield(randint1(sides) + base, FALSE);
\r
1663 if (name) return _("真・耐性", "Resistance True");
\r
1664 if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
\r
1665 "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
1670 if (info) return info_duration(base, base);
\r
1674 set_oppose_acid(randint1(base) + base, FALSE);
\r
1675 set_oppose_elec(randint1(base) + base, FALSE);
\r
1676 set_oppose_fire(randint1(base) + base, FALSE);
\r
1677 set_oppose_cold(randint1(base) + base, FALSE);
\r
1678 set_oppose_pois(randint1(base) + base, FALSE);
\r
1684 if (name) return _("森林創造", "Forest Creation");
\r
1685 if (desc) return _("周囲に木を作り出す。", "Creates trees in all adjacent squares.");
\r
1696 if (name) return _("動物友和", "Animal Friendship");
\r
1697 if (desc) return _("視界内の全ての動物を魅了する。抵抗されると無効。", "Attempts to charm all animals in sight.");
\r
1700 int power = plev * 2;
\r
1702 if (info) return info_power(power);
\r
1706 charm_animals(power);
\r
1712 if (name) return _("試金石", "Stone Tell");
\r
1713 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
\r
1718 if (!identify_fully(FALSE)) return NULL;
\r
1724 if (name) return _("石の壁", "Wall of Stone");
\r
1725 if (desc) return _("自分の周囲に花崗岩の壁を作る。", "Creates granite walls in all adjacent squares.");
\r
1736 if (name) return _("腐食防止", "Protect from Corrosion");
\r
1737 if (desc) return _("アイテムを酸で傷つかないよう加工する。", "Makes an equipment acid-proof.");
\r
1742 if (!rustproof()) return NULL;
\r
1748 if (name) return _("地震", "Earthquake");
\r
1749 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
\r
1750 "Shakes dungeon structure, and results in random swapping of floors and walls.");
\r
1755 if (info) return info_radius(rad);
\r
1759 earthquake(p_ptr->y, p_ptr->x, rad);
\r
1765 if (name) return _("カマイタチ", "Cyclone");
\r
1766 if (desc) return _("全方向に向かって攻撃する。", "Attacks all adjacent monsters.");
\r
1773 monster_type *m_ptr;
\r
1775 for (dir = 0; dir < 8; dir++)
\r
1777 y = p_ptr->y + ddy_ddd[dir];
\r
1778 x = p_ptr->x + ddx_ddd[dir];
\r
1779 c_ptr = &cave[y][x];
\r
1781 /* Get the monster */
\r
1782 m_ptr = &m_list[c_ptr->m_idx];
\r
1784 /* Hack -- attack monsters */
\r
1785 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
\r
1786 py_attack(y, x, 0);
\r
1793 if (name) return _("ブリザード", "Blizzard");
\r
1794 if (desc) return _("巨大な冷気の球を放つ。", "Fires a huge ball of cold.");
\r
1797 HIT_POINT dam = 70 + plev * 3 / 2;
\r
1798 int rad = plev / 12 + 1;
\r
1800 if (info) return info_damage(0, 0, dam);
\r
1804 if (!get_aim_dir(&dir)) return NULL;
\r
1806 fire_ball(GF_COLD, dir, dam, rad);
\r
1812 if (name) return _("稲妻嵐", "Lightning Storm");
\r
1813 if (desc) return _("巨大な電撃の球を放つ。", "Fires a huge electric ball.");
\r
1816 HIT_POINT dam = 90 + plev * 3 / 2;
\r
1817 int rad = plev / 12 + 1;
\r
1819 if (info) return info_damage(0, 0, dam);
\r
1823 if (!get_aim_dir(&dir)) return NULL;
\r
1824 fire_ball(GF_ELEC, dir, dam, rad);
\r
1831 if (name) return _("渦潮", "Whirlpool");
\r
1832 if (desc) return _("巨大な水の球を放つ。", "Fires a huge ball of water.");
\r
1835 HIT_POINT dam = 100 + plev * 3 / 2;
\r
1836 int rad = plev / 12 + 1;
\r
1838 if (info) return info_damage(0, 0, dam);
\r
1842 if (!get_aim_dir(&dir)) return NULL;
\r
1843 fire_ball(GF_WATER, dir, dam, rad);
\r
1849 if (name) return _("陽光召喚", "Call Sunlight");
\r
1850 if (desc) return _("自分を中心とした光の球を発生させる。さらに、その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。",
\r
1851 "Generates ball of light centered on you. Maps and lights whole dungeon level. Knows all objects location.");
\r
1854 HIT_POINT dam = 150;
\r
1857 if (info) return info_damage(0, 0, dam/2);
\r
1861 fire_ball(GF_LITE, 0, dam, rad);
\r
1862 chg_virtue(V_KNOWLEDGE, 1);
\r
1863 chg_virtue(V_ENLIGHTEN, 1);
\r
1866 if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)
\r
1868 msg_print(_("日光があなたの肉体を焦がした!", "The sunlight scorches your flesh!"));
\r
1869 take_hit(DAMAGE_NOESCAPE, 50, _("日光", "sunlight"), -1);
\r
1876 if (name) return _("精霊の刃", "Elemental Branding");
\r
1877 if (desc) return _("武器に炎か冷気の属性をつける。", "Makes current weapon fire or frost branded.");
\r
1882 brand_weapon(randint0(2));
\r
1888 if (name) return _("自然の脅威", "Nature's Wrath");
\r
1889 if (desc) return _("近くの全てのモンスターにダメージを与え、地震を起こし、自分を中心とした分解の球を発生させる。",
\r
1890 "Damages all monsters in sight. Makes quake. Generates disintegration ball centered on you.");
\r
1893 int d_dam = 4 * plev;
\r
1894 int b_dam = (100 + plev) * 2;
\r
1895 int b_rad = 1 + plev / 12;
\r
1896 int q_rad = 20 + plev / 2;
\r
1898 if (info) return format("%s%d+%d", s_dam, d_dam, b_dam/2);
\r
1902 dispel_monsters(d_dam);
\r
1903 earthquake(p_ptr->y, p_ptr->x, q_rad);
\r
1904 project(0, b_rad, p_ptr->y, p_ptr->x, b_dam, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM, -1);
\r
1916 * @brief 暗黒領域魔法の各処理を行う
\r
1917 * @param spell 魔法ID
\r
1918 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
1919 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
1921 static cptr do_death_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
1923 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
1924 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
1925 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
1926 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
1928 static const char s_dam[] = _("損傷:", "dam ");
\r
1929 static const char s_random[] = _("ランダム", "random");
\r
1932 int plev = p_ptr->lev;
\r
1937 if (name) return _("無生命感知", "Detect Unlife");
\r
1938 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
\r
1941 int rad = DETECT_RAD_DEFAULT;
\r
1943 if (info) return info_radius(rad);
\r
1947 detect_monsters_nonliving(rad);
\r
1953 if (name) return _("呪殺弾", "Malediction");
\r
1954 if (desc) return _("ごく小さな邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",
\r
1955 "Fires a tiny ball of evil power which hurts good monsters greatly.");
\r
1958 int dice = 3 + (plev - 1) / 5;
\r
1962 if (info) return info_damage(dice, sides, 0);
\r
1966 if (!get_aim_dir(&dir)) return NULL;
\r
1969 * A radius-0 ball may (1) be aimed at
\r
1970 * objects etc., and will affect them;
\r
1971 * (2) may be aimed at ANY visible
\r
1972 * monster, unlike a 'bolt' which must
\r
1973 * travel to the monster.
\r
1976 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides), rad);
\r
1980 /* Special effect first */
\r
1981 int effect = randint1(1000);
\r
1983 if (effect == 666)
\r
1984 fire_ball_hide(GF_DEATH_RAY, dir, plev * 200, 0);
\r
1985 else if (effect < 500)
\r
1986 fire_ball_hide(GF_TURN_ALL, dir, plev, 0);
\r
1987 else if (effect < 800)
\r
1988 fire_ball_hide(GF_OLD_CONF, dir, plev, 0);
\r
1990 fire_ball_hide(GF_STUN, dir, plev, 0);
\r
1997 if (name) return _("邪悪感知", "Detect Evil");
\r
1998 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
\r
2001 int rad = DETECT_RAD_DEFAULT;
\r
2003 if (info) return info_radius(rad);
\r
2007 detect_monsters_evil(rad);
\r
2013 if (name) return _("悪臭雲", "Stinking Cloud");
\r
2014 if (desc) return _("毒の球を放つ。", "Fires a ball of poison.");
\r
2017 HIT_POINT dam = 10 + plev / 2;
\r
2020 if (info) return info_damage(0, 0, dam);
\r
2024 if (!get_aim_dir(&dir)) return NULL;
\r
2026 fire_ball(GF_POIS, dir, dam, rad);
\r
2032 if (name) return _("黒い眠り", "Black Sleep");
\r
2033 if (desc) return _("1体のモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep a monster.");
\r
2038 if (info) return info_power(power);
\r
2042 if (!get_aim_dir(&dir)) return NULL;
\r
2044 sleep_monster(dir, plev);
\r
2050 if (name) return _("耐毒", "Resist Poison");
\r
2051 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",
\r
2052 "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");
\r
2057 if (info) return info_duration(base, base);
\r
2061 set_oppose_pois(randint1(base) + base, FALSE);
\r
2067 if (name) return _("恐慌", "Horrify");
\r
2068 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
\r
2073 if (info) return info_power(power);
\r
2077 if (!get_aim_dir(&dir)) return NULL;
\r
2079 fear_monster(dir, power);
\r
2080 stun_monster(dir, power);
\r
2086 if (name) return _("アンデッド従属", "Enslave Undead");
\r
2087 if (desc) return _("アンデッド1体を魅了する。抵抗されると無効。", "Attempts to charm an undead monster.");
\r
2092 if (info) return info_power(power);
\r
2096 if (!get_aim_dir(&dir)) return NULL;
\r
2098 control_one_undead(dir, power);
\r
2104 if (name) return _("エントロピーの球", "Orb of Entropy");
\r
2105 if (desc) return _("生命のある者のHPと最大HP双方にダメージを与える効果のある球を放つ。", "Fires a ball which damages to both HP and MaxHP of living monsters.");
\r
2110 int rad = (plev < 30) ? 2 : 3;
\r
2113 if (p_ptr->pclass == CLASS_MAGE ||
\r
2114 p_ptr->pclass == CLASS_HIGH_MAGE ||
\r
2115 p_ptr->pclass == CLASS_SORCERER)
\r
2116 base = plev + plev / 2;
\r
2118 base = plev + plev / 4;
\r
2121 if (info) return info_damage(dice, sides, base);
\r
2125 if (!get_aim_dir(&dir)) return NULL;
\r
2127 fire_ball(GF_HYPODYNAMIA, dir, damroll(dice, sides) + base, rad);
\r
2133 if (name) return _("地獄の矢", "Nether Bolt");
\r
2134 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
\r
2137 int dice = 8 + (plev - 5) / 4;
\r
2140 if (info) return info_damage(dice, sides, 0);
\r
2144 if (!get_aim_dir(&dir)) return NULL;
\r
2146 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
\r
2152 if (name) return _("殺戮雲", "Cloud kill");
\r
2153 if (desc) return _("自分を中心とした毒の球を発生させる。", "Generate a ball of poison centered on you.");
\r
2156 HIT_POINT dam = (30 + plev) * 2;
\r
2157 int rad = plev / 10 + 2;
\r
2159 if (info) return info_damage(0, 0, dam/2);
\r
2163 project(0, rad, p_ptr->y, p_ptr->x, dam, GF_POIS, PROJECT_KILL | PROJECT_ITEM, -1);
\r
2169 if (name) return _("モンスター消滅", "Genocide One");
\r
2170 if (desc) return _("モンスター1体を消し去る。経験値やアイテムは手に入らない。抵抗されると無効。", "Attempts to vanish a monster.");
\r
2173 int power = plev + 50;
\r
2175 if (info) return info_power(power);
\r
2179 if (!get_aim_dir(&dir)) return NULL;
\r
2181 fire_ball_hide(GF_GENOCIDE, dir, power, 0);
\r
2187 if (name) return _("毒の刃", "Poison Branding");
\r
2188 if (desc) return _("武器に毒の属性をつける。", "Makes current weapon poison branded.");
\r
2199 if (name) return _("吸血の矢", "Vampiric Bolt");
\r
2200 if (desc) return _("ボルトによりモンスター1体から生命力を吸いとる。吸いとった生命力によって満腹度が上がる。",
\r
2201 "Absorbs some HP from a monster and gives them to you by bolt. You will also gain nutritional sustenance from this.");
\r
2205 int sides = plev * 2;
\r
2206 int base = plev * 2;
\r
2208 if (info) return info_damage(dice, sides, base);
\r
2212 HIT_POINT dam = base + damroll(dice, sides);
\r
2214 if (!get_aim_dir(&dir)) return NULL;
\r
2216 if (hypodynamic_bolt(dir, dam))
\r
2218 chg_virtue(V_SACRIFICE, -1);
\r
2219 chg_virtue(V_VITALITY, -1);
\r
2224 * Gain nutritional sustenance:
\r
2227 * A Food ration gives 5000
\r
2228 * food points (by contrast)
\r
2229 * Don't ever get more than
\r
2230 * "Full" this way But if we
\r
2231 * ARE Gorged, it won't cure
\r
2234 dam = p_ptr->food + MIN(5000, 100 * dam);
\r
2236 /* Not gorged already */
\r
2237 if (p_ptr->food < PY_FOOD_MAX)
\r
2238 set_food(dam >= PY_FOOD_MAX ? PY_FOOD_MAX - 1 : dam);
\r
2245 if (name) return _("反魂の術", "Animate dead");
\r
2246 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
\r
2251 animate_dead(0, p_ptr->y, p_ptr->x);
\r
2257 if (name) return _("抹殺", "Genocide");
\r
2258 if (desc) return _("指定した文字のモンスターを現在の階から消し去る。抵抗されると無効。",
\r
2259 "Eliminates an entire class of monster, exhausting you. Powerful or unique monsters may resist.");
\r
2262 int power = plev+50;
\r
2264 if (info) return info_power(power);
\r
2268 symbol_genocide(power, TRUE);
\r
2274 if (name) return _("狂戦士化", "Berserk");
\r
2275 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");
\r
2280 if (info) return info_duration(base, base);
\r
2284 set_shero(randint1(base) + base, FALSE);
\r
2292 if (name) return _("悪霊召喚", "Invoke Spirits");
\r
2293 if (desc) return _("ランダムで様々な効果が起こる。", "Causes random effects.");
\r
2296 if (info) return s_random;
\r
2300 if (!get_aim_dir(&dir)) return NULL;
\r
2302 cast_invoke_spirits(dir);
\r
2308 if (name) return _("暗黒の矢", "Dark Bolt");
\r
2309 if (desc) return _("暗黒のボルトもしくはビームを放つ。", "Fires a bolt or beam of darkness.");
\r
2312 int dice = 4 + (plev - 5) / 4;
\r
2315 if (info) return info_damage(dice, sides, 0);
\r
2319 if (!get_aim_dir(&dir)) return NULL;
\r
2321 fire_bolt_or_beam(beam_chance(), GF_DARK, dir, damroll(dice, sides));
\r
2327 if (name) return _("狂乱戦士", "Battle Frenzy");
\r
2328 if (desc) return _("狂戦士化し、恐怖を除去し、加速する。",
\r
2329 "Gives another bonus to hit and HP, immunity to fear for a while. Hastes you. But decreases AC.");
\r
2333 int sp_base = plev / 2;
\r
2334 int sp_sides = 20 + plev / 2;
\r
2336 if (info) return info_duration(b_base, b_base);
\r
2340 set_shero(randint1(25) + 25, FALSE);
\r
2343 set_fast(randint1(sp_sides) + sp_base, FALSE);
\r
2349 if (name) return _("吸血の刃", "Vampiric Branding");
\r
2350 if (desc) return _("武器に吸血の属性をつける。", "Makes current weapon Vampiric.");
\r
2361 if (name) return _("吸血の連矢", "Vampiric Bolts");
\r
2362 if (desc) return _("3連射のボルトによりモンスター1体から生命力を吸いとる。吸いとった生命力によって体力が回復する。",
\r
2363 "Fires 3 bolts. Each of the bolts absorbs some HP from a monster and gives them to you.");
\r
2365 HIT_POINT dam = 100;
\r
2367 if (info) return format("%s3*%d", s_dam, dam);
\r
2373 if (!get_aim_dir(&dir)) return NULL;
\r
2375 chg_virtue(V_SACRIFICE, -1);
\r
2376 chg_virtue(V_VITALITY, -1);
\r
2378 for (i = 0; i < 3; i++)
\r
2380 if (hypodynamic_bolt(dir, dam))
\r
2388 if (name) return _("死の言魂", "Nether Wave");
\r
2389 if (desc) return _("視界内の生命のあるモンスターにダメージを与える。", "Damages all living monsters in sight.");
\r
2392 int sides = plev * 3;
\r
2394 if (info) return info_damage(1, sides, 0);
\r
2398 dispel_living(randint1(sides));
\r
2404 if (name) return _("暗黒の嵐", "Darkness Storm");
\r
2405 if (desc) return _("巨大な暗黒の球を放つ。", "Fires a huge ball of darkness.");
\r
2408 HIT_POINT dam = 100 + plev * 2;
\r
2411 if (info) return info_damage(0, 0, dam);
\r
2415 if (!get_aim_dir(&dir)) return NULL;
\r
2417 fire_ball(GF_DARK, dir, dam, rad);
\r
2423 if (name) return _("死の光線", "Death Ray");
\r
2424 if (desc) return _("死の光線を放つ。", "Fires a beam of death.");
\r
2429 if (!get_aim_dir(&dir)) return NULL;
\r
2431 death_ray(dir, plev);
\r
2437 if (name) return _("死者召喚", "Raise the Dead");
\r
2438 if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");
\r
2444 bool pet = one_in_(3);
\r
2447 type = (plev > 47 ? SUMMON_HI_UNDEAD : SUMMON_UNDEAD);
\r
2449 if (!pet || (pet && (plev > 24) && one_in_(3)))
\r
2450 flg |= PM_ALLOW_GROUP;
\r
2452 if (pet) flg |= PM_FORCE_PET;
\r
2453 else flg |= (PM_ALLOW_UNIQUE | PM_NO_PET);
\r
2455 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, type, flg))
\r
2457 msg_print(_("冷たい風があなたの周りに吹き始めた。それは腐敗臭を運んでいる...",
\r
2458 "Cold winds begin to blow around you, carrying with them the stench of decay..."));
\r
2463 msg_print(_("古えの死せる者共があなたに仕えるため土から甦った!",
\r
2464 "Ancient, long-dead forms arise from the ground to serve you!"));
\r
2468 msg_print(_("死者が甦った。眠りを妨げるあなたを罰するために!",
\r
2469 "'The dead arise... to punish you for disturbing them!'"));
\r
2472 chg_virtue(V_UNLIFE, 1);
\r
2479 if (name) return _("死者の秘伝", "Esoteria");
\r
2480 if (desc) return _("アイテムを1つ識別する。レベルが高いとアイテムの能力を完全に知ることができる。",
\r
2481 "Identifies an item. Or *identifies* an item at higher level.");
\r
2486 if (randint1(50) > plev)
\r
2488 if (!ident_spell(FALSE)) return NULL;
\r
2492 if (!identify_fully(FALSE)) return NULL;
\r
2499 if (name) return _("吸血鬼変化", "Polymorph Vampire");
\r
2500 if (desc) return _("一定時間、吸血鬼に変化する。変化している間は本来の種族の能力を失い、代わりに吸血鬼としての能力を得る。",
\r
2501 "Mimic a vampire for a while. Loses abilities of original race and gets abilities as a vampire.");
\r
2504 int base = 10 + plev / 2;
\r
2506 if (info) return info_duration(base, base);
\r
2510 set_mimic(base + randint1(base), MIMIC_VAMPIRE, FALSE);
\r
2516 if (name) return _("経験値復活", "Restore Life");
\r
2517 if (desc) return _("失った経験値を回復する。", "Restore lost experience.");
\r
2528 if (name) return _("周辺抹殺", "Mass Genocide");
\r
2529 if (desc) return _("自分の周囲にいるモンスターを現在の階から消し去る。抵抗されると無効。",
\r
2530 "Eliminates all nearby monsters, exhausting you. Powerful or unique monsters may be able to resist.");
\r
2533 int power = plev + 50;
\r
2535 if (info) return info_power(power);
\r
2539 mass_genocide(power, TRUE);
\r
2545 if (name) return _("地獄の劫火", "Hellfire");
\r
2546 if (desc) return _("邪悪な力を持つ宝珠を放つ。善良なモンスターには大きなダメージを与える。",
\r
2547 "Fires a powerful ball of evil power. Hurts good monsters greatly.");
\r
2550 HIT_POINT dam = 666;
\r
2553 if (info) return info_damage(0, 0, dam);
\r
2557 if (!get_aim_dir(&dir)) return NULL;
\r
2559 fire_ball(GF_HELL_FIRE, dir, dam, rad);
\r
2560 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("地獄の劫火の呪文を唱えた疲労", "the strain of casting Hellfire"), -1);
\r
2566 if (name) return _("幽体化", "Wraithform");
\r
2567 if (desc) return _("一定時間、壁を通り抜けることができ受けるダメージが軽減される幽体の状態に変身する。",
\r
2568 "Becomes wraith form which gives ability to pass walls and makes all damages half.");
\r
2571 int base = plev / 2;
\r
2573 if (info) return info_duration(base, base);
\r
2577 set_wraith_form(randint1(base) + base, FALSE);
\r
2588 * @brief トランプ領域魔法の各処理を行う
\r
2589 * @param spell 魔法ID
\r
2590 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
2591 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
2593 static cptr do_trump_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
2595 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
2596 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
2597 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
2598 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
2599 bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
\r
2600 static const char s_random[] = _("ランダム", "random");
\r
2603 int plev = p_ptr->lev;
\r
2608 if (name) return _("ショート・テレポート", "Phase Door");
\r
2609 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");
\r
2612 POSITION range = 10;
\r
2614 if (info) return info_range(range);
\r
2618 teleport_player(range, 0L);
\r
2624 if (name) return _("蜘蛛のカード", "Trump Spiders");
\r
2625 if (desc) return _("蜘蛛を召喚する。", "Summons spiders.");
\r
2630 msg_print(_("あなたは蜘蛛のカードに集中する...", "You concentrate on the trump of an spider..."));
\r
2631 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_SPIDER, PM_ALLOW_GROUP))
\r
2635 msg_print(_("召喚された蜘蛛は怒っている!", "The summoned spiders get angry!"));
\r
2643 if (name) return _("シャッフル", "Shuffle");
\r
2644 if (desc) return _("カードの占いをする。", "Causes random effects.");
\r
2647 if (info) return s_random;
\r
2657 if (name) return _("フロア・リセット", "Reset Recall");
\r
2658 if (desc) return _("最深階を変更する。", "Resets the 'deepest' level for recall spell.");
\r
2663 if (!reset_recall()) return NULL;
\r
2669 if (name) return _("テレポート", "Teleport");
\r
2670 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
\r
2673 POSITION range = plev * 4;
\r
2675 if (info) return info_range(range);
\r
2679 teleport_player(range, 0L);
\r
2685 if (name) return _("感知のカード", "Trump Spying");
\r
2686 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
\r
2692 if (info) return info_duration(base, sides);
\r
2696 set_tim_esp(randint1(sides) + base, FALSE);
\r
2702 if (name) return _("テレポート・モンスター", "Teleport Away");
\r
2703 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
\r
2708 if (info) return info_power(power);
\r
2712 if (!get_aim_dir(&dir)) return NULL;
\r
2714 fire_beam(GF_AWAY_ALL, dir, power);
\r
2720 if (name) return _("動物のカード", "Trump Animals");
\r
2721 if (desc) return _("1体の動物を召喚する。", "Summons an animal.");
\r
2726 int type = (!fail ? SUMMON_ANIMAL_RANGER : SUMMON_ANIMAL);
\r
2727 msg_print(_("あなたは動物のカードに集中する...", "You concentrate on the trump of an animal..."));
\r
2728 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, type, 0L))
\r
2732 msg_print(_("召喚された動物は怒っている!", "The summoned animal gets angry!"));
\r
2740 if (name) return _("移動のカード", "Trump Reach");
\r
2741 if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");
\r
2744 int weight = plev * 15;
\r
2746 if (info) return info_weight(weight);
\r
2750 if (!get_aim_dir(&dir)) return NULL;
\r
2752 fetch(dir, weight, FALSE);
\r
2758 if (name) return _("カミカゼのカード", "Trump Kamikaze");
\r
2759 if (desc) return _("複数の爆発するモンスターを召喚する。", "Summons monsters which explode by itself.");
\r
2769 if (!target_set(TARGET_KILL)) return NULL;
\r
2775 /* Summons near player when failed */
\r
2780 if (p_ptr->pclass == CLASS_BEASTMASTER)
\r
2781 type = SUMMON_KAMIKAZE_LIVING;
\r
2783 type = SUMMON_KAMIKAZE;
\r
2785 msg_print(_("あなたはカミカゼのカードに集中する...", "You concentrate on several trumps at once..."));
\r
2786 if (trump_summoning(2 + randint0(plev / 7), !fail, y, x, 0, type, 0L))
\r
2790 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
\r
2798 if (name) return _("幻霊召喚", "Phantasmal Servant");
\r
2799 if (desc) return _("1体の幽霊を召喚する。", "Summons a ghost.");
\r
2802 /* Phantasmal Servant is not summoned as enemy when failed */
\r
2805 int summon_lev = plev * 2 / 3 + randint1(plev / 2);
\r
2807 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, (summon_lev * 3 / 2), SUMMON_PHANTOM, 0L))
\r
2809 msg_print(_("御用でございますか、御主人様?", "'Your wish, master?'"));
\r
2816 if (name) return _("スピード・モンスター", "Haste Monster");
\r
2817 if (desc) return _("モンスター1体を加速させる。", "Hastes a monster.");
\r
2824 /* Temporary enable target_pet option */
\r
2825 bool old_target_pet = target_pet;
\r
2826 target_pet = TRUE;
\r
2828 result = get_aim_dir(&dir);
\r
2830 /* Restore target_pet option */
\r
2831 target_pet = old_target_pet;
\r
2833 if (!result) return NULL;
\r
2835 speed_monster(dir, plev);
\r
2841 if (name) return _("テレポート・レベル", "Teleport Level");
\r
2842 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");
\r
2847 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
\r
2848 teleport_level(0);
\r
2854 if (name) return _("次元の扉", "Dimension Door");
\r
2855 if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleport to given location.");
\r
2858 POSITION range = plev / 2 + 10;
\r
2860 if (info) return info_range(range);
\r
2864 msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));
\r
2865 if (!dimension_door()) return NULL;
\r
2871 if (name) return _("帰還の呪文", "Word of Recall");
\r
2872 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
\r
2873 "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
\r
2879 if (info) return info_delay(base, sides);
\r
2883 if (!word_of_recall()) return NULL;
\r
2889 if (name) return _("怪物追放", "Banish");
\r
2890 if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");
\r
2893 int power = plev * 4;
\r
2895 if (info) return info_power(power);
\r
2899 banish_monsters(power);
\r
2905 if (name) return _("位置交換のカード", "Swap Position");
\r
2906 if (desc) return _("1体のモンスターと位置を交換する。", "Swap positions of you and a monster.");
\r
2913 /* HACK -- No range limit */
\r
2914 project_length = -1;
\r
2916 result = get_aim_dir(&dir);
\r
2918 /* Restore range to default */
\r
2919 project_length = 0;
\r
2921 if (!result) return NULL;
\r
2923 teleport_swap(dir);
\r
2929 if (name) return _("アンデッドのカード", "Trump Undead");
\r
2930 if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");
\r
2935 msg_print(_("あなたはアンデッドのカードに集中する...", "You concentrate on the trump of an undead creature..."));
\r
2936 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_UNDEAD, 0L))
\r
2940 msg_print(_("召喚されたアンデッドは怒っている!", "The summoned undead creature gets angry!"));
\r
2948 if (name) return _("爬虫類のカード", "Trump Reptiles");
\r
2949 if (desc) return _("1体のヒドラを召喚する。", "Summons a hydra.");
\r
2954 msg_print(_("あなたは爬虫類のカードに集中する...", "You concentrate on the trump of a reptile..."));
\r
2955 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HYDRA, 0L))
\r
2959 msg_print(_("召喚された爬虫類は怒っている!", "The summoned reptile gets angry!"));
\r
2967 if (name) return _("モンスターのカード", "Trump Monsters");
\r
2968 if (desc) return _("複数のモンスターを召喚する。", "Summons some monsters.");
\r
2974 msg_print(_("あなたはモンスターのカードに集中する...", "You concentrate on several trumps at once..."));
\r
2975 if (p_ptr->pclass == CLASS_BEASTMASTER)
\r
2976 type = SUMMON_LIVING;
\r
2980 if (trump_summoning((1 + (plev - 15)/ 10), !fail, p_ptr->y, p_ptr->x, 0, type, 0L))
\r
2984 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
\r
2993 if (name) return _("ハウンドのカード", "Trump Hounds");
\r
2994 if (desc) return _("1グループのハウンドを召喚する。", "Summons a group of hounds.");
\r
2999 msg_print(_("あなたはハウンドのカードに集中する...", "You concentrate on the trump of a hound..."));
\r
3000 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HOUND, PM_ALLOW_GROUP))
\r
3004 msg_print(_("召喚されたハウンドは怒っている!", "The summoned hounds get angry!"));
\r
3012 if (name) return _("トランプの刃", "Trump Branding");
\r
3013 if (desc) return _("武器にトランプの属性をつける。", "Makes current weapon a Trump weapon.");
\r
3024 if (name) return _("人間トランプ", "Living Trump");
\r
3025 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",
\r
3026 "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");
\r
3034 /* Teleport control */
\r
3037 /* Random teleportation (uncontrolled) */
\r
3040 /* Gain the mutation */
\r
3041 if (gain_random_mutation(mutation))
\r
3043 msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));
\r
3050 if (name) return _("サイバーデーモンのカード", "Trump Cyberdemon");
\r
3051 if (desc) return _("1体のサイバーデーモンを召喚する。", "Summons a cyber demon.");
\r
3056 msg_print(_("あなたはサイバーデーモンのカードに集中する...", "You concentrate on the trump of a Cyberdemon..."));
\r
3057 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_CYBER, 0L))
\r
3061 msg_print(_("召喚されたサイバーデーモンは怒っている!", "The summoned Cyberdemon gets angry!"));
\r
3069 if (name) return _("予見のカード", "Trump Divination");
\r
3070 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
\r
3071 "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
\r
3074 int rad = DETECT_RAD_DEFAULT;
\r
3076 if (info) return info_radius(rad);
\r
3086 if (name) return _("知識のカード", "Trump Lore");
\r
3087 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
\r
3092 if (!identify_fully(FALSE)) return NULL;
\r
3098 if (name) return _("回復モンスター", "Heal Monster");
\r
3099 if (desc) return _("モンスター1体の体力を回復させる。", "Heal a monster.");
\r
3102 int heal = plev * 10 + 200;
\r
3104 if (info) return info_heal(0, 0, heal);
\r
3110 /* Temporary enable target_pet option */
\r
3111 bool old_target_pet = target_pet;
\r
3112 target_pet = TRUE;
\r
3114 result = get_aim_dir(&dir);
\r
3116 /* Restore target_pet option */
\r
3117 target_pet = old_target_pet;
\r
3119 if (!result) return NULL;
\r
3121 heal_monster(dir, heal);
\r
3127 if (name) return _("ドラゴンのカード", "Trump Dragon");
\r
3128 if (desc) return _("1体のドラゴンを召喚する。", "Summons a dragon.");
\r
3133 msg_print(_("あなたはドラゴンのカードに集中する...", "You concentrate on the trump of a dragon..."));
\r
3134 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_DRAGON, 0L))
\r
3138 msg_print(_("召喚されたドラゴンは怒っている!", "The summoned dragon gets angry!"));
\r
3146 if (name) return _("隕石のカード", "Trump Meteor");
\r
3147 if (desc) return _("自分の周辺に隕石を落とす。", "Makes meteor balls fall down to nearby random locations.");
\r
3150 HIT_POINT dam = plev * 2;
\r
3153 if (info) return info_multi_damage(dam);
\r
3157 cast_meteor(dam, rad);
\r
3163 if (name) return _("デーモンのカード", "Trump Demon");
\r
3164 if (desc) return _("1体の悪魔を召喚する。", "Summons a demon.");
\r
3169 msg_print(_("あなたはデーモンのカードに集中する...", "You concentrate on the trump of a demon..."));
\r
3170 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_DEMON, 0L))
\r
3174 msg_print(_("召喚されたデーモンは怒っている!", "The summoned demon gets angry!"));
\r
3182 if (name) return _("地獄のカード", "Trump Greater Undead");
\r
3183 if (desc) return _("1体の上級アンデッドを召喚する。", "Summons a greater undead.");
\r
3188 msg_print(_("あなたは強力なアンデッドのカードに集中する...", "You concentrate on the trump of a greater undead being..."));
\r
3189 /* May allow unique depend on level and dice roll */
\r
3190 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HI_UNDEAD, PM_ALLOW_UNIQUE))
\r
3194 msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead creature gets angry!"));
\r
3202 if (name) return _("古代ドラゴンのカード", "Trump Ancient Dragon");
\r
3203 if (desc) return _("1体の古代ドラゴンを召喚する。", "Summons an ancient dragon.");
\r
3210 if (p_ptr->pclass == CLASS_BEASTMASTER)
\r
3211 type = SUMMON_HI_DRAGON_LIVING;
\r
3213 type = SUMMON_HI_DRAGON;
\r
3215 msg_print(_("あなたは古代ドラゴンのカードに集中する...", "You concentrate on the trump of an ancient dragon..."));
\r
3216 /* May allow unique depend on level and dice roll */
\r
3217 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, type, PM_ALLOW_UNIQUE))
\r
3221 msg_print(_("召喚された古代ドラゴンは怒っている!", "The summoned ancient dragon gets angry!"));
\r
3234 * @brief 匠領域魔法の各処理を行う
\r
3235 * @param spell 魔法ID
\r
3236 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
3237 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
3239 static cptr do_craft_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
3241 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
3242 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
3243 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
3244 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
3246 int plev = p_ptr->lev;
\r
3251 if (name) return _("赤外線視力", "Infravision");
\r
3252 if (desc) return _("一定時間、赤外線視力が増強される。", "Gives infravision for a while.");
\r
3257 if (info) return info_duration(base, base);
\r
3261 set_tim_infra(base + randint1(base), FALSE);
\r
3267 if (name) return _("回復力強化", "Regeneration");
\r
3268 if (desc) return _("一定時間、回復力が増強される。", "Gives regeneration ability for a while.");
\r
3273 if (info) return info_duration(base, base);
\r
3277 set_tim_regen(base + randint1(base), FALSE);
\r
3283 if (name) return _("空腹充足", "Satisfy Hunger");
\r
3284 if (desc) return _("満腹になる。", "Satisfies hunger.");
\r
3289 set_food(PY_FOOD_MAX - 1);
\r
3295 if (name) return _("耐冷気", "Resist Cold");
\r
3296 if (desc) return _("一定時間、冷気への耐性を得る。装備による耐性に累積する。",
\r
3297 "Gives resistance to cold. This resistance can be added to which from equipment for more powerful resistance.");
\r
3302 if (info) return info_duration(base, base);
\r
3306 set_oppose_cold(randint1(base) + base, FALSE);
\r
3312 if (name) return _("耐火炎", "Resist Fire");
\r
3313 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
\r
3314 "Gives resistance to fire. This resistance can be added to which from equipment for more powerful resistance.");
\r
3319 if (info) return info_duration(base, base);
\r
3323 set_oppose_fire(randint1(base) + base, FALSE);
\r
3329 if (name) return _("士気高揚", "Heroism");
\r
3330 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
3335 if (info) return info_duration(base, base);
\r
3339 set_hero(randint1(base) + base, FALSE);
\r
3347 if (name) return _("耐電撃", "Resist Lightning");
\r
3348 if (desc) return _("一定時間、電撃への耐性を得る。装備による耐性に累積する。",
\r
3349 "Gives resistance to electricity. This resistance can be added to which from equipment for more powerful resistance.");
\r
3354 if (info) return info_duration(base, base);
\r
3358 set_oppose_elec(randint1(base) + base, FALSE);
\r
3364 if (name) return _("耐酸", "Resist Acid");
\r
3365 if (desc) return _("一定時間、酸への耐性を得る。装備による耐性に累積する。",
\r
3366 "Gives resistance to acid. This resistance can be added to which from equipment for more powerful resistance.");
\r
3371 if (info) return info_duration(base, base);
\r
3375 set_oppose_acid(randint1(base) + base, FALSE);
\r
3381 if (name) return _("透明視認", "See Invisibility");
\r
3382 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
\r
3387 if (info) return info_duration(base, base);
\r
3391 set_tim_invis(randint1(base) + base, FALSE);
\r
3397 if (name) return _("解呪", "Remove Curse");
\r
3398 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
\r
3403 if (remove_curse())
\r
3405 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
3412 if (name) return _("耐毒", "Resist Poison");
\r
3413 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",
\r
3414 "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");
\r
3419 if (info) return info_duration(base, base);
\r
3423 set_oppose_pois(randint1(base) + base, FALSE);
\r
3429 if (name) return _("狂戦士化", "Berserk");
\r
3430 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");
\r
3435 if (info) return info_duration(base, base);
\r
3439 set_shero(randint1(base) + base, FALSE);
\r
3447 if (name) return _("自己分析", "Self Knowledge");
\r
3448 if (desc) return _("現在の自分の状態を完全に知る。",
\r
3449 "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");
\r
3460 if (name) return _("対邪悪結界", "Protection from Evil");
\r
3461 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");
\r
3464 int base = 3 * plev;
\r
3467 if (info) return info_duration(base, sides);
\r
3471 set_protevil(randint1(sides) + base, FALSE);
\r
3477 if (name) return _("癒し", "Cure");
\r
3478 if (desc) return _("毒、朦朧状態、負傷を全快させ、幻覚を直す。", "Heals poison, stun, cut and hallucination completely.");
\r
3492 if (name) return _("魔法剣", "Mana Branding");
\r
3493 if (desc) return _("一定時間、武器に冷気、炎、電撃、酸、毒のいずれかの属性をつける。武器を持たないと使えない。",
\r
3494 "Makes current weapon some elemental branded. You must wield weapons.");
\r
3497 int base = plev / 2;
\r
3499 if (info) return info_duration(base, base);
\r
3503 if (!choose_ele_attack()) return NULL;
\r
3509 if (name) return _("テレパシー", "Telepathy");
\r
3510 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
\r
3516 if (info) return info_duration(base, sides);
\r
3520 set_tim_esp(randint1(sides) + base, FALSE);
\r
3526 if (name) return _("肌石化", "Stone Skin");
\r
3527 if (desc) return _("一定時間、ACを上昇させる。", "Gives bonus to AC for a while.");
\r
3533 if (info) return info_duration(base, sides);
\r
3537 set_shield(randint1(sides) + base, FALSE);
\r
3543 if (name) return _("全耐性", "Resistance");
\r
3544 if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
\r
3545 "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
3550 if (info) return info_duration(base, base);
\r
3554 set_oppose_acid(randint1(base) + base, FALSE);
\r
3555 set_oppose_elec(randint1(base) + base, FALSE);
\r
3556 set_oppose_fire(randint1(base) + base, FALSE);
\r
3557 set_oppose_cold(randint1(base) + base, FALSE);
\r
3558 set_oppose_pois(randint1(base) + base, FALSE);
\r
3564 if (name) return _("スピード", "Haste Self");
\r
3565 if (desc) return _("一定時間、加速する。", "Hastes you for a while.");
\r
3569 int sides = 20 + plev;
\r
3571 if (info) return info_duration(base, sides);
\r
3575 set_fast(randint1(sides) + base, FALSE);
\r
3581 if (name) return _("壁抜け", "Walk through Wall");
\r
3582 if (desc) return _("一定時間、半物質化し壁を通り抜けられるようになる。", "Gives ability to pass walls for a while.");
\r
3585 int base = plev / 2;
\r
3587 if (info) return info_duration(base, base);
\r
3591 set_kabenuke(randint1(base) + base, FALSE);
\r
3597 if (name) return _("盾磨き", "Polish Shield");
\r
3598 if (desc) return _("盾に反射の属性をつける。", "Makes a shield a shield of reflection.");
\r
3609 if (name) return _("ゴーレム製造", "Create Golem");
\r
3610 if (desc) return _("1体のゴーレムを製造する。", "Creates a golem.");
\r
3615 if (summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_GOLEM, PM_FORCE_PET))
\r
3617 msg_print(_("ゴーレムを作った。", "You make a golem."));
\r
3621 msg_print(_("うまくゴーレムを作れなかった。", "No Golems arrive."));
\r
3628 if (name) return _("魔法の鎧", "Magical armor");
\r
3629 if (desc) return _("一定時間、魔法防御力とACが上がり、混乱と盲目の耐性、反射能力、麻痺知らず、浮遊を得る。",
\r
3630 "Gives resistance to magic, bonus to AC, resistance to confusion, blindness, reflection, free action and levitation for a while.");
\r
3635 if (info) return info_duration(base, base);
\r
3639 set_magicdef(randint1(base) + base, FALSE);
\r
3645 if (name) return _("装備無力化", "Remove Enchantment");
\r
3646 if (desc) return _("武器・防具にかけられたあらゆる魔力を完全に解除する。", "Removes all magics completely from any weapon or armor.");
\r
3651 if (!mundane_spell(TRUE)) return NULL;
\r
3657 if (name) return _("呪い粉砕", "Remove All Curse");
\r
3658 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
\r
3663 if (remove_all_curse())
\r
3665 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
3672 if (name) return _("完全なる知識", "Knowledge True");
\r
3673 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
\r
3678 if (!identify_fully(FALSE)) return NULL;
\r
3684 if (name) return _("武器強化", "Enchant Weapon");
\r
3685 if (desc) return _("武器の命中率修正とダメージ修正を強化する。", "Attempts to increase +to-hit, +to-dam of a weapon.");
\r
3690 if (!enchant_spell(randint0(4) + 1, randint0(4) + 1, 0)) return NULL;
\r
3696 if (name) return _("防具強化", "Enchant Armor");
\r
3697 if (desc) return _("鎧の防御修正を強化する。", "Attempts to increase +AC of an armor.");
\r
3702 if (!enchant_spell(0, 0, randint0(3) + 2)) return NULL;
\r
3708 if (name) return _("武器属性付与", "Brand Weapon");
\r
3709 if (desc) return _("武器にランダムに属性をつける。", "Makes current weapon a random ego weapon.");
\r
3714 brand_weapon(randint0(18));
\r
3720 if (name) return _("人間トランプ", "Living Trump");
\r
3721 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",
\r
3722 "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");
\r
3730 /* Teleport control */
\r
3733 /* Random teleportation (uncontrolled) */
\r
3736 /* Gain the mutation */
\r
3737 if (gain_random_mutation(mutation))
\r
3739 msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));
\r
3746 if (name) return _("属性への免疫", "Immunity");
\r
3747 if (desc) return _("一定時間、冷気、炎、電撃、酸のいずれかに対する免疫を得る。",
\r
3748 "Gives an immunity to fire, cold, electricity or acid for a while.");
\r
3753 if (info) return info_duration(base, base);
\r
3757 if (!choose_ele_immune(base + randint1(base))) return NULL;
\r
3767 * @brief 悪魔領域魔法の各処理を行う
\r
3768 * @param spell 魔法ID
\r
3769 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
3770 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
3772 static cptr do_daemon_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
3774 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
3775 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
3776 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
3777 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
3778 static const char s_dam[] = _("損傷:", "dam ");
\r
3781 int plev = p_ptr->lev;
\r
3786 if (name) return _("マジック・ミサイル", "Magic Missile");
\r
3787 if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");
\r
3790 int dice = 3 + (plev - 1) / 5;
\r
3793 if (info) return info_damage(dice, sides, 0);
\r
3797 if (!get_aim_dir(&dir)) return NULL;
\r
3799 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));
\r
3805 if (name) return _("無生命感知", "Detect Unlife");
\r
3806 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
\r
3809 int rad = DETECT_RAD_DEFAULT;
\r
3811 if (info) return info_radius(rad);
\r
3815 detect_monsters_nonliving(rad);
\r
3821 if (name) return _("邪なる祝福", "Evil Bless");
\r
3822 if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
\r
3827 if (info) return info_duration(base, base);
\r
3831 set_blessed(randint1(base) + base, FALSE);
\r
3837 if (name) return _("耐火炎", "Resist Fire");
\r
3838 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
\r
3839 "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");
\r
3844 if (info) return info_duration(base, base);
\r
3848 set_oppose_fire(randint1(base) + base, FALSE);
\r
3854 if (name) return _("恐慌", "Horrify");
\r
3855 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
\r
3860 if (info) return info_power(power);
\r
3864 if (!get_aim_dir(&dir)) return NULL;
\r
3866 fear_monster(dir, power);
\r
3867 stun_monster(dir, power);
\r
3873 if (name) return _("地獄の矢", "Nether Bolt");
\r
3874 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
\r
3877 int dice = 6 + (plev - 5) / 4;
\r
3880 if (info) return info_damage(dice, sides, 0);
\r
3884 if (!get_aim_dir(&dir)) return NULL;
\r
3886 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
\r
3892 if (name) return _("古代の死霊召喚", "Summon Manes");
\r
3893 if (desc) return _("古代の死霊を召喚する。", "Summons a manes.");
\r
3898 if (!summon_specific(-1, p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET)))
\r
3900 msg_print(_("古代の死霊は現れなかった。", "No Manes arrive."));
\r
3907 if (name) return _("地獄の焔", "Hellish Flame");
\r
3908 if (desc) return _("邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",
\r
3909 "Fires a ball of evil power. Hurts good monsters greatly.");
\r
3914 int rad = (plev < 30) ? 2 : 3;
\r
3917 if (p_ptr->pclass == CLASS_MAGE ||
\r
3918 p_ptr->pclass == CLASS_HIGH_MAGE ||
\r
3919 p_ptr->pclass == CLASS_SORCERER)
\r
3920 base = plev + plev / 2;
\r
3922 base = plev + plev / 4;
\r
3925 if (info) return info_damage(dice, sides, base);
\r
3929 if (!get_aim_dir(&dir)) return NULL;
\r
3931 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides) + base, rad);
\r
3937 if (name) return _("デーモン支配", "Dominate Demon");
\r
3938 if (desc) return _("悪魔1体を魅了する。抵抗されると無効", "Attempts to charm a demon.");
\r
3943 if (info) return info_power(power);
\r
3947 if (!get_aim_dir(&dir)) return NULL;
\r
3949 control_one_demon(dir, power);
\r
3955 if (name) return _("ビジョン", "Vision");
\r
3956 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
\r
3959 int rad = DETECT_RAD_MAP;
\r
3961 if (info) return info_radius(rad);
\r
3971 if (name) return _("耐地獄", "Resist Nether");
\r
3972 if (desc) return _("一定時間、地獄への耐性を得る。", "Gives resistance to nether for a while.");
\r
3977 if (info) return info_duration(base, base);
\r
3981 set_tim_res_nether(randint1(base) + base, FALSE);
\r
3987 if (name) return _("プラズマ・ボルト", "Plasma bolt");
\r
3988 if (desc) return _("プラズマのボルトもしくはビームを放つ。", "Fires a bolt or beam of plasma.");
\r
3991 int dice = 11 + (plev - 5) / 4;
\r
3994 if (info) return info_damage(dice, sides, 0);
\r
3998 if (!get_aim_dir(&dir)) return NULL;
\r
4000 fire_bolt_or_beam(beam_chance(), GF_PLASMA, dir, damroll(dice, sides));
\r
4006 if (name) return _("ファイア・ボール", "Fire Ball");
\r
4007 if (desc) return _("炎の球を放つ。", "Fires a ball of fire.");
\r
4010 HIT_POINT dam = plev + 55;
\r
4013 if (info) return info_damage(0, 0, dam);
\r
4017 if (!get_aim_dir(&dir)) return NULL;
\r
4019 fire_ball(GF_FIRE, dir, dam, rad);
\r
4025 if (name) return _("炎の刃", "Fire Branding");
\r
4026 if (desc) return _("武器に炎の属性をつける。", "Makes current weapon fire branded.");
\r
4037 if (name) return _("地獄球", "Nether Ball");
\r
4038 if (desc) return _("大きな地獄の球を放つ。", "Fires a huge ball of nether.");
\r
4041 HIT_POINT dam = plev * 3 / 2 + 100;
\r
4042 int rad = plev / 20 + 2;
\r
4044 if (info) return info_damage(0, 0, dam);
\r
4048 if (!get_aim_dir(&dir)) return NULL;
\r
4050 fire_ball(GF_NETHER, dir, dam, rad);
\r
4056 if (name) return _("デーモン召喚", "Summon Demon");
\r
4057 if (desc) return _("悪魔1体を召喚する。", "Summons a demon.");
\r
4062 bool pet = !one_in_(3);
\r
4065 if (pet) flg |= PM_FORCE_PET;
\r
4066 else flg |= PM_NO_PET;
\r
4067 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
\r
4069 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, plev*2/3+randint1(plev/2), SUMMON_DEMON, flg))
\r
4071 msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));
\r
4075 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
\r
4079 msg_print(_("「卑しき者よ、我は汝の下僕にあらず! お前の魂を頂くぞ!」",
\r
4080 "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));
\r
4085 msg_print(_("悪魔は現れなかった。", "No demons arrive."));
\r
4093 if (name) return _("悪魔の目", "Devilish Eye");
\r
4094 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
\r
4100 if (info) return info_duration(base, sides);
\r
4104 set_tim_esp(randint1(sides) + base, FALSE);
\r
4110 if (name) return _("悪魔のクローク", "Devil Cloak");
\r
4111 if (desc) return _("恐怖を取り除き、一定時間、炎と冷気の耐性、炎のオーラを得る。耐性は装備による耐性に累積する。",
\r
4112 "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
4115 TIME_EFFECT base = 20;
\r
4117 if (info) return info_duration(base, base);
\r
4121 TIME_EFFECT dur = randint1(base) + base;
\r
4123 set_oppose_fire(dur, FALSE);
\r
4124 set_oppose_cold(dur, FALSE);
\r
4125 set_tim_sh_fire(dur, FALSE);
\r
4133 if (name) return _("溶岩流", "The Flow of Lava");
\r
4134 if (desc) return _("自分を中心とした炎の球を作り出し、床を溶岩に変える。",
\r
4135 "Generates a ball of fire centered on you which transforms floors to magma.");
\r
4138 HIT_POINT dam = (55 + plev) * 2;
\r
4141 if (info) return info_damage(0, 0, dam/2);
\r
4145 fire_ball(GF_FIRE, 0, dam, rad);
\r
4146 fire_ball_hide(GF_LAVA_FLOW, 0, 2 + randint1(2), rad);
\r
4152 if (name) return _("プラズマ球", "Plasma Ball");
\r
4153 if (desc) return _("プラズマの球を放つ。", "Fires a ball of plasma.");
\r
4156 HIT_POINT dam = plev * 3 / 2 + 80;
\r
4157 int rad = 2 + plev / 40;
\r
4159 if (info) return info_damage(0, 0, dam);
\r
4163 if (!get_aim_dir(&dir)) return NULL;
\r
4165 fire_ball(GF_PLASMA, dir, dam, rad);
\r
4171 if (name) return _("悪魔変化", "Polymorph Demon");
\r
4172 if (desc) return _("一定時間、悪魔に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔としての能力を得る。",
\r
4173 "Mimic a demon for a while. Loses abilities of original race and gets abilities as a demon.");
\r
4176 int base = 10 + plev / 2;
\r
4178 if (info) return info_duration(base, base);
\r
4182 set_mimic(base + randint1(base), MIMIC_DEMON, FALSE);
\r
4188 if (name) return _("地獄の波動", "Nather Wave");
\r
4189 if (desc) return _("視界内の全てのモンスターにダメージを与える。善良なモンスターに特に大きなダメージを与える。",
\r
4190 "Damages all monsters in sight. Hurts good monsters greatly.");
\r
4193 int sides1 = plev * 2;
\r
4194 int sides2 = plev * 2;
\r
4196 if (info) return format("%sd%d+d%d", s_dam, sides1, sides2);
\r
4200 dispel_monsters(randint1(sides1));
\r
4201 dispel_good(randint1(sides2));
\r
4207 if (name) return _("サキュバスの接吻", "Kiss of Succubus");
\r
4208 if (desc) return _("因果混乱の球を放つ。", "Fires a ball of nexus.");
\r
4211 HIT_POINT dam = 100 + plev * 2;
\r
4214 if (info) return info_damage(0, 0, dam);
\r
4218 if (!get_aim_dir(&dir)) return NULL;
\r
4219 fire_ball(GF_NEXUS, dir, dam, rad);
\r
4225 if (name) return _("破滅の手", "Doom Hand");
\r
4226 if (desc) return _("破滅の手を放つ。食らったモンスターはそのときのHPの半分前後のダメージを受ける。", "Attempts to make a monster's HP almost half.");
\r
4231 if (!get_aim_dir(&dir))
\r
4234 msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));
\r
4236 fire_ball_hide(GF_HAND_DOOM, dir, plev * 2, 0);
\r
4242 if (name) return _("士気高揚", "Raise the Morale");
\r
4243 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
4248 if (info) return info_duration(base, base);
\r
4252 set_hero(randint1(base) + base, FALSE);
\r
4260 if (name) return _("不滅の肉体", "Immortal Body");
\r
4261 if (desc) return _("一定時間、時間逆転への耐性を得る。", "Gives resistance to time for a while.");
\r
4266 if (info) return info_duration(base, base);
\r
4270 set_tim_res_time(randint1(base)+base, FALSE);
\r
4276 if (name) return _("狂気の円環", "Insanity Circle");
\r
4277 if (desc) return _("自分を中心としたカオスの球、混乱の球を発生させ、近くのモンスターを魅了する。",
\r
4278 "Generate balls of chaos, confusion and charm centered on you.");
\r
4281 HIT_POINT dam = 50 + plev;
\r
4282 int power = 20 + plev;
\r
4283 int rad = 3 + plev / 20;
\r
4285 if (info) return format("%s%d+%d", s_dam, dam/2, dam/2);
\r
4289 fire_ball(GF_CHAOS, 0, dam, rad);
\r
4290 fire_ball(GF_CONFUSION, 0, dam, rad);
\r
4291 fire_ball(GF_CHARM, 0, power, rad);
\r
4297 if (name) return _("ペット爆破", "Explode Pets");
\r
4298 if (desc) return _("全てのペットを強制的に爆破させる。", "Makes all pets explode.");
\r
4303 discharge_minion();
\r
4309 if (name) return _("グレーターデーモン召喚", "Summon Greater Demon");
\r
4310 if (desc) return _("上級デーモンを召喚する。召喚するには人間('p','h','t'で表されるモンスター)の死体を捧げなければならない。",
\r
4311 "Summons greater demon. It need to sacrifice a corpse of human ('p','h' or 't').");
\r
4316 if (!cast_summon_greater_demon()) return NULL;
\r
4322 if (name) return _("地獄嵐", "Nether Storm");
\r
4323 if (desc) return _("超巨大な地獄の球を放つ。", "Generate a huge ball of nether.");
\r
4326 HIT_POINT dam = plev * 15;
\r
4327 int rad = plev / 5;
\r
4329 if (info) return info_damage(0, 0, dam);
\r
4333 if (!get_aim_dir(&dir)) return NULL;
\r
4335 fire_ball(GF_NETHER, dir, dam, rad);
\r
4341 if (name) return _("血の呪い", "Bloody Curse");
\r
4342 if (desc) return _("自分がダメージを受けることによって対象に呪いをかけ、ダメージを与え様々な効果を引き起こす。",
\r
4343 "Puts blood curse which damages and causes various effects on a monster. You also take damage.");
\r
4346 HIT_POINT dam = 600;
\r
4349 if (info) return info_damage(0, 0, dam);
\r
4353 if (!get_aim_dir(&dir)) return NULL;
\r
4355 fire_ball_hide(GF_BLOOD_CURSE, dir, dam, rad);
\r
4356 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("血の呪い", "Blood curse"), -1);
\r
4362 if (name) return _("魔王変化", "Polymorph Demonlord");
\r
4363 if (desc) return _("悪魔の王に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔の王としての能力を得、壁を破壊しながら歩く。",
\r
4364 "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
4369 if (info) return info_duration(base, base);
\r
4373 set_mimic(base + randint1(base), MIMIC_DEMON_LORD, FALSE);
\r
4383 * @brief 破邪領域魔法の各処理を行う
\r
4384 * @param spell 魔法ID
\r
4385 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
4386 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
4388 static cptr do_crusade_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
4390 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
4391 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
4392 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
4393 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
4396 int plev = p_ptr->lev;
\r
4401 if (name) return _("懲罰", "Punishment");
\r
4402 if (desc) return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");
\r
4405 int dice = 3 + (plev - 1) / 5;
\r
4408 if (info) return info_damage(dice, sides, 0);
\r
4412 if (!get_aim_dir(&dir)) return NULL;
\r
4414 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));
\r
4420 if (name) return _("邪悪存在感知", "Detect Evil");
\r
4421 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
\r
4424 int rad = DETECT_RAD_DEFAULT;
\r
4426 if (info) return info_radius(rad);
\r
4430 detect_monsters_evil(rad);
\r
4436 if (name) return _("恐怖除去", "Remove Fear");
\r
4437 if (desc) return _("恐怖を取り除く。", "Removes fear.");
\r
4448 if (name) return _("威圧", "Scare Monster");
\r
4449 if (desc) return _("モンスター1体を恐怖させる。抵抗されると無効。", "Attempts to scare a monster.");
\r
4454 if (info) return info_power(power);
\r
4458 if (!get_aim_dir(&dir)) return NULL;
\r
4460 fear_monster(dir, power);
\r
4466 if (name) return _("聖域", "Sanctuary");
\r
4467 if (desc) return _("隣接した全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep monsters in the adjacent squares.");
\r
4472 if (info) return info_power(power);
\r
4476 sleep_monsters_touch();
\r
4482 if (name) return _("入口", "Portal");
\r
4483 if (desc) return _("中距離のテレポートをする。", "Teleport medium distance.");
\r
4486 POSITION range = 25 + plev / 2;
\r
4488 if (info) return info_range(range);
\r
4492 teleport_player(range, 0L);
\r
4498 if (name) return _("スターダスト", "Star Dust");
\r
4499 if (desc) return _("ターゲット付近に閃光のボルトを連射する。", "Fires many bolts of light near the target.");
\r
4502 int dice = 3 + (plev - 1) / 9;
\r
4505 if (info) return info_multi_damage_dice(dice, sides);
\r
4509 if (!get_aim_dir(&dir)) return NULL;
\r
4510 fire_blast(GF_LITE, dir, dice, sides, 10, 3);
\r
4516 if (name) return _("身体浄化", "Purify");
\r
4517 if (desc) return _("傷、毒、朦朧から全快する。", "Heals all cut, stun and poison status.");
\r
4530 if (name) return _("邪悪飛ばし", "Scatter Evil");
\r
4531 if (desc) return _("邪悪なモンスター1体をテレポートさせる。抵抗されると無効。", "Attempts to teleport an evil monster away.");
\r
4534 int power = MAX_SIGHT * 5;
\r
4536 if (info) return info_power(power);
\r
4540 if (!get_aim_dir(&dir)) return NULL;
\r
4541 fire_ball(GF_AWAY_EVIL, dir, power, 0);
\r
4547 if (name) return _("聖なる光球", "Holy Orb");
\r
4548 if (desc) return _("聖なる力をもつ宝珠を放つ。邪悪なモンスターに対して大きなダメージを与えるが、善良なモンスターには効果がない。",
\r
4549 "Fires a ball with holy power. Hurts evil monsters greatly, but don't effect good monsters.");
\r
4554 int rad = (plev < 30) ? 2 : 3;
\r
4557 if (p_ptr->pclass == CLASS_PRIEST ||
\r
4558 p_ptr->pclass == CLASS_HIGH_MAGE ||
\r
4559 p_ptr->pclass == CLASS_SORCERER)
\r
4560 base = plev + plev / 2;
\r
4562 base = plev + plev / 4;
\r
4565 if (info) return info_damage(dice, sides, base);
\r
4569 if (!get_aim_dir(&dir)) return NULL;
\r
4571 fire_ball(GF_HOLY_FIRE, dir, damroll(dice, sides) + base, rad);
\r
4577 if (name) return _("悪魔払い", "Exorcism");
\r
4578 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与え、邪悪なモンスターを恐怖させる。",
\r
4579 "Damages all undead and demons in sight, and scares all evil monsters in sight.");
\r
4585 if (info) return info_damage(1, sides, 0);
\r
4589 dispel_undead(randint1(sides));
\r
4590 dispel_demons(randint1(sides));
\r
4597 if (name) return _("解呪", "Remove Curse");
\r
4598 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
\r
4603 if (remove_curse())
\r
4605 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
4612 if (name) return _("透明視認", "Sense Unseen");
\r
4613 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
\r
4618 if (info) return info_duration(base, base);
\r
4622 set_tim_invis(randint1(base) + base, FALSE);
\r
4628 if (name) return _("対邪悪結界", "Protection from Evil");
\r
4629 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");
\r
4633 int sides = 3 * plev;
\r
4635 if (info) return info_duration(base, sides);
\r
4639 set_protevil(randint1(sides) + base, FALSE);
\r
4645 if (name) return _("裁きの雷", "Judgment Thunder");
\r
4646 if (desc) return _("強力な電撃のボルトを放つ。", "Fires a powerful bolt of lightning.");
\r
4649 HIT_POINT dam = plev * 5;
\r
4651 if (info) return info_damage(0, 0, dam);
\r
4655 if (!get_aim_dir(&dir)) return NULL;
\r
4656 fire_bolt(GF_ELEC, dir, dam);
\r
4662 if (name) return _("聖なる御言葉", "Holy Word");
\r
4663 if (desc) return _("視界内の邪悪な存在に大きなダメージを与え、体力を回復し、毒、恐怖、朦朧状態、負傷から全快する。",
\r
4664 "Damages all evil monsters in sight, heals HP somewhat, and completely heals poison, fear, stun and cut status.");
\r
4667 int dam_sides = plev * 6;
\r
4670 if (info) return format(_("損:1d%d/回%d", "dam:d%d/h%d"), dam_sides, heal);
\r
4673 dispel_evil(randint1(dam_sides));
\r
4684 if (name) return _("開かれた道", "Unbarring Ways");
\r
4685 if (desc) return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");
\r
4690 if (!get_aim_dir(&dir)) return NULL;
\r
4692 destroy_door(dir);
\r
4698 if (name) return _("封魔", "Arrest");
\r
4699 if (desc) return _("邪悪なモンスターの動きを止める。", "Attempts to paralyze an evil monster.");
\r
4702 int power = plev * 2;
\r
4704 if (info) return info_power(power);
\r
4708 if (!get_aim_dir(&dir)) return NULL;
\r
4715 if (name) return _("聖なるオーラ", "Holy Aura");
\r
4716 if (desc) return _("一定時間、邪悪なモンスターを傷つける聖なるオーラを得る。",
\r
4717 "Gives aura of holy power which injures evil monsters which attacked you for a while.");
\r
4722 if (info) return info_duration(base, base);
\r
4726 set_tim_sh_holy(randint1(base) + base, FALSE);
\r
4732 if (name) return _("アンデッド&悪魔退散", "Dispel Undead & Demons");
\r
4733 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与える。", "Damages all undead and demons in sight.");
\r
4736 int sides = plev * 4;
\r
4738 if (info) return info_damage(1, sides, 0);
\r
4742 dispel_undead(randint1(sides));
\r
4743 dispel_demons(randint1(sides));
\r
4749 if (name) return _("邪悪退散", "Dispel Evil");
\r
4750 if (desc) return _("視界内の全ての邪悪なモンスターにダメージを与える。", "Damages all evil monsters in sight.");
\r
4753 int sides = plev * 4;
\r
4755 if (info) return info_damage(1, sides, 0);
\r
4759 dispel_evil(randint1(sides));
\r
4765 if (name) return _("聖なる刃", "Holy Blade");
\r
4766 if (desc) return _("通常の武器に滅邪の属性をつける。", "Makes current weapon especially deadly against evil monsters.");
\r
4777 if (name) return _("スターバースト", "Star Burst");
\r
4778 if (desc) return _("巨大な閃光の球を放つ。", "Fires a huge ball of powerful light.");
\r
4781 HIT_POINT dam = 100 + plev * 2;
\r
4784 if (info) return info_damage(0, 0, dam);
\r
4788 if (!get_aim_dir(&dir)) return NULL;
\r
4790 fire_ball(GF_LITE, dir, dam, rad);
\r
4796 if (name) return _("天使召喚", "Summon Angel");
\r
4797 if (desc) return _("天使を1体召喚する。", "Summons an angel.");
\r
4802 bool pet = !one_in_(3);
\r
4805 if (pet) flg |= PM_FORCE_PET;
\r
4806 else flg |= PM_NO_PET;
\r
4807 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
\r
4809 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_ANGEL, flg))
\r
4813 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
\r
4817 msg_print(_("「我は汝の下僕にあらず! 悪行者よ、悔い改めよ!」", "Mortal! Repent of thy impiousness."));
\r
4825 if (name) return _("士気高揚", "Heroism");
\r
4826 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
4831 if (info) return info_duration(base, base);
\r
4835 set_hero(randint1(base) + base, FALSE);
\r
4843 if (name) return _("呪い退散", "Dispel Curse");
\r
4844 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
\r
4849 if (remove_all_curse())
\r
4851 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
4858 if (name) return _("邪悪追放", "Banish Evil");
\r
4859 if (desc) return _("視界内の全ての邪悪なモンスターをテレポートさせる。抵抗されると無効。",
\r
4860 "Teleports all evil monsters in sight away unless resisted.");
\r
4865 if (info) return info_power(power);
\r
4869 if (banish_evil(power))
\r
4871 msg_print(_("神聖な力が邪悪を打ち払った!", "The holy power banishes evil!"));
\r
4878 if (name) return _("ハルマゲドン", "Armageddon");
\r
4879 if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroy everything in nearby area.");
\r
4887 destroy_area(p_ptr->y, p_ptr->x, base + randint1(sides), FALSE);
\r
4893 if (name) return _("目には目を", "An Eye for an Eye");
\r
4894 if (desc) return _("一定時間、自分がダメージを受けたときに攻撃を行ったモンスターに対して同等のダメージを与える。",
\r
4895 "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
4900 if (info) return info_duration(base, base);
\r
4904 set_tim_eyeeye(randint1(base) + base, FALSE);
\r
4910 if (name) return _("神の怒り", "Wrath of the God");
\r
4911 if (desc) return _("ターゲットの周囲に分解の球を多数落とす。", "Drops many balls of disintegration near the target.");
\r
4914 HIT_POINT dam = plev * 3 + 25;
\r
4917 if (info) return info_multi_damage(dam);
\r
4921 if (!cast_wrath_of_the_god(dam, rad)) return NULL;
\r
4927 if (name) return _("神威", "Divine Intervention");
\r
4928 if (desc) return _("隣接するモンスターに聖なるダメージを与え、視界内のモンスターにダメージ、減速、朦朧、混乱、恐怖、眠りを与える。さらに体力を回復する。",
\r
4929 "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
4932 int b_dam = plev * 11;
\r
4933 int d_dam = plev * 4;
\r
4935 int power = plev * 4;
\r
4937 if (info) return format(_("回%d/損%d+%d", "h%d/dm%d+%d"), heal, d_dam, b_dam/2);
\r
4940 project(0, 1, p_ptr->y, p_ptr->x, b_dam, GF_HOLY_FIRE, PROJECT_KILL, -1);
\r
4941 dispel_monsters(d_dam);
\r
4942 slow_monsters(plev);
\r
4943 stun_monsters(power);
\r
4944 confuse_monsters(power);
\r
4945 turn_monsters(power);
\r
4946 stasis_monsters(power);
\r
4953 if (name) return _("聖戦", "Crusade");
\r
4954 if (desc) return _("視界内の善良なモンスターをペットにしようとし、ならなかった場合及び善良でないモンスターを恐怖させる。さらに多数の加速された騎士を召喚し、ヒーロー、祝福、加速、対邪悪結界を得る。",
\r
4955 "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
4961 int sp_sides = 20 + plev;
\r
4962 int sp_base = plev;
\r
4966 for (i = 0; i < 12; i++)
\r
4969 POSITION my = 0, mx = 0;
\r
4973 scatter(&my, &mx, p_ptr->y, p_ptr->x, 4, 0);
\r
4975 /* Require empty grids */
\r
4976 if (cave_empty_bold2(my, mx)) break;
\r
4978 if (attempt < 0) continue;
\r
4979 summon_specific(-1, my, mx, plev, SUMMON_KNIGHTS, (PM_ALLOW_GROUP | PM_FORCE_PET | PM_HASTE));
\r
4981 set_hero(randint1(base) + base, FALSE);
\r
4982 set_blessed(randint1(base) + base, FALSE);
\r
4983 set_fast(randint1(sp_sides) + sp_base, FALSE);
\r
4984 set_protevil(randint1(base) + base, FALSE);
\r
4997 * @param spell 歌ID
\r
4998 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP)
\r
4999 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
\r
5001 static cptr do_music_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
5003 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
5004 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
5005 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
5006 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
5007 bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
\r
5008 bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
\r
5009 bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
\r
5010 static const char s_dam[] = _("損傷:", "dam ");
\r
5013 int plev = p_ptr->lev;
\r
5018 if (name) return _("遅鈍の歌", "Song of Holding");
\r
5019 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
\r
5021 /* Stop singing before start another */
\r
5022 if (cast || fail) stop_singing();
\r
5026 msg_print(_("ゆっくりとしたメロディを口ずさみ始めた...", "You start humming a slow, steady melody..."));
\r
5027 start_singing(spell, MUSIC_SLOW);
\r
5033 if (info) return info_power(power);
\r
5037 slow_monsters(plev);
\r
5043 if (name) return _("祝福の歌", "Song of Blessing");
\r
5044 if (desc) return _("命中率とACのボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
\r
5046 /* Stop singing before start another */
\r
5047 if (cast || fail) stop_singing();
\r
5051 msg_print(_("厳かなメロディを奏で始めた...", "The holy power of the Music of the Ainur enters you..."));
\r
5052 start_singing(spell, MUSIC_BLESS);
\r
5057 if (!p_ptr->blessed)
\r
5059 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
\r
5066 if (name) return _("崩壊の音色", "Wrecking Note");
\r
5067 if (desc) return _("轟音のボルトを放つ。", "Fires a bolt of sound.");
\r
5069 /* Stop singing before start another */
\r
5070 if (cast || fail) stop_singing();
\r
5073 int dice = 4 + (plev - 1) / 5;
\r
5076 if (info) return info_damage(dice, sides, 0);
\r
5080 if (!get_aim_dir(&dir)) return NULL;
\r
5082 fire_bolt(GF_SOUND, dir, damroll(dice, sides));
\r
5088 if (name) return _("朦朧の旋律", "Stun Pattern");
\r
5089 if (desc) return _("視界内の全てのモンスターを朦朧させる。抵抗されると無効。", "Attempts to stun all monsters in sight.");
\r
5091 /* Stop singing before start another */
\r
5092 if (cast || fail) stop_singing();
\r
5096 msg_print(_("眩惑させるメロディを奏で始めた...", "You weave a pattern of sounds to bewilder and daze..."));
\r
5097 start_singing(spell, MUSIC_STUN);
\r
5101 int dice = plev / 10;
\r
5104 if (info) return info_power_dice(dice, sides);
\r
5108 stun_monsters(damroll(dice, sides));
\r
5115 if (name) return _("生命の流れ", "Flow of Life");
\r
5116 if (desc) return _("体力を少し回復させる。", "Heals HP a little.");
\r
5118 /* Stop singing before start another */
\r
5119 if (cast || fail) stop_singing();
\r
5123 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing a song of healing..."));
\r
5124 start_singing(spell, MUSIC_L_LIFE);
\r
5131 if (info) return info_heal(dice, sides, 0);
\r
5135 hp_player(damroll(dice, sides));
\r
5142 if (name) return _("太陽の歌", "Song of the Sun");
\r
5143 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
\r
5145 /* Stop singing before start another */
\r
5146 if (cast || fail) stop_singing();
\r
5150 int sides = plev / 2;
\r
5151 int rad = plev / 10 + 1;
\r
5153 if (info) return info_damage(dice, sides, 0);
\r
5157 msg_print(_("光り輝く歌が辺りを照らした。", "Your uplifting song brings brightness to dark places..."));
\r
5158 lite_area(damroll(dice, sides), rad);
\r
5164 if (name) return _("恐怖の歌", "Song of Fear");
\r
5165 if (desc) return _("視界内の全てのモンスターを恐怖させる。抵抗されると無効。", "Attempts to scare all monsters in sight.");
\r
5167 /* Stop singing before start another */
\r
5168 if (cast || fail) stop_singing();
\r
5172 msg_print(_("おどろおどろしいメロディを奏で始めた...", "You start weaving a fearful pattern..."));
\r
5173 start_singing(spell, MUSIC_FEAR);
\r
5179 if (info) return info_power(power);
\r
5183 project_hack(GF_TURN_ALL, power);
\r
5190 if (name) return _("戦いの歌", "Heroic Ballad");
\r
5191 if (desc) return _("ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
5193 /* Stop singing before start another */
\r
5194 if (cast || fail) stop_singing();
\r
5198 msg_print(_("激しい戦いの歌を歌った...", "You start singing a song of intense fighting..."));
\r
5200 (void)hp_player(10);
\r
5201 (void)set_afraid(0);
\r
5203 /* Recalculate hitpoints */
\r
5204 p_ptr->update |= (PU_HP);
\r
5206 start_singing(spell, MUSIC_HERO);
\r
5213 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
\r
5214 /* Recalculate hitpoints */
\r
5215 p_ptr->update |= (PU_HP);
\r
5222 if (name) return _("霊的知覚", "Clairaudience");
\r
5223 if (desc) return _("近くの罠/扉/階段を感知する。レベル15で全てのモンスター、20で財宝とアイテムを感知できるようになる。レベル25で周辺の地形を感知し、40でその階全体を永久に照らし、ダンジョン内のすべてのアイテムを感知する。この効果は歌い続けることで順に起こる。",
\r
5224 "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
5226 /* Stop singing before start another */
\r
5227 if (cast || fail) stop_singing();
\r
5231 msg_print(_("静かな音楽が感覚を研ぎ澄まさせた...", "Your quiet music sharpens your sense of hearing..."));
\r
5232 /* Hack -- Initialize the turn count */
\r
5233 SINGING_COUNT(p_ptr) = 0;
\r
5234 start_singing(spell, MUSIC_DETECT);
\r
5238 int rad = DETECT_RAD_DEFAULT;
\r
5240 if (info) return info_radius(rad);
\r
5244 int count = SINGING_COUNT(p_ptr);
\r
5246 if (count >= 19) wiz_lite(FALSE);
\r
5250 if (plev > 39 && count < 19)
\r
5251 SINGING_COUNT(p_ptr) = count + 1;
\r
5255 /* There are too many hidden treasure. So... */
\r
5256 /* detect_treasure(rad); */
\r
5257 detect_objects_gold(rad);
\r
5258 detect_objects_normal(rad);
\r
5260 if (plev > 24 && count < 11)
\r
5261 SINGING_COUNT(p_ptr) = count + 1;
\r
5265 detect_monsters_invis(rad);
\r
5266 detect_monsters_normal(rad);
\r
5268 if (plev > 19 && count < 6)
\r
5269 SINGING_COUNT(p_ptr) = count + 1;
\r
5271 detect_traps(rad, TRUE);
\r
5272 detect_doors(rad);
\r
5273 detect_stairs(rad);
\r
5275 if (plev > 14 && count < 3)
\r
5276 SINGING_COUNT(p_ptr) = count + 1;
\r
5283 if (name) return _("魂の歌", "Soul Shriek");
\r
5284 if (desc) return _("視界内の全てのモンスターに対して精神攻撃を行う。", "Damages all monsters in sight with PSI damages.");
\r
5286 /* Stop singing before start another */
\r
5287 if (cast || fail) stop_singing();
\r
5291 msg_print(_("精神を捻じ曲げる歌を歌った...", "You start singing a song of soul in pain..."));
\r
5292 start_singing(spell, MUSIC_PSI);
\r
5297 int sides = plev * 3 / 2;
\r
5299 if (info) return info_damage(dice, sides, 0);
\r
5303 project_hack(GF_PSI, damroll(dice, sides));
\r
5310 if (name) return _("知識の歌", "Song of Lore");
\r
5311 if (desc) return _("自分のいるマスと隣りのマスに落ちているアイテムを鑑定する。", "Identifies all items which are in the adjacent squares.");
\r
5313 /* Stop singing before start another */
\r
5314 if (cast || fail) stop_singing();
\r
5318 msg_print(_("この世界の知識が流れ込んできた...", "You recall the rich lore of the world..."));
\r
5319 start_singing(spell, MUSIC_ID);
\r
5325 if (info) return info_radius(rad);
\r
5329 * MP不足で鑑定が発動される前に歌が中断してしまうのを防止。
\r
5333 project(0, rad, p_ptr->y, p_ptr->x, 0, GF_IDENTIFY, PROJECT_ITEM, -1);
\r
5340 if (name) return _("隠遁の歌", "Hiding Tune");
\r
5341 if (desc) return _("隠密行動能力を上昇させる。", "Gives improved stealth.");
\r
5343 /* Stop singing before start another */
\r
5344 if (cast || fail) stop_singing();
\r
5348 msg_print(_("あなたの姿が景色にとけこんでいった...", "Your song carries you beyond the sight of mortal eyes..."));
\r
5349 start_singing(spell, MUSIC_STEALTH);
\r
5354 if (!p_ptr->tim_stealth)
\r
5356 msg_print(_("姿がはっきりと見えるようになった。", "You are no longer hided."));
\r
5363 if (name) return _("幻影の旋律", "Illusion Pattern");
\r
5364 if (desc) return _("視界内の全てのモンスターを混乱させる。抵抗されると無効。", "Attempts to confuse all monsters in sight.");
\r
5366 /* Stop singing before start another */
\r
5367 if (cast || fail) stop_singing();
\r
5371 msg_print(_("辺り一面に幻影が現れた...", "You weave a pattern of sounds to beguile and confuse..."));
\r
5372 start_singing(spell, MUSIC_CONF);
\r
5376 int power = plev * 2;
\r
5378 if (info) return info_power(power);
\r
5382 confuse_monsters(power);
\r
5389 if (name) return _("破滅の叫び", "Doomcall");
\r
5390 if (desc) return _("視界内の全てのモンスターに対して轟音攻撃を行う。", "Damages all monsters in sight with booming sound.");
\r
5392 /* Stop singing before start another */
\r
5393 if (cast || fail) stop_singing();
\r
5397 msg_print(_("轟音が響いた...", "The fury of the Downfall of Numenor lashes out..."));
\r
5398 start_singing(spell, MUSIC_SOUND);
\r
5402 int dice = 10 + plev / 5;
\r
5405 if (info) return info_damage(dice, sides, 0);
\r
5409 project_hack(GF_SOUND, damroll(dice, sides));
\r
5416 if (name) return _("フィリエルの歌", "Firiel's Song");
\r
5417 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
\r
5420 /* Stop singing before start another */
\r
5421 if (cast || fail) stop_singing();
\r
5425 msg_print(_("生命と復活のテーマを奏で始めた...", "The themes of life and revival are woven into your song..."));
\r
5426 animate_dead(0, p_ptr->y, p_ptr->x);
\r
5432 if (name) return _("旅の仲間", "Fellowship Chant");
\r
5433 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
\r
5435 /* Stop singing before start another */
\r
5436 if (cast || fail) stop_singing();
\r
5440 msg_print(_("安らかなメロディを奏で始めた...", "You weave a slow, soothing melody of imploration..."));
\r
5441 start_singing(spell, MUSIC_CHARM);
\r
5445 int dice = 10 + plev / 15;
\r
5448 if (info) return info_power_dice(dice, sides);
\r
5452 charm_monsters(damroll(dice, sides));
\r
5459 if (name) return _("分解音波", "Sound of disintegration");
\r
5460 if (desc) return _("壁を掘り進む。自分の足元のアイテムは蒸発する。", "Makes you be able to burrow into walls. Objects under your feet evaporate.");
\r
5462 /* Stop singing before start another */
\r
5463 if (cast || fail) stop_singing();
\r
5467 msg_print(_("粉砕するメロディを奏で始めた...", "You weave a violent pattern of sounds to break wall."));
\r
5468 start_singing(spell, MUSIC_WALL);
\r
5474 * MP不足で効果が発動される前に歌が中断してしまうのを防止。
\r
5478 project(0, 0, p_ptr->y, p_ptr->x,
\r
5479 0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1);
\r
5485 if (name) return _("元素耐性", "Finrod's Resistance");
\r
5486 if (desc) return _("酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
\r
5487 "Gives resistance to fire, cold, electricity, acid and poison. These resistances can be added to which from equipment for more powerful resistances.");
\r
5489 /* Stop singing before start another */
\r
5490 if (cast || fail) stop_singing();
\r
5494 msg_print(_("元素の力に対する忍耐の歌を歌った。", "You sing a song of perseverance against powers..."));
\r
5495 start_singing(spell, MUSIC_RESIST);
\r
5500 if (!p_ptr->oppose_acid)
\r
5502 msg_print(_("酸への耐性が薄れた気がする。", "You feel less resistant to acid."));
\r
5505 if (!p_ptr->oppose_elec)
\r
5507 msg_print(_("電撃への耐性が薄れた気がする。", "You feel less resistant to elec."));
\r
5510 if (!p_ptr->oppose_fire)
\r
5512 msg_print(_("火への耐性が薄れた気がする。", "You feel less resistant to fire."));
\r
5515 if (!p_ptr->oppose_cold)
\r
5517 msg_print(_("冷気への耐性が薄れた気がする。", "You feel less resistant to cold."));
\r
5520 if (!p_ptr->oppose_pois)
\r
5522 msg_print(_("毒への耐性が薄れた気がする。", "You feel less resistant to pois."));
\r
5529 if (name) return _("ホビットのメロディ", "Hobbit Melodies");
\r
5530 if (desc) return _("加速する。", "Hastes you.");
\r
5532 /* Stop singing before start another */
\r
5533 if (cast || fail) stop_singing();
\r
5537 msg_print(_("軽快な歌を口ずさみ始めた...", "You start singing joyful pop song..."));
\r
5538 start_singing(spell, MUSIC_SPEED);
\r
5545 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
\r
5552 if (name) return _("歪んだ世界", "World Contortion");
\r
5553 if (desc) return _("近くのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all nearby monsters away unless resisted.");
\r
5556 int rad = plev / 15 + 1;
\r
5557 int power = plev * 3 + 1;
\r
5559 if (info) return info_radius(rad);
\r
5561 /* Stop singing before start another */
\r
5562 if (cast || fail) stop_singing();
\r
5566 msg_print(_("歌が空間を歪めた...", "Reality whirls wildly as you sing a dizzying melody..."));
\r
5567 project(0, rad, p_ptr->y, p_ptr->x, power, GF_AWAY_ALL, PROJECT_KILL, -1);
\r
5573 if (name) return _("退散の歌", "Dispelling chant");
\r
5574 if (desc) return _("視界内の全てのモンスターにダメージを与える。邪悪なモンスターに特に大きなダメージを与える。",
\r
5575 "Damages all monsters in sight. Hurts evil monsters greatly.");
\r
5577 /* Stop singing before start another */
\r
5578 if (cast || fail) stop_singing();
\r
5582 msg_print(_("耐えられない不協和音が敵を責め立てた...", "You cry out in an ear-wracking voice..."));
\r
5583 start_singing(spell, MUSIC_DISPEL);
\r
5587 int m_sides = plev * 3;
\r
5588 int e_sides = plev * 3;
\r
5590 if (info) return format("%s1d%d+1d%d", s_dam, m_sides, e_sides);
\r
5594 dispel_monsters(randint1(m_sides));
\r
5595 dispel_evil(randint1(e_sides));
\r
5601 if (name) return _("サルマンの甘言", "The Voice of Saruman");
\r
5602 if (desc) return _("視界内の全てのモンスターを減速させ、眠らせようとする。抵抗されると無効。", "Attempts to slow and sleep all monsters in sight.");
\r
5604 /* Stop singing before start another */
\r
5605 if (cast || fail) stop_singing();
\r
5609 msg_print(_("優しく、魅力的な歌を口ずさみ始めた...", "You start humming a gentle and attractive song..."));
\r
5610 start_singing(spell, MUSIC_SARUMAN);
\r
5616 if (info) return info_power(power);
\r
5620 slow_monsters(plev);
\r
5621 sleep_monsters(plev);
\r
5628 if (name) return _("嵐の音色", "Song of the Tempest");
\r
5629 if (desc) return _("轟音のビームを放つ。", "Fires a beam of sound.");
\r
5632 int dice = 15 + (plev - 1) / 2;
\r
5635 if (info) return info_damage(dice, sides, 0);
\r
5637 /* Stop singing before start another */
\r
5638 if (cast || fail) stop_singing();
\r
5642 if (!get_aim_dir(&dir)) return NULL;
\r
5644 fire_beam(GF_SOUND, dir, damroll(dice, sides));
\r
5650 if (name) return _("もう一つの世界", "Ambarkanta");
\r
5651 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
\r
5657 if (info) return info_delay(base, sides);
\r
5659 /* Stop singing before start another */
\r
5660 if (cast || fail) stop_singing();
\r
5664 msg_print(_("周囲が変化し始めた...", "You sing of the primeval shaping of Middle-earth..."));
\r
5671 if (name) return _("破壊の旋律", "Wrecking Pattern");
\r
5672 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
\r
5673 "Shakes dungeon structure, and results in random swapping of floors and walls.");
\r
5675 /* Stop singing before start another */
\r
5676 if (cast || fail) stop_singing();
\r
5680 msg_print(_("破壊的な歌が響きわたった...", "You weave a pattern of sounds to contort and shatter..."));
\r
5681 start_singing(spell, MUSIC_QUAKE);
\r
5687 if (info) return info_radius(rad);
\r
5691 earthquake(p_ptr->y, p_ptr->x, 10);
\r
5699 if (name) return _("停滞の歌", "Stationary Shriek");
\r
5700 if (desc) return _("視界内の全てのモンスターを麻痺させようとする。抵抗されると無効。", "Attempts to freeze all monsters in sight.");
\r
5702 /* Stop singing before start another */
\r
5703 if (cast || fail) stop_singing();
\r
5707 msg_print(_("ゆっくりとしたメロディを奏で始めた...", "You weave a very slow pattern which is almost likely to stop..."));
\r
5708 start_singing(spell, MUSIC_STASIS);
\r
5712 int power = plev * 4;
\r
5714 if (info) return info_power(power);
\r
5718 stasis_monsters(power);
\r
5725 if (name) return _("守りの歌", "Endurance");
\r
5726 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。",
\r
5727 "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
5730 /* Stop singing before start another */
\r
5731 if (cast || fail) stop_singing();
\r
5735 msg_print(_("歌が神聖な場を作り出した...", "The holy power of the Music is creating sacred field..."));
\r
5742 if (name) return _("英雄の詩", "The Hero's Poem");
\r
5743 if (desc) return _("加速し、ヒーロー気分になり、視界内の全てのモンスターにダメージを与える。",
\r
5744 "Hastes you. Gives heroism. Damages all monsters in sight.");
\r
5746 /* Stop singing before start another */
\r
5747 if (cast || fail) stop_singing();
\r
5751 msg_print(_("英雄の歌を口ずさんだ...", "You chant a powerful, heroic call to arms..."));
\r
5752 (void)hp_player(10);
\r
5753 (void)set_afraid(0);
\r
5755 /* Recalculate hitpoints */
\r
5756 p_ptr->update |= (PU_HP);
\r
5758 start_singing(spell, MUSIC_SHERO);
\r
5765 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
\r
5766 /* Recalculate hitpoints */
\r
5767 p_ptr->update |= (PU_HP);
\r
5772 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
\r
5778 int sides = plev * 3;
\r
5780 if (info) return info_damage(dice, sides, 0);
\r
5784 dispel_monsters(damroll(dice, sides));
\r
5790 if (name) return _("ヤヴァンナの助け", "Relief of Yavanna");
\r
5791 if (desc) return _("強力な回復の歌で、負傷と朦朧状態も全快する。", "Powerful healing song. Also heals cut and stun completely.");
\r
5793 /* Stop singing before start another */
\r
5794 if (cast || fail) stop_singing();
\r
5798 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing the song..."));
\r
5799 start_singing(spell, MUSIC_H_LIFE);
\r
5806 if (info) return info_heal(dice, sides, 0);
\r
5810 hp_player(damroll(dice, sides));
\r
5819 if (name) return _("再生の歌", "Goddess' rebirth");
\r
5820 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
\r
5823 /* Stop singing before start another */
\r
5824 if (cast || fail) stop_singing();
\r
5828 msg_print(_("暗黒の中に光と美をふりまいた。体が元の活力を取り戻した。",
\r
5829 "You strewed light and beauty in the dark as you sing. You feel refreshed."));
\r
5830 (void)do_res_stat(A_STR);
\r
5831 (void)do_res_stat(A_INT);
\r
5832 (void)do_res_stat(A_WIS);
\r
5833 (void)do_res_stat(A_DEX);
\r
5834 (void)do_res_stat(A_CON);
\r
5835 (void)do_res_stat(A_CHR);
\r
5836 (void)restore_level();
\r
5842 if (name) return _("サウロンの魔術", "Wizardry of Sauron");
\r
5843 if (desc) return _("非常に強力でごく小さい轟音の球を放つ。", "Fires an extremely powerful tiny ball of sound.");
\r
5846 int dice = 50 + plev;
\r
5850 if (info) return info_damage(dice, sides, 0);
\r
5852 /* Stop singing before start another */
\r
5853 if (cast || fail) stop_singing();
\r
5857 if (!get_aim_dir(&dir)) return NULL;
\r
5859 fire_ball(GF_SOUND, dir, damroll(dice, sides), rad);
\r
5865 if (name) return _("フィンゴルフィンの挑戦", "Fingolfin's Challenge");
\r
5866 if (desc) return _("ダメージを受けなくなるバリアを張る。",
\r
5867 "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks.");
\r
5869 /* Stop singing before start another */
\r
5870 if (cast || fail) stop_singing();
\r
5874 msg_print(_("フィンゴルフィンの冥王への挑戦を歌った...",
\r
5875 "You recall the valor of Fingolfin's challenge to the Dark Lord..."));
\r
5878 p_ptr->redraw |= (PR_MAP);
\r
5880 /* Update monsters */
\r
5881 p_ptr->update |= (PU_MONSTERS);
\r
5883 /* Window stuff */
\r
5884 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
\r
5886 start_singing(spell, MUSIC_INVULN);
\r
5891 if (!p_ptr->invuln)
\r
5893 msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));
\r
5895 p_ptr->redraw |= (PR_MAP);
\r
5897 /* Update monsters */
\r
5898 p_ptr->update |= (PU_MONSTERS);
\r
5900 /* Window stuff */
\r
5901 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
\r
5912 * @brief 剣術の各処理を行う
\r
5913 * @param spell 剣術ID
\r
5914 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_CAST)
\r
5915 * @return SPELL_NAME / SPELL_DESC 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
5917 static cptr do_hissatsu_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
5919 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
5920 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
5921 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
5924 int plev = p_ptr->lev;
\r
5929 if (name) return _("飛飯綱", "Tobi-Izuna");
\r
5930 if (desc) return _("2マス離れたところにいるモンスターを攻撃する。", "Attacks a two squares distant monster.");
\r
5934 project_length = 2;
\r
5935 if (!get_aim_dir(&dir)) return NULL;
\r
5937 project_hook(GF_ATTACK, dir, HISSATSU_2, PROJECT_STOP | PROJECT_KILL);
\r
5942 if (name) return _("五月雨斬り", "3-Way Attack");
\r
5943 if (desc) return _("3方向に対して攻撃する。", "Attacks in 3 directions in one time.");
\r
5950 if (!get_rep_dir2(&dir)) return NULL;
\r
5951 if (dir == 5) return NULL;
\r
5953 for (cdir = 0;cdir < 8; cdir++)
\r
5955 if (cdd[cdir] == dir) break;
\r
5958 if (cdir == 8) return NULL;
\r
5960 y = p_ptr->y + ddy_cdd[cdir];
\r
5961 x = p_ptr->x + ddx_cdd[cdir];
\r
5962 if (cave[y][x].m_idx)
\r
5963 py_attack(y, x, 0);
\r
5965 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
\r
5967 y = p_ptr->y + ddy_cdd[(cdir + 7) % 8];
\r
5968 x = p_ptr->x + ddx_cdd[(cdir + 7) % 8];
\r
5969 if (cave[y][x].m_idx)
\r
5970 py_attack(y, x, 0);
\r
5972 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
\r
5974 y = p_ptr->y + ddy_cdd[(cdir + 1) % 8];
\r
5975 x = p_ptr->x + ddx_cdd[(cdir + 1) % 8];
\r
5976 if (cave[y][x].m_idx)
\r
5977 py_attack(y, x, 0);
\r
5979 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
\r
5984 if (name) return _("ブーメラン", "Boomerang");
\r
5985 if (desc) return _("武器を手元に戻ってくるように投げる。戻ってこないこともある。",
\r
5986 "Throws current weapon. And it'll return to your hand unless failed.");
\r
5990 if (!do_cmd_throw(1, TRUE, -1)) return NULL;
\r
5995 if (name) return _("焔霊", "Burning Strike");
\r
5996 if (desc) return _("火炎耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to fire.");
\r
6002 if (!get_rep_dir2(&dir)) return NULL;
\r
6003 if (dir == 5) return NULL;
\r
6005 y = p_ptr->y + ddy[dir];
\r
6006 x = p_ptr->x + ddx[dir];
\r
6008 if (cave[y][x].m_idx)
\r
6009 py_attack(y, x, HISSATSU_FIRE);
\r
6012 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
6019 if (name) return _("殺気感知", "Detect Ferocity");
\r
6020 if (desc) return _("近くの思考することができるモンスターを感知する。", "Detects all monsters except mindless in your vicinity.");
\r
6024 detect_monsters_mind(DETECT_RAD_DEFAULT);
\r
6029 if (name) return _("みね打ち", "Strike to Stun");
\r
6030 if (desc) return _("相手にダメージを与えないが、朦朧とさせる。", "Attempts to stun a monster in the adjacent.");
\r
6036 if (!get_rep_dir2(&dir)) return NULL;
\r
6037 if (dir == 5) return NULL;
\r
6039 y = p_ptr->y + ddy[dir];
\r
6040 x = p_ptr->x + ddx[dir];
\r
6042 if (cave[y][x].m_idx)
\r
6043 py_attack(y, x, HISSATSU_MINEUCHI);
\r
6046 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
6053 if (name) return _("カウンター", "Counter");
\r
6054 if (desc) return _("相手に攻撃されたときに反撃する。反撃するたびにMPを消費。",
\r
6055 "Prepares to counterattack. When attack by a monster, strikes back using SP each time.");
\r
6059 if (p_ptr->riding)
\r
6061 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
\r
6064 msg_print(_("相手の攻撃に対して身構えた。", "You prepare to counter blow."));
\r
6065 p_ptr->counter = TRUE;
\r
6070 if (name) return _("払い抜け", "Harainuke");
\r
6071 if (desc) return _("攻撃した後、反対側に抜ける。",
\r
6072 "Attacks monster with your weapons normally, then move through counter side of the monster.");
\r
6078 if (p_ptr->riding)
\r
6080 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
\r
6084 if (!get_rep_dir2(&dir)) return NULL;
\r
6086 if (dir == 5) return NULL;
\r
6087 y = p_ptr->y + ddy[dir];
\r
6088 x = p_ptr->x + ddx[dir];
\r
6090 if (!cave[y][x].m_idx)
\r
6092 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
6096 py_attack(y, x, 0);
\r
6098 if (!player_can_enter(cave[y][x].feat, 0) || is_trap(cave[y][x].feat))
\r
6104 if (player_can_enter(cave[y][x].feat, 0) && !is_trap(cave[y][x].feat) && !cave[y][x].m_idx)
\r
6108 /* Move the player */
\r
6109 (void)move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);
\r
6115 if (name) return _("サーペンツタン", "Serpent's Tongue");
\r
6116 if (desc) return _("毒耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to poison.");
\r
6122 if (!get_rep_dir2(&dir)) return NULL;
\r
6123 if (dir == 5) return NULL;
\r
6125 y = p_ptr->y + ddy[dir];
\r
6126 x = p_ptr->x + ddx[dir];
\r
6128 if (cave[y][x].m_idx)
\r
6129 py_attack(y, x, HISSATSU_POISON);
\r
6132 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
6139 if (name) return _("斬魔剣弐の太刀", "Zammaken");
\r
6140 if (desc) return _("生命のない邪悪なモンスターに大ダメージを与えるが、他のモンスターには全く効果がない。",
\r
6141 "Attacks an evil unliving monster with great damage. No effect to other monsters.");
\r
6147 if (!get_rep_dir2(&dir)) return NULL;
\r
6148 if (dir == 5) return NULL;
\r
6150 y = p_ptr->y + ddy[dir];
\r
6151 x = p_ptr->x + ddx[dir];
\r
6153 if (cave[y][x].m_idx)
\r
6154 py_attack(y, x, HISSATSU_ZANMA);
\r
6157 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
6164 if (name) return _("裂風剣", "Wind Blast");
\r
6165 if (desc) return _("攻撃した相手を後方へ吹き飛ばす。", "Attacks an adjacent monster, and blow it away.");
\r
6171 if (!get_rep_dir2(&dir)) return NULL;
\r
6172 if (dir == 5) return NULL;
\r
6174 y = p_ptr->y + ddy[dir];
\r
6175 x = p_ptr->x + ddx[dir];
\r
6177 if (cave[y][x].m_idx)
\r
6178 py_attack(y, x, 0);
\r
6181 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
6184 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
\r
6188 if (cave[y][x].m_idx)
\r
6191 POSITION ty = y, tx = x;
\r
6192 POSITION oy = y, ox = x;
\r
6193 MONSTER_IDX m_idx = cave[y][x].m_idx;
\r
6194 monster_type *m_ptr = &m_list[m_idx];
\r
6197 monster_desc(m_name, m_ptr, 0);
\r
6199 for (i = 0; i < 5; i++)
\r
6203 if (cave_empty_bold(y, x))
\r
6210 if ((ty != oy) || (tx != ox))
\r
6212 msg_format(_("%sを吹き飛ばした!", "You blow %s away!"), m_name);
\r
6213 cave[oy][ox].m_idx = 0;
\r
6214 cave[ty][tx].m_idx = m_idx;
\r
6218 update_mon(m_idx, TRUE);
\r
6219 lite_spot(oy, ox);
\r
6220 lite_spot(ty, tx);
\r
6222 if (r_info[m_ptr->r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))
\r
6223 p_ptr->update |= (PU_MON_LITE);
\r
6230 if (name) return _("刀匠の目利き", "Judge");
\r
6231 if (desc) return _("武器・防具を1つ識別する。レベル45以上で武器・防具の能力を完全に知ることができる。",
\r
6232 "Identifies a weapon or armor. Or *identifies* these at level 45.");
\r
6238 if (!identify_fully(TRUE)) return NULL;
\r
6242 if (!ident_spell(TRUE)) return NULL;
\r
6248 if (name) return _("破岩斬", "Rock Smash");
\r
6249 if (desc) return _("岩を壊し、岩石系のモンスターに大ダメージを与える。", "Breaks rock. Or greatly damage a monster made by rocks.");
\r
6255 if (!get_rep_dir2(&dir)) return NULL;
\r
6256 if (dir == 5) return NULL;
\r
6258 y = p_ptr->y + ddy[dir];
\r
6259 x = p_ptr->x + ddx[dir];
\r
6261 if (cave[y][x].m_idx)
\r
6262 py_attack(y, x, HISSATSU_HAGAN);
\r
6264 if (!cave_have_flag_bold(y, x, FF_HURT_ROCK)) break;
\r
6266 /* Destroy the feature */
\r
6267 cave_alter_feat(y, x, FF_HURT_ROCK);
\r
6269 /* Update some things */
\r
6270 p_ptr->update |= (PU_FLOW);
\r
6275 if (name) return _("乱れ雪月花", "Midare-Setsugekka");
\r
6276 if (desc) return _("攻撃回数が増え、冷気耐性のないモンスターに大ダメージを与える。",
\r
6277 "Attacks a monster with increased number of attacks and more damage unless it has resistance to cold.");
\r
6283 if (!get_rep_dir2(&dir)) return NULL;
\r
6284 if (dir == 5) return NULL;
\r
6286 y = p_ptr->y + ddy[dir];
\r
6287 x = p_ptr->x + ddx[dir];
\r
6289 if (cave[y][x].m_idx)
\r
6290 py_attack(y, x, HISSATSU_COLD);
\r
6293 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
6300 if (name) return _("急所突き", "Spot Aiming");
\r
6301 if (desc) return _("モンスターを一撃で倒す攻撃を繰り出す。失敗すると1点しかダメージを与えられない。",
\r
6302 "Attempts to kill a monster instantly. If failed cause only 1HP of damage.");
\r
6308 if (!get_rep_dir2(&dir)) return NULL;
\r
6309 if (dir == 5) return NULL;
\r
6311 y = p_ptr->y + ddy[dir];
\r
6312 x = p_ptr->x + ddx[dir];
\r
6314 if (cave[y][x].m_idx)
\r
6315 py_attack(y, x, HISSATSU_KYUSHO);
\r
6318 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
6325 if (name) return _("魔神斬り", "Majingiri");
\r
6326 if (desc) return _("会心の一撃で攻撃する。攻撃がかわされやすい。",
\r
6327 "Attempts to attack with critical hit. But this attack is easy to evade for a monster.");
\r
6333 if (!get_rep_dir2(&dir)) return NULL;
\r
6334 if (dir == 5) return NULL;
\r
6336 y = p_ptr->y + ddy[dir];
\r
6337 x = p_ptr->x + ddx[dir];
\r
6339 if (cave[y][x].m_idx)
\r
6340 py_attack(y, x, HISSATSU_MAJIN);
\r
6343 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
6350 if (name) return _("捨て身", "Desperate Attack");
\r
6351 if (desc) return _("強力な攻撃を繰り出す。次のターンまでの間、食らうダメージが増える。",
\r
6352 "Attacks with all of your power. But all damages you take will be doubled for one turn.");
\r
6358 if (!get_rep_dir2(&dir)) return NULL;
\r
6359 if (dir == 5) return NULL;
\r
6361 y = p_ptr->y + ddy[dir];
\r
6362 x = p_ptr->x + ddx[dir];
\r
6364 if (cave[y][x].m_idx)
\r
6365 py_attack(y, x, HISSATSU_SUTEMI);
\r
6368 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
6371 p_ptr->sutemi = TRUE;
\r
6376 if (name) return _("雷撃鷲爪斬", "Lightning Eagle");
\r
6377 if (desc) return _("電撃耐性のないモンスターに非常に大きいダメージを与える。",
\r
6378 "Attacks a monster with more damage unless it has resistance to electricity.");
\r
6384 if (!get_rep_dir2(&dir)) return NULL;
\r
6385 if (dir == 5) return NULL;
\r
6387 y = p_ptr->y + ddy[dir];
\r
6388 x = p_ptr->x + ddx[dir];
\r
6390 if (cave[y][x].m_idx)
\r
6391 py_attack(y, x, HISSATSU_ELEC);
\r
6394 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
6401 if (name) return _("入身", "Rush Attack");
\r
6402 if (desc) return _("素早く相手に近寄り攻撃する。", "Steps close to a monster and attacks at a time.");
\r
6406 if (!rush_attack(NULL)) return NULL;
\r
6411 if (name) return _("赤流渦", "Bloody Maelstrom");
\r
6412 if (desc) return _("自分自身も傷を作りつつ、その傷が深いほど大きい威力で全方向の敵を攻撃できる。生きていないモンスターには効果がない。",
\r
6413 "Attacks all adjacent monsters with power corresponding to your cut status. Then increases your cut status. No effect to unliving monsters.");
\r
6420 monster_type *m_ptr;
\r
6422 if (p_ptr->cut < 300)
\r
6423 set_cut(p_ptr->cut + 300);
\r
6425 set_cut(p_ptr->cut * 2);
\r
6427 for (dir = 0; dir < 8; dir++)
\r
6429 y = p_ptr->y + ddy_ddd[dir];
\r
6430 x = p_ptr->x + ddx_ddd[dir];
\r
6431 c_ptr = &cave[y][x];
\r
6433 /* Get the monster */
\r
6434 m_ptr = &m_list[c_ptr->m_idx];
\r
6436 /* Hack -- attack monsters */
\r
6437 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
\r
6439 if (!monster_living(&r_info[m_ptr->r_idx]))
\r
6443 monster_desc(m_name, m_ptr, 0);
\r
6444 msg_format(_("%sには効果がない!", "%s is unharmed!"), m_name);
\r
6446 else py_attack(y, x, HISSATSU_SEKIRYUKA);
\r
6453 if (name) return _("激震撃", "Earthquake Blow");
\r
6454 if (desc) return _("地震を起こす。", "Shakes dungeon structure, and results in random swapping of floors and walls.");
\r
6460 if (!get_rep_dir2(&dir)) return NULL;
\r
6461 if (dir == 5) return NULL;
\r
6463 y = p_ptr->y + ddy[dir];
\r
6464 x = p_ptr->x + ddx[dir];
\r
6466 if (cave[y][x].m_idx)
\r
6467 py_attack(y, x, HISSATSU_QUAKE);
\r
6469 earthquake(p_ptr->y, p_ptr->x, 10);
\r
6474 if (name) return _("地走り", "Crack");
\r
6475 if (desc) return _("衝撃波のビームを放つ。", "Fires a beam of shock wave.");
\r
6479 int total_damage = 0, basedam, i;
\r
6480 u32b flgs[TR_FLAG_SIZE];
\r
6481 object_type *o_ptr;
\r
6482 if (!get_aim_dir(&dir)) return NULL;
\r
6483 msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
\r
6484 for (i = 0; i < 2; i++)
\r
6488 if (!buki_motteruka(INVEN_RARM+i)) break;
\r
6489 o_ptr = &inventory[INVEN_RARM+i];
\r
6490 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
\r
6491 damage = o_ptr->to_d * 100;
\r
6492 object_flags(o_ptr, flgs);
\r
6493 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
\r
6495 /* vorpal blade */
\r
6499 else if (have_flag(flgs, TR_VORPAL))
\r
6501 /* vorpal flag only */
\r
6505 damage += basedam;
\r
6506 damage *= p_ptr->num_blow[i];
\r
6507 total_damage += damage / 200;
\r
6508 if (i) total_damage = total_damage*7/10;
\r
6510 fire_beam(GF_FORCE, dir, total_damage);
\r
6515 if (name) return _("気迫の雄叫び", "War Cry");
\r
6516 if (desc) return _("視界内の全モンスターに対して轟音の攻撃を行う。さらに、近くにいるモンスターを怒らせる。",
\r
6517 "Damages all monsters in sight with sound. Aggravate nearby monsters.");
\r
6521 msg_print(_("雄叫びをあげた!", "You roar out!"));
\r
6522 project_hack(GF_SOUND, randint1(plev * 3));
\r
6523 aggravate_monsters(0);
\r
6528 if (name) return _("無双三段", "Musou-Sandan");
\r
6529 if (desc) return _("強力な3段攻撃を繰り出す。", "Attacks with powerful 3 strikes.");
\r
6535 if (!get_rep_dir2(&dir)) return NULL;
\r
6536 if (dir == 5) return NULL;
\r
6538 for (i = 0; i < 3; i++)
\r
6542 MONSTER_IDX m_idx;
\r
6544 monster_type *m_ptr;
\r
6546 y = p_ptr->y + ddy[dir];
\r
6547 x = p_ptr->x + ddx[dir];
\r
6548 c_ptr = &cave[y][x];
\r
6551 py_attack(y, x, HISSATSU_3DAN);
\r
6554 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
6558 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
\r
6563 /* Monster is dead? */
\r
6564 if (!c_ptr->m_idx) break;
\r
6566 ny = y + ddy[dir];
\r
6567 nx = x + ddx[dir];
\r
6568 m_idx = c_ptr->m_idx;
\r
6569 m_ptr = &m_list[m_idx];
\r
6571 /* Monster cannot move back? */
\r
6572 if (!monster_can_enter(ny, nx, &r_info[m_ptr->r_idx], 0))
\r
6575 if (i < 2) msg_print(NULL);
\r
6580 cave[ny][nx].m_idx = m_idx;
\r
6584 update_mon(m_idx, TRUE);
\r
6586 /* Redraw the old spot */
\r
6589 /* Redraw the new spot */
\r
6590 lite_spot(ny, nx);
\r
6592 /* Player can move forward? */
\r
6593 if (player_can_enter(c_ptr->feat, 0))
\r
6595 /* Move the player */
\r
6596 if (!move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP)) break;
\r
6604 if (i < 2) msg_print(NULL);
\r
6610 if (name) return _("吸血鬼の牙", "Vampire's Fang");
\r
6611 if (desc) return _("攻撃した相手の体力を吸いとり、自分の体力を回復させる。生命を持たないモンスターには通じない。",
\r
6612 "Attacks with vampiric strikes which absorbs HP from a monster and gives them to you. No effect to unliving monsters.");
\r
6618 if (!get_rep_dir2(&dir)) return NULL;
\r
6619 if (dir == 5) return NULL;
\r
6621 y = p_ptr->y + ddy[dir];
\r
6622 x = p_ptr->x + ddx[dir];
\r
6624 if (cave[y][x].m_idx)
\r
6625 py_attack(y, x, HISSATSU_DRAIN);
\r
6628 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
6635 if (name) return _("幻惑", "Moon Dazzling");
\r
6636 if (desc) return _("視界内の起きている全モンスターに朦朧、混乱、眠りを与えようとする。", "Attempts to stun, confuse and sleep all waking monsters.");
\r
6640 msg_print(_("武器を不規則に揺らした...", "You irregularly wave your weapon..."));
\r
6641 project_hack(GF_ENGETSU, plev * 4);
\r
6642 project_hack(GF_ENGETSU, plev * 4);
\r
6643 project_hack(GF_ENGETSU, plev * 4);
\r
6648 if (name) return _("百人斬り", "Hundred Slaughter");
\r
6649 if (desc) return _("連続して入身でモンスターを攻撃する。攻撃するたびにMPを消費。MPがなくなるか、モンスターを倒せなかったら百人斬りは終了する。",
\r
6650 "Performs a series of rush attacks. The series continues while killing each monster in a time and SP remains.");
\r
6654 const int mana_cost_per_monster = 8;
\r
6655 bool is_new = TRUE;
\r
6660 if (!rush_attack(&mdeath)) break;
\r
6663 /* Reserve needed mana point */
\r
6664 p_ptr->csp -= technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
\r
6668 p_ptr->csp -= mana_cost_per_monster;
\r
6670 if (!mdeath) break;
\r
6673 p_ptr->redraw |= PR_MANA;
\r
6676 while (p_ptr->csp > mana_cost_per_monster);
\r
6678 if (is_new) return NULL;
\r
6680 /* Restore reserved mana */
\r
6681 p_ptr->csp += technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
\r
6686 if (name) return _("天翔龍閃", "Dragonic Flash");
\r
6687 if (desc) return _("視界内の場所を指定して、その場所と自分の間にいる全モンスターを攻撃し、その場所に移動する。",
\r
6688 "Runs toward given location while attacking all monsters on the path.");
\r
6694 if (!tgt_pt(&x, &y)) return NULL;
\r
6696 if (!cave_player_teleportable_bold(y, x, 0L) ||
\r
6697 (distance(y, x, p_ptr->y, p_ptr->x) > MAX_SIGHT / 2) ||
\r
6698 !projectable(p_ptr->y, p_ptr->x, y, x))
\r
6700 msg_print(_("失敗!", "You cannot move to that place!"));
\r
6703 if (p_ptr->anti_tele)
\r
6705 msg_print(_("不思議な力がテレポートを防いだ!", "A mysterious force prevents you from teleporting!"));
\r
6708 project(0, 0, y, x, HISSATSU_ISSEN, GF_ATTACK, PROJECT_BEAM | PROJECT_KILL, -1);
\r
6709 teleport_player_to(y, x, 0L);
\r
6714 if (name) return _("二重の剣撃", "Twin Slash");
\r
6715 if (desc) return _("1ターンで2度攻撃を行う。", "double attacks at a time.");
\r
6721 if (!get_rep_dir(&dir, FALSE)) return NULL;
\r
6723 y = p_ptr->y + ddy[dir];
\r
6724 x = p_ptr->x + ddx[dir];
\r
6726 if (cave[y][x].m_idx)
\r
6728 py_attack(y, x, 0);
\r
6729 if (cave[y][x].m_idx)
\r
6732 py_attack(y, x, 0);
\r
6737 msg_print(_("その方向にはモンスターはいません。", "You don't see any monster in this direction"));
\r
6744 if (name) return _("虎伏絶刀勢", "Kofuku-Zettousei");
\r
6745 if (desc) return _("強力な攻撃を行い、近くの場所にも効果が及ぶ。", "Performs a powerful attack which even effect nearby monsters.");
\r
6749 int total_damage = 0, basedam, i;
\r
6751 u32b flgs[TR_FLAG_SIZE];
\r
6752 object_type *o_ptr;
\r
6754 if (!get_rep_dir2(&dir)) return NULL;
\r
6755 if (dir == 5) return NULL;
\r
6757 y = p_ptr->y + ddy[dir];
\r
6758 x = p_ptr->x + ddx[dir];
\r
6760 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
\r
6762 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));
\r
6765 msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
\r
6766 for (i = 0; i < 2; i++)
\r
6769 if (!buki_motteruka(INVEN_RARM+i)) break;
\r
6770 o_ptr = &inventory[INVEN_RARM+i];
\r
6771 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
\r
6772 damage = o_ptr->to_d * 100;
\r
6773 object_flags(o_ptr, flgs);
\r
6774 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
\r
6776 /* vorpal blade */
\r
6780 else if (have_flag(flgs, TR_VORPAL))
\r
6782 /* vorpal flag only */
\r
6786 damage += basedam;
\r
6787 damage += p_ptr->to_d[i] * 100;
\r
6788 damage *= p_ptr->num_blow[i];
\r
6789 total_damage += (damage / 100);
\r
6791 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
6796 if (name) return _("慶雲鬼忍剣", "Keiun-Kininken");
\r
6797 if (desc) return _("自分もダメージをくらうが、相手に非常に大きなダメージを与える。アンデッドには特に効果がある。",
\r
6798 "Attacks a monster with extremely powerful damage. But you also takes some damages. Hurts a undead monster greatly.");
\r
6804 if (!get_rep_dir2(&dir)) return NULL;
\r
6805 if (dir == 5) return NULL;
\r
6807 y = p_ptr->y + ddy[dir];
\r
6808 x = p_ptr->x + ddx[dir];
\r
6810 if (cave[y][x].m_idx)
\r
6811 py_attack(y, x, HISSATSU_UNDEAD);
\r
6814 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
6817 take_hit(DAMAGE_NOESCAPE, 100 + randint1(100), _("慶雲鬼忍剣を使った衝撃", "exhaustion on using Keiun-Kininken"), -1);
\r
6822 if (name) return _("切腹", "Harakiri");
\r
6823 if (desc) return _("「武士道とは、死ぬことと見つけたり。」", "'Busido is found in death'");
\r
6828 if (!get_check(_("本当に自殺しますか?", "Do you really want to commit suicide? "))) return NULL;
\r
6829 /* Special Verification for suicide */
\r
6830 prt(_("確認のため '@' を押して下さい。", "Please verify SUICIDE by typing the '@' sign: "), 0, 0);
\r
6835 if (i != '@') return NULL;
\r
6836 if (p_ptr->total_winner)
\r
6838 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
\r
6839 p_ptr->total_winner = TRUE;
\r
6843 msg_print(_("武士道とは、死ぬことと見つけたり。", "Meaning of Bushi-do is found in the death."));
\r
6844 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
\r
6854 * @brief 呪術領域の武器呪縛の対象にできる武器かどうかを返す。 / An "item_tester_hook" for offer
\r
6855 * @param o_ptr オブジェクト構造体の参照ポインタ
\r
6856 * @return 呪縛可能な武器ならばTRUEを返す
\r
6858 static bool item_tester_hook_weapon_except_bow(object_type *o_ptr)
\r
6860 switch (o_ptr->tval)
\r
6875 * @brief 呪術領域の各処理に使える呪われた装備かどうかを返す。 / An "item_tester_hook" for offer
\r
6876 * @param o_ptr オブジェクト構造体の参照ポインタ
\r
6877 * @return 使える装備ならばTRUEを返す
\r
6879 static bool item_tester_hook_cursed(object_type *o_ptr)
\r
6881 return (bool)(object_is_cursed(o_ptr));
\r
6885 * @brief 呪術領域魔法の各処理を行う
\r
6886 * @param spell 魔法ID
\r
6887 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_CONT / SPELL_STOP)
\r
6888 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
\r
6890 static cptr do_hex_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
6892 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
6893 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
6894 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
6895 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
6896 bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
\r
6897 bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
\r
6901 PLAYER_LEVEL plev = p_ptr->lev;
\r
6906 /*** 1st book (0-7) ***/
\r
6908 if (name) return _("邪なる祝福", "Evily blessing");
\r
6909 if (desc) return _("祝福により攻撃精度と防御力が上がる。", "Attempts to increase +to_hit of a weapon and AC");
\r
6912 if (!p_ptr->blessed)
\r
6914 msg_print(_("高潔な気分になった!", "You feel righteous!"));
\r
6919 if (!p_ptr->blessed)
\r
6921 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
\r
6927 if (name) return _("軽傷の治癒", "Cure light wounds");
\r
6928 if (desc) return _("HPや傷を少し回復させる。", "Heals cut and HP a little.");
\r
6929 if (info) return info_heal(1, 10, 0);
\r
6932 msg_print(_("気分が良くなってくる。", "You feel better and better."));
\r
6936 hp_player(damroll(1, 10));
\r
6937 set_cut(p_ptr->cut - 10);
\r
6942 if (name) return _("悪魔のオーラ", "Demonic aura");
\r
6943 if (desc) return _("炎のオーラを身にまとい、回復速度が速くなる。", "Gives fire aura and regeneration.");
\r
6946 msg_print(_("体が炎のオーラで覆われた。", "You have enveloped by fiery aura!"));
\r
6950 msg_print(_("炎のオーラが消え去った。", "Fiery aura disappeared."));
\r
6955 if (name) return _("悪臭霧", "Stinking mist");
\r
6956 if (desc) return _("視界内のモンスターに微弱量の毒のダメージを与える。", "Deals few damages of poison to all monsters in your sight.");
\r
6957 power = plev / 2 + 5;
\r
6958 if (info) return info_damage(1, power, 0);
\r
6961 project_hack(GF_POIS, randint1(power));
\r
6966 if (name) return _("腕力強化", "Extra might");
\r
6967 if (desc) return _("術者の腕力を上昇させる。", "Attempts to increase your strength.");
\r
6970 msg_print(_("何だか力が湧いて来る。", "You feel you get stronger."));
\r
6975 if (name) return _("武器呪縛", "Curse weapon");
\r
6976 if (desc) return _("装備している武器を呪う。", "Curses your weapon.");
\r
6981 char o_name[MAX_NLEN];
\r
6982 object_type *o_ptr;
\r
6983 u32b f[TR_FLAG_SIZE];
\r
6985 item_tester_hook = item_tester_hook_weapon_except_bow;
\r
6986 q = _("どれを呪いますか?", "Which weapon do you curse?");
\r
6987 s = _("武器を装備していない。", "You wield no weapons.");
\r
6989 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
\r
6991 o_ptr = &inventory[item];
\r
6992 object_desc(o_name, o_ptr, OD_NAME_ONLY);
\r
6993 object_flags(o_ptr, f);
\r
6995 if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
\r
6997 if (!one_in_(3) &&
\r
6998 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
\r
7000 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
\r
7003 if (o_ptr->to_d > 0)
\r
7005 o_ptr->to_d -= randint1(3) % 2;
\r
7006 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
\r
7008 if (o_ptr->to_h > 0)
\r
7010 o_ptr->to_h -= randint1(3) % 2;
\r
7011 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
\r
7013 if (o_ptr->to_a > 0)
\r
7015 o_ptr->to_a -= randint1(3) % 2;
\r
7016 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
\r
7018 msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
\r
7023 int curse_rank = 0;
\r
7024 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
\r
7025 o_ptr->curse_flags |= (TRC_CURSED);
\r
7027 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
\r
7030 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
\r
7033 o_ptr->curse_flags |= (TRC_TY_CURSE);
\r
7034 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
\r
7036 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
\r
7037 add_flag(o_ptr->art_flags, TR_VORPAL);
\r
7038 add_flag(o_ptr->art_flags, TR_VAMPIRIC);
\r
7039 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
\r
7044 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);
\r
7047 p_ptr->update |= (PU_BONUS);
\r
7053 if (name) return _("邪悪感知", "Evil detection");
\r
7054 if (desc) return _("周囲の邪悪なモンスターを感知する。", "Detects evil monsters.");
\r
7055 if (info) return info_range(MAX_SIGHT);
\r
7058 msg_print(_("邪悪な生物の存在を感じ取ろうとした。", "You attend to the presence of evil creatures."));
\r
7063 if (name) return _("我慢", "Patience");
\r
7064 if (desc) return _("数ターン攻撃を耐えた後、受けたダメージを地獄の業火として周囲に放出する。",
\r
7065 "Bursts hell fire strongly after patients any damage while few turns.");
\r
7066 power = MIN(200, (HEX_REVENGE_POWER(p_ptr) * 2));
\r
7067 if (info) return info_damage(0, 0, power);
\r
7070 int a = 3 - (p_ptr->pspeed - 100) / 10;
\r
7071 MAGIC_NUM2 r = 3 + randint1(3) + MAX(0, MIN(3, a));
\r
7073 if (HEX_REVENGE_TURN(p_ptr) > 0)
\r
7075 msg_print(_("すでに我慢をしている。", "You are already patienting."));
\r
7079 HEX_REVENGE_TYPE(p_ptr) = 1;
\r
7080 HEX_REVENGE_TURN(p_ptr) = r;
\r
7081 HEX_REVENGE_POWER(p_ptr) = 0;
\r
7082 msg_print(_("じっと耐えることにした。", "You decide to patient all damages."));
\r
7087 int rad = 2 + (power / 50);
\r
7089 HEX_REVENGE_TURN(p_ptr)--;
\r
7091 if ((HEX_REVENGE_TURN(p_ptr) <= 0) || (power >= 200))
\r
7093 msg_print(_("我慢が解かれた!", "Time for end of patioence!"));
\r
7096 project(0, rad, p_ptr->y, p_ptr->x, power, GF_HELL_FIRE,
\r
7097 (PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);
\r
7099 if (p_ptr->wizard)
\r
7101 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
\r
7105 HEX_REVENGE_TYPE(p_ptr) = 0;
\r
7106 HEX_REVENGE_TURN(p_ptr) = 0;
\r
7107 HEX_REVENGE_POWER(p_ptr) = 0;
\r
7112 /*** 2nd book (8-15) ***/
\r
7114 if (name) return _("氷の鎧", "Ice armor");
\r
7115 if (desc) return _("氷のオーラを身にまとい、防御力が上昇する。", "Gives fire aura and bonus to AC.");
\r
7118 msg_print(_("体が氷の鎧で覆われた。", "You have enveloped by ice armor!"));
\r
7122 msg_print(_("氷の鎧が消え去った。", "Ice armor disappeared."));
\r
7127 if (name) return _("重傷の治癒", "Cure serious wounds");
\r
7128 if (desc) return _("体力や傷を多少回復させる。", "Heals cut and HP more.");
\r
7129 if (info) return info_heal(2, 10, 0);
\r
7132 msg_print(_("気分が良くなってくる。", "You feel better and better."));
\r
7136 hp_player(damroll(2, 10));
\r
7137 set_cut((p_ptr->cut / 2) - 10);
\r
7142 if (name) return _("薬品吸入", "Inhail potion");
\r
7143 if (desc) return _("呪文詠唱を中止することなく、薬の効果を得ることができる。", "Quaffs a potion without canceling of casting a spell.");
\r
7146 CASTING_HEX_FLAGS(p_ptr) |= (1L << HEX_INHAIL);
\r
7147 do_cmd_quaff_potion();
\r
7148 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_INHAIL);
\r
7154 if (name) return _("衰弱の霧", "Hypodynamic mist");
\r
7155 if (desc) return _("視界内のモンスターに微弱量の衰弱属性のダメージを与える。",
\r
7156 "Deals few damages of hypodynamia to all monsters in your sight.");
\r
7157 power = (plev / 2) + 5;
\r
7158 if (info) return info_damage(1, power, 0);
\r
7161 project_hack(GF_HYPODYNAMIA, randint1(power));
\r
7166 if (name) return _("魔剣化", "Swords to runeswords");
\r
7167 if (desc) return _("武器の攻撃力を上げる。切れ味を得、呪いに応じて与えるダメージが上昇し、善良なモンスターに対するダメージが2倍になる。",
\r
7168 "Gives vorpal ability to your weapon. Increases damages by your weapon acccording to curse of your weapon.");
\r
7172 msg_print("あなたの武器が黒く輝いた。");
\r
7174 if (!empty_hands(FALSE))
\r
7175 msg_print("Your weapons glow bright black.");
\r
7177 msg_print("Your weapon glows bright black.");
\r
7183 msg_print("武器の輝きが消え去った。");
\r
7185 msg_format("Brightness of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
\r
7191 if (name) return _("混乱の手", "Touch of confusion");
\r
7192 if (desc) return _("攻撃した際モンスターを混乱させる。", "Confuses a monster when you attack.");
\r
7195 msg_print(_("あなたの手が赤く輝き始めた。", "Your hands glow bright red."));
\r
7199 msg_print(_("手の輝きがなくなった。", "Brightness on your hands disappeard."));
\r
7204 if (name) return _("肉体強化", "Building up");
\r
7205 if (desc) return _("術者の腕力、器用さ、耐久力を上昇させる。攻撃回数の上限を 1 増加させる。",
\r
7206 "Attempts to increases your strength, dexterity and constitusion.");
\r
7209 msg_print(_("身体が強くなった気がした。", "You feel your body is developed more now."));
\r
7214 if (name) return _("反テレポート結界", "Anti teleport barrier");
\r
7215 if (desc) return _("視界内のモンスターのテレポートを阻害するバリアを張る。", "Obstructs all teleportations by monsters in your sight.");
\r
7216 power = plev * 3 / 2;
\r
7217 if (info) return info_power(power);
\r
7220 msg_print(_("テレポートを防ぐ呪いをかけた。", "You feel anyone can not teleport except you."));
\r
7224 /*** 3rd book (16-23) ***/
\r
7226 if (name) return _("衝撃のクローク", "Cloak of shock");
\r
7227 if (desc) return _("電気のオーラを身にまとい、動きが速くなる。", "Gives lightning aura and a bonus to speed.");
\r
7230 msg_print(_("体が稲妻のオーラで覆われた。", "You have enveloped by electrical aura!"));
\r
7234 msg_print(_("稲妻のオーラが消え去った。", "Electrical aura disappeared."));
\r
7239 if (name) return _("致命傷の治癒", "Cure critical wounds");
\r
7240 if (desc) return _("体力や傷を回復させる。", "Heals cut and HP greatry.");
\r
7241 if (info) return info_heal(4, 10, 0);
\r
7244 msg_print(_("気分が良くなってくる。", "You feel better and better."));
\r
7248 hp_player(damroll(4, 10));
\r
7256 if (name) return _("呪力封入", "Recharging");
\r
7257 if (desc) return _("魔法の道具に魔力を再充填する。", "Recharges a magic device.");
\r
7259 if (info) return info_power(power);
\r
7262 if (!recharge(power)) return NULL;
\r
7268 if (name) return _("死者復活", "Animate Dead");
\r
7269 if (desc) return _("死体を蘇らせてペットにする。", "Raises corpses and skeletons from dead.");
\r
7272 msg_print(_("死者への呼びかけを始めた。", "You start to call deads.!"));
\r
7276 animate_dead(0, p_ptr->y, p_ptr->x);
\r
7281 if (name) return _("防具呪縛", "Curse armor");
\r
7282 if (desc) return _("装備している防具に呪いをかける。", "Curse a piece of armour that you wielding.");
\r
7287 char o_name[MAX_NLEN];
\r
7288 object_type *o_ptr;
\r
7289 u32b f[TR_FLAG_SIZE];
\r
7291 item_tester_hook = object_is_armour;
\r
7292 q = _("どれを呪いますか?", "Which piece of armour do you curse?");
\r
7293 s = _("防具を装備していない。", "You wield no piece of armours.");
\r
7295 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
\r
7297 o_ptr = &inventory[item];
\r
7298 object_desc(o_name, o_ptr, OD_NAME_ONLY);
\r
7299 object_flags(o_ptr, f);
\r
7301 if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
\r
7303 if (!one_in_(3) &&
\r
7304 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
\r
7306 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
\r
7309 if (o_ptr->to_d > 0)
\r
7311 o_ptr->to_d -= randint1(3) % 2;
\r
7312 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
\r
7314 if (o_ptr->to_h > 0)
\r
7316 o_ptr->to_h -= randint1(3) % 2;
\r
7317 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
\r
7319 if (o_ptr->to_a > 0)
\r
7321 o_ptr->to_a -= randint1(3) % 2;
\r
7322 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
\r
7324 msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
\r
7329 int curse_rank = 0;
\r
7330 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
\r
7331 o_ptr->curse_flags |= (TRC_CURSED);
\r
7333 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
\r
7336 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
\r
7339 o_ptr->curse_flags |= (TRC_TY_CURSE);
\r
7340 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
\r
7342 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
\r
7343 add_flag(o_ptr->art_flags, TR_RES_POIS);
\r
7344 add_flag(o_ptr->art_flags, TR_RES_DARK);
\r
7345 add_flag(o_ptr->art_flags, TR_RES_NETHER);
\r
7346 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
\r
7351 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);
\r
7354 p_ptr->update |= (PU_BONUS);
\r
7360 if (name) return _("影のクローク", "Cloak of shadow");
\r
7361 if (desc) return _("影のオーラを身にまとい、敵に影のダメージを与える。", "Gives aura of shadow.");
\r
7364 object_type *o_ptr = &inventory[INVEN_OUTER];
\r
7366 if (!o_ptr->k_idx)
\r
7368 msg_print(_("クロークを身につけていない!", "You don't ware any cloak."));
\r
7371 else if (!object_is_cursed(o_ptr))
\r
7373 msg_print(_("クロークは呪われていない!", "Your cloak is not cursed."));
\r
7378 msg_print(_("影のオーラを身にまとった。", "You have enveloped by shadow aura!"));
\r
7383 object_type *o_ptr = &inventory[INVEN_OUTER];
\r
7385 if ((!o_ptr->k_idx) || (!object_is_cursed(o_ptr)))
\r
7387 do_spell(REALM_HEX, spell, SPELL_STOP);
\r
7388 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << spell);
\r
7389 CASTING_HEX_NUM(p_ptr)--;
\r
7390 if (!SINGING_SONG_ID(p_ptr)) set_action(ACTION_NONE);
\r
7395 msg_print(_("影のオーラが消え去った。", "Shadow aura disappeared."));
\r
7400 if (name) return _("苦痛を魔力に", "Pains to mana");
\r
7401 if (desc) return _("視界内のモンスターに精神ダメージ与え、魔力を吸い取る。", "Deals psychic damages to all monsters in sight, and drains some mana.");
\r
7402 power = plev * 3 / 2;
\r
7403 if (info) return info_damage(1, power, 0);
\r
7406 project_hack(GF_PSI_DRAIN, randint1(power));
\r
7411 if (name) return _("目には目を", "Eye for an eye");
\r
7412 if (desc) return _("打撃や魔法で受けたダメージを、攻撃元のモンスターにも与える。", "Returns same damage which you got to the monster which damaged you.");
\r
7415 msg_print(_("復讐したい欲望にかられた。", "You wish strongly you want to revenge anything."));
\r
7419 /*** 4th book (24-31) ***/
\r
7421 if (name) return _("反増殖結界", "Anti multiply barrier");
\r
7422 if (desc) return _("その階の増殖するモンスターの増殖を阻止する。", "Obstructs all multiplying by monsters in entire floor.");
\r
7425 msg_print(_("増殖を阻止する呪いをかけた。", "You feel anyone can not already multiply."));
\r
7430 if (name) return _("全復活", "Restoration");
\r
7431 if (desc) return _("経験値を徐々に復活し、減少した能力値を回復させる。", "Restores experience and status.");
\r
7434 msg_print(_("体が元の活力を取り戻し始めた。", "You feel your lost status starting to return."));
\r
7438 bool flag = FALSE;
\r
7439 int d = (p_ptr->max_exp - p_ptr->exp);
\r
7440 int r = (p_ptr->exp / 20);
\r
7446 p_ptr->exp = p_ptr->max_exp;
\r
7450 /* Check the experience */
\r
7451 check_experience();
\r
7455 for (i = A_STR; i < 6; i ++)
\r
7457 if (p_ptr->stat_cur[i] < p_ptr->stat_max[i])
\r
7459 if (p_ptr->stat_cur[i] < 18)
\r
7460 p_ptr->stat_cur[i]++;
\r
7462 p_ptr->stat_cur[i] += 10;
\r
7464 if (p_ptr->stat_cur[i] > p_ptr->stat_max[i])
\r
7465 p_ptr->stat_cur[i] = p_ptr->stat_max[i];
\r
7467 /* Recalculate bonuses */
\r
7468 p_ptr->update |= (PU_BONUS);
\r
7476 msg_format(_("%sの呪文の詠唱をやめた。", "Finish casting '%^s'."), do_spell(REALM_HEX, HEX_RESTORE, SPELL_NAME));
\r
7477 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_RESTORE);
\r
7478 if (cont) CASTING_HEX_NUM(p_ptr)--;
\r
7479 if (CASTING_HEX_NUM(p_ptr)) p_ptr->action = ACTION_NONE;
\r
7481 /* Redraw status */
\r
7482 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
\r
7483 p_ptr->redraw |= (PR_EXTRA);
\r
7491 if (name) return _("呪力吸収", "Drain curse power");
\r
7492 if (desc) return _("呪われた武器の呪いを吸収して魔力を回復する。", "Drains curse on your weapon and heals SP a little.");
\r
7497 u32b f[TR_FLAG_SIZE];
\r
7498 object_type *o_ptr;
\r
7500 item_tester_hook = item_tester_hook_cursed;
\r
7501 q = _("どの装備品から吸収しますか?", "Which cursed equipment do you drain mana from?");
\r
7502 s = _("呪われたアイテムを装備していない。", "You have no cursed equipment.");
\r
7504 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
\r
7506 o_ptr = &inventory[item];
\r
7507 object_flags(o_ptr, f);
\r
7509 p_ptr->csp += (p_ptr->lev / 5) + randint1(p_ptr->lev / 5);
\r
7510 if (have_flag(f, TR_TY_CURSE) || (o_ptr->curse_flags & TRC_TY_CURSE)) p_ptr->csp += randint1(5);
\r
7511 if (p_ptr->csp > p_ptr->msp) p_ptr->csp = p_ptr->msp;
\r
7513 if (o_ptr->curse_flags & TRC_PERMA_CURSE)
\r
7517 else if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
\r
7521 msg_print(_("呪いを全て吸い取った。", "Heavy curse vanished away."));
\r
7522 o_ptr->curse_flags = 0L;
\r
7525 else if ((o_ptr->curse_flags & (TRC_CURSED)) && one_in_(3))
\r
7527 msg_print(_("呪いを全て吸い取った。", "Curse vanished away."));
\r
7528 o_ptr->curse_flags = 0L;
\r
7536 if (name) return _("吸血の刃", "Swords to vampires");
\r
7537 if (desc) return _("吸血属性で攻撃する。", "Gives vampiric ability to your weapon.");
\r
7541 msg_print("あなたの武器が血を欲している。");
\r
7543 if (!empty_hands(FALSE))
\r
7544 msg_print("Your weapons want more blood now.");
\r
7546 msg_print("Your weapon wants more blood now.");
\r
7552 msg_print("武器の渇望が消え去った。");
\r
7554 msg_format("Thirsty of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
\r
7560 if (name) return _("朦朧の言葉", "Word of stun");
\r
7561 if (desc) return _("視界内のモンスターを朦朧とさせる。", "Stuns all monsters in your sight.");
\r
7563 if (info) return info_power(power);
\r
7566 stun_monsters(power);
\r
7571 if (name) return _("影移動", "Moving into shadow");
\r
7572 if (desc) return _("モンスターの隣のマスに瞬間移動する。", "Teleports you close to a monster.");
\r
7579 for (i = 0; i < 3; i++)
\r
7581 if (!tgt_pt(&x, &y)) return FALSE;
\r
7585 for (dir = 0; dir < 8; dir++)
\r
7587 int dy = y + ddy_ddd[dir];
\r
7588 int dx = x + ddx_ddd[dir];
\r
7589 if (dir == 5) continue;
\r
7590 if(cave[dy][dx].m_idx) flag = TRUE;
\r
7593 if (!cave_empty_bold(y, x) || (cave[y][x].info & CAVE_ICKY) ||
\r
7594 (distance(y, x, p_ptr->y, p_ptr->x) > plev + 2))
\r
7596 msg_print(_("そこには移動できない。", "Can not teleport to there."));
\r
7602 if (flag && randint0(plev * plev / 2))
\r
7604 teleport_player_to(y, x, 0L);
\r
7608 msg_print(_("おっと!", "Oops!"));
\r
7609 teleport_player(30, 0L);
\r
7617 if (name) return _("反魔法結界", "Anti magic barrier");
\r
7618 if (desc) return _("視界内のモンスターの魔法を阻害するバリアを張る。", "Obstructs all magic spell of monsters in your sight.");
\r
7619 power = plev * 3 / 2;
\r
7620 if (info) return info_power(power);
\r
7623 msg_print(_("魔法を防ぐ呪いをかけた。", "You feel anyone can not cast spells except you."));
\r
7628 if (name) return _("復讐の宣告", "Revenge sentence");
\r
7629 if (desc) return _("数ターン後にそれまで受けたダメージに応じた威力の地獄の劫火の弾を放つ。",
\r
7630 "Fires a ball of hell fire to try revenging after few turns.");
\r
7631 power = HEX_REVENGE_POWER(p_ptr);
\r
7632 if (info) return info_damage(0, 0, power);
\r
7636 int a = 3 - (p_ptr->pspeed - 100) / 10;
\r
7637 r = 1 + randint1(2) + MAX(0, MIN(3, a));
\r
7639 if (HEX_REVENGE_TURN(p_ptr) > 0)
\r
7641 msg_print(_("すでに復讐は宣告済みだ。", "You already pronounced your revenge."));
\r
7645 HEX_REVENGE_TYPE(p_ptr) = 2;
\r
7646 HEX_REVENGE_TURN(p_ptr) = r;
\r
7647 msg_format(_("あなたは復讐を宣告した。あと %d ターン。", "You pronounce your revenge. %d turns left."), r);
\r
7652 HEX_REVENGE_TURN(p_ptr)--;
\r
7654 if (HEX_REVENGE_TURN(p_ptr) <= 0)
\r
7664 msg_print(_("復讐の時だ!", "Time to revenge!"));
\r
7666 while (!get_aim_dir(&dir));
\r
7668 fire_ball(GF_HELL_FIRE, dir, power, 1);
\r
7670 if (p_ptr->wizard)
\r
7672 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
\r
7677 msg_print(_("復讐する気が失せた。", "You are not a mood to revenge."));
\r
7679 HEX_REVENGE_POWER(p_ptr) = 0;
\r
7685 /* start casting */
\r
7686 if ((cast) && (add))
\r
7689 CASTING_HEX_FLAGS(p_ptr) |= 1L << (spell);
\r
7690 CASTING_HEX_NUM(p_ptr)++;
\r
7692 if (p_ptr->action != ACTION_SPELL) set_action(ACTION_SPELL);
\r
7695 /* Redraw status */
\r
7698 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
\r
7699 p_ptr->redraw |= (PR_EXTRA | PR_HP | PR_MANA);
\r
7707 * @brief 魔法処理のメインルーチン
\r
7708 * @param realm 魔法領域のID
\r
7709 * @param spell 各領域の魔法ID
\r
7710 * @param mode 求める処理
\r
7711 * @return 各領域魔法に各種テキストを求めた場合は文字列参照ポインタ、そうでない場合はNULLポインタを返す。
\r
7713 cptr do_spell(REALM_IDX realm, SPELL_IDX spell, BIT_FLAGS mode)
\r
7717 case REALM_LIFE: return do_life_spell(spell, mode);
\r
7718 case REALM_SORCERY: return do_sorcery_spell(spell, mode);
\r
7719 case REALM_NATURE: return do_nature_spell(spell, mode);
\r
7720 case REALM_CHAOS: return do_chaos_spell(spell, mode);
\r
7721 case REALM_DEATH: return do_death_spell(spell, mode);
\r
7722 case REALM_TRUMP: return do_trump_spell(spell, mode);
\r
7723 case REALM_ARCANE: return do_arcane_spell(spell, mode);
\r
7724 case REALM_CRAFT: return do_craft_spell(spell, mode);
\r
7725 case REALM_DAEMON: return do_daemon_spell(spell, mode);
\r
7726 case REALM_CRUSADE: return do_crusade_spell(spell, mode);
\r
7727 case REALM_MUSIC: return do_music_spell(spell, mode);
\r
7728 case REALM_HISSATSU: return do_hissatsu_spell(spell, mode);
\r
7729 case REALM_HEX: return do_hex_spell(spell, mode);
\r