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
17 * 魔法の効果を「キャプション:ダイス+定数値」のフォーマットで出力する / Generate dice info string such as "foo 2d10"
\r
22 * @return フォーマットに従い整形された文字列
\r
24 static cptr info_string_dice(cptr str, int dice, int sides, int base)
\r
28 return format("%s%d", str, base);
\r
32 return format("%s%dd%d", str, dice, sides);
\r
34 /* Dice plus base value */
\r
36 return format("%s%dd%d%+d", str, dice, sides, base);
\r
41 * @brief 魔法によるダメージを出力する / Generate damage-dice info string such as "dam 2d10"
\r
45 * @return フォーマットに従い整形された文字列
\r
47 static cptr info_damage(int dice, int sides, int base)
\r
49 return info_string_dice(_("損傷:", "dam "), dice, sides, base);
\r
53 * @brief 魔法の効果時間を出力する / Generate duration info string such as "dur 20+1d20"
\r
56 * @return フォーマットに従い整形された文字列
\r
58 static cptr info_duration(int base, int sides)
\r
60 return format(_("期間:%d+1d%d", "dur %d+1d%d"), base, sides);
\r
64 * @brief 魔法の効果範囲を出力する / Generate range info string such as "range 5"
\r
66 * @return フォーマットに従い整形された文字列
\r
68 static cptr info_range(POSITION range)
\r
70 return format(_("範囲:%d", "range %d"), range);
\r
74 * @brief 魔法による回復量を出力する / Generate heal info string such as "heal 2d8"
\r
78 * @return フォーマットに従い整形された文字列
\r
80 static cptr info_heal(int dice, int sides, int base)
\r
82 return info_string_dice(_("回復:", "heal "), dice, sides, base);
\r
86 * @brief 魔法効果発動までの遅延ターンを出力する / Generate delay info string such as "delay 15+1d15"
\r
89 * @return フォーマットに従い整形された文字列
\r
91 static cptr info_delay(int base, int sides)
\r
93 return format(_("遅延:%d+1d%d", "delay %d+1d%d"), base, sides);
\r
98 * @brief 魔法によるダメージを出力する(固定値&複数回処理) / Generate multiple-damage info string such as "dam 25 each"
\r
100 * @return フォーマットに従い整形された文字列
\r
102 static cptr info_multi_damage(HIT_POINT dam)
\r
104 return format(_("損傷:各%d", "dam %d each"), dam);
\r
109 * @brief 魔法によるダメージを出力する(ダイスのみ&複数回処理) / Generate multiple-damage-dice info string such as "dam 5d2 each"
\r
111 * @param sides ダイス目
\r
112 * @return フォーマットに従い整形された文字列
\r
114 static cptr info_multi_damage_dice(int dice, int sides)
\r
116 return format(_("損傷:各%dd%d", "dam %dd%d each"), dice, sides);
\r
120 * @brief 魔法による一般的な効力値を出力する(固定値) / Generate power info string such as "power 100"
\r
122 * @return フォーマットに従い整形された文字列
\r
124 static cptr info_power(int power)
\r
126 return format(_("効力:%d", "power %d"), power);
\r
131 * @brief 魔法による一般的な効力値を出力する(ダイス値) / Generate power info string such as "power 100"
\r
133 * @param sides ダイス目
\r
134 * @return フォーマットに従い整形された文字列
\r
137 * Generate power info string such as "power 1d100"
\r
139 static cptr info_power_dice(int dice, int sides)
\r
141 return format(_("効力:%dd%d", "power %dd%d"), dice, sides);
\r
146 * @brief 魔法の効果半径を出力する / Generate radius info string such as "rad 100"
\r
148 * @return フォーマットに従い整形された文字列
\r
150 static cptr info_radius(int rad)
\r
152 return format(_("半径:%d", "rad %d"), rad);
\r
157 * @brief 魔法効果の限界重量を出力する / Generate weight info string such as "max wgt 15"
\r
158 * @param weight 最大重量
\r
159 * @return フォーマットに従い整形された文字列
\r
161 static cptr info_weight(int weight)
\r
164 return format("最大重量:%d.%dkg", lbtokg1(weight), lbtokg2(weight));
\r
166 return format("max wgt %d", weight/10);
\r
172 * @brief 歌の開始を処理する / Start singing if the player is a Bard
\r
173 * @param spell 領域魔法としてのID
\r
174 * @param song 魔法効果のID
\r
177 static void start_singing(SPELL_IDX spell, MAGIC_NUM1 song)
\r
179 /* Remember the song index */
\r
180 SINGING_SONG_EFFECT(p_ptr) = (MAGIC_NUM1)song;
\r
182 /* Remember the index of the spell which activated the song */
\r
183 SINGING_SONG_ID(p_ptr) = (MAGIC_NUM2)spell;
\r
186 /* Now the player is singing */
\r
187 set_action(ACTION_SING);
\r
190 /* Recalculate bonuses */
\r
191 p_ptr->update |= (PU_BONUS);
\r
193 /* Redraw status bar */
\r
194 p_ptr->redraw |= (PR_STATUS);
\r
198 * @brief 歌の停止を処理する / Stop singing if the player is a Bard
\r
201 void stop_singing(void)
\r
203 if (p_ptr->pclass != CLASS_BARD) return;
\r
205 /* Are there interupted song? */
\r
206 if (INTERUPTING_SONG_EFFECT(p_ptr))
\r
208 /* Forget interupted song */
\r
209 INTERUPTING_SONG_EFFECT(p_ptr) = MUSIC_NONE;
\r
213 /* The player is singing? */
\r
214 if (!SINGING_SONG_EFFECT(p_ptr)) return;
\r
216 /* Hack -- if called from set_action(), avoid recursive loop */
\r
217 if (p_ptr->action == ACTION_SING) set_action(ACTION_NONE);
\r
219 /* Message text of each song or etc. */
\r
220 do_spell(REALM_MUSIC, SINGING_SONG_ID(p_ptr), SPELL_STOP);
\r
222 SINGING_SONG_EFFECT(p_ptr) = MUSIC_NONE;
\r
223 SINGING_SONG_ID(p_ptr) = 0;
\r
225 /* Recalculate bonuses */
\r
226 p_ptr->update |= (PU_BONUS);
\r
228 /* Redraw status bar */
\r
229 p_ptr->redraw |= (PR_STATUS);
\r
234 * @brief 生命領域魔法の各処理を行う
\r
235 * @param spell 魔法ID
\r
236 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
237 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
239 static cptr do_life_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
241 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
242 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
243 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
244 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
247 int plev = p_ptr->lev;
\r
252 if (name) return _("軽傷の治癒", "Cure Light Wounds");
\r
253 if (desc) return _("怪我と体力を少し回復させる。", "Heals cut and HP a little.");
\r
258 if (info) return info_heal(dice, sides, 0);
\r
262 hp_player(damroll(dice, sides));
\r
263 set_cut(p_ptr->cut - 10);
\r
269 if (name) return _("祝福", "Bless");
\r
270 if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
\r
274 if (info) return info_duration(base, base);
\r
278 set_blessed(randint1(base) + base, FALSE);
\r
284 if (name) return _("軽傷", "Cause Light Wounds");
\r
285 if (desc) return _("1体のモンスターに小ダメージを与える。抵抗されると無効。", "Wounds a monster a little unless resisted.");
\r
287 int dice = 3 + (plev - 1) / 5;
\r
290 if (info) return info_damage(dice, sides, 0);
\r
294 if (!get_aim_dir(&dir)) return NULL;
\r
295 fire_ball_hide(GF_WOUNDS, dir, damroll(dice, sides), 0);
\r
301 if (name) return _("光の召喚", "Call Light");
\r
302 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
\r
305 int sides = plev / 2;
\r
306 int rad = plev / 10 + 1;
\r
308 if (info) return info_damage(dice, sides, 0);
\r
312 lite_area(damroll(dice, sides), rad);
\r
318 if (name) return _("罠 & 隠し扉感知", "Detect Doors & Traps");
\r
319 if (desc) return _("近くの全ての罠と扉と階段を感知する。", "Detects traps, doors, and stairs in your vicinity.");
\r
321 int rad = DETECT_RAD_DEFAULT;
\r
323 if (info) return info_radius(rad);
\r
327 detect_traps(rad, TRUE);
\r
329 detect_stairs(rad);
\r
335 if (name) return _("重傷の治癒", "Cure Medium Wounds");
\r
336 if (desc) return _("怪我と体力を中程度回復させる。", "Heals cut and HP more.");
\r
341 if (info) return info_heal(dice, sides, 0);
\r
345 hp_player(damroll(dice, sides));
\r
346 set_cut((p_ptr->cut / 2) - 20);
\r
352 if (name) return _("解毒", "Cure Poison");
\r
353 if (desc) return _("体内の毒を取り除く。", "Cure poison status.");
\r
363 if (name) return _("空腹充足", "Satisfy Hunger");
\r
364 if (desc) return _("満腹にする。", "Satisfies hunger.");
\r
368 set_food(PY_FOOD_MAX - 1);
\r
374 if (name) return _("解呪", "Remove Curse");
\r
375 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
\r
379 if (remove_curse())
\r
381 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
388 if (name) return _("重傷", "Cause Medium Wounds");
\r
389 if (desc) return _("1体のモンスターに中ダメージを与える。抵抗されると無効。", "Wounds a monster unless resisted.");
\r
391 int sides = 8 + (plev - 5) / 4;
\r
394 if (info) return info_damage(dice, sides, 0);
\r
398 if (!get_aim_dir(&dir)) return NULL;
\r
399 fire_ball_hide(GF_WOUNDS, dir, damroll(dice, sides), 0);
\r
405 if (name) return _("致命傷の治癒", "Cure Critical Wounds");
\r
406 if (desc) return _("体力を大幅に回復させ、負傷と朦朧状態も全快する。", "Heals cut, stun and HP greatly.");
\r
411 if (info) return info_heal(dice, sides, 0);
\r
415 hp_player(damroll(dice, sides));
\r
423 if (name) return _("耐熱耐寒", "Resist Heat and Cold");
\r
424 if (desc) return _("一定時間、火炎と冷気に対する耐性を得る。装備による耐性に累積する。",
\r
425 "Gives resistance to fire and cold. These resistances can be added to which from equipment for more powerful resistances.");
\r
430 if (info) return info_duration(base, base);
\r
434 set_oppose_cold(randint1(base) + base, FALSE);
\r
435 set_oppose_fire(randint1(base) + base, FALSE);
\r
441 if (name) return _("周辺感知", "Sense Surroundings");
\r
442 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
\r
445 int rad = DETECT_RAD_MAP;
\r
447 if (info) return info_radius(rad);
\r
457 if (name) return _("パニック・アンデッド", "Turn Undead");
\r
458 if (desc) return _("視界内のアンデッドを恐怖させる。抵抗されると無効。", "Attempts to scare undead monsters in sight.");
\r
469 if (name) return _("体力回復", "Healing");
\r
470 if (desc) return _("極めて強力な回復呪文で、負傷と朦朧状態も全快する。", "Much powerful healing magic, and heals cut and stun completely.");
\r
475 if (info) return info_heal(0, 0, heal);
\r
487 if (name) return _("結界の紋章", "Glyph of Warding");
\r
488 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。",
\r
489 "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
500 if (name) return _("*解呪*", "Dispel Curse");
\r
501 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
\r
506 if (remove_all_curse())
\r
508 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
515 if (name) return _("鑑識", "Perception");
\r
516 if (desc) return _("アイテムを識別する。", "Identifies an item.");
\r
521 if (!ident_spell(FALSE)) return NULL;
\r
527 if (name) return _("アンデッド退散", "Dispel Undead");
\r
528 if (desc) return _("視界内の全てのアンデッドにダメージを与える。", "Damages all undead monsters in sight.");
\r
532 int sides = plev * 5;
\r
534 if (info) return info_damage(dice, sides, 0);
\r
538 dispel_undead(damroll(dice, sides));
\r
544 if (name) return _("凪の刻", "Day of the Dove");
\r
545 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
\r
548 int power = plev * 2;
\r
550 if (info) return info_power(power);
\r
554 charm_monsters(power);
\r
560 if (name) return _("致命傷", "Cause Critical Wounds");
\r
561 if (desc) return _("1体のモンスターに大ダメージを与える。抵抗されると無効。", "Wounds a monster critically unless resisted.");
\r
564 int dice = 5 + (plev - 5) / 3;
\r
567 if (info) return info_damage(dice, sides, 0);
\r
571 if (!get_aim_dir(&dir)) return NULL;
\r
572 fire_ball_hide(GF_WOUNDS, dir, damroll(dice, sides), 0);
\r
578 if (name) return _("帰還の詔", "Word of Recall");
\r
579 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。", "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
\r
585 if (info) return info_delay(base, sides);
\r
589 if (!word_of_recall()) return NULL;
\r
595 if (name) return _("真実の祭壇", "Alter Reality");
\r
596 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
\r
602 if (info) return info_delay(base, sides);
\r
612 if (name) return _("真・結界", "Warding True");
\r
613 if (desc) return _("自分のいる床と周囲8マスの床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。", "Creates glyphs in all adjacent squares and under you.");
\r
618 if (info) return info_radius(rad);
\r
629 if (name) return _("不毛化", "Sterilization");
\r
630 if (desc) return _("この階の増殖するモンスターが増殖できなくなる。", "Prevents any breeders on current level from breeding.");
\r
635 num_repro += MAX_REPRO;
\r
641 if (name) return _("全感知", "Detection");
\r
642 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。", "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
\r
645 int rad = DETECT_RAD_DEFAULT;
\r
647 if (info) return info_radius(rad);
\r
657 if (name) return _("アンデッド消滅", "Annihilate Undead");
\r
658 if (desc) return _("自分の周囲にいるアンデッドを現在の階から消し去る。抵抗されると無効。",
\r
659 "Eliminates all nearby undead monsters, exhausting you. Powerful or unique monsters may be able to resist.");
\r
662 int power = plev + 50;
\r
664 if (info) return info_power(power);
\r
668 mass_genocide_undead(power, TRUE);
\r
674 if (name) return _("千里眼", "Clairvoyance");
\r
675 if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。", "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");
\r
686 if (name) return _("全復活", "Restoration");
\r
687 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
\r
692 do_res_stat(A_STR);
\r
693 do_res_stat(A_INT);
\r
694 do_res_stat(A_WIS);
\r
695 do_res_stat(A_DEX);
\r
696 do_res_stat(A_CON);
\r
697 do_res_stat(A_CHR);
\r
704 if (name) return _("*体力回復*", "Healing True");
\r
705 if (desc) return _("最強の治癒の魔法で、負傷と朦朧状態も全快する。", "The greatest healing magic. Heals all HP, cut and stun.");
\r
710 if (info) return info_heal(0, 0, heal);
\r
722 if (name) return _("聖なるビジョン", "Holy Vision");
\r
723 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
\r
728 if (!identify_fully(FALSE)) return NULL;
\r
734 if (name) return _("究極の耐性", "Ultimate Resistance");
\r
735 if (desc) return _("一定時間、あらゆる耐性を付け、ACと魔法防御能力を上昇させる。", "Gives ultimate resistance, bonus to AC and speed.");
\r
738 TIME_EFFECT base = (TIME_EFFECT)plev / 2;
\r
740 if (info) return info_duration(base, base);
\r
744 TIME_EFFECT v = randint1(base) + base;
\r
745 set_fast(v, FALSE);
\r
746 set_oppose_acid(v, FALSE);
\r
747 set_oppose_elec(v, FALSE);
\r
748 set_oppose_fire(v, FALSE);
\r
749 set_oppose_cold(v, FALSE);
\r
750 set_oppose_pois(v, FALSE);
\r
751 set_ultimate_res(v, FALSE);
\r
761 * @brief 仙術領域魔法の各処理を行う
\r
762 * @param spell 魔法ID
\r
763 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
764 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
766 static cptr do_sorcery_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
768 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
769 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
770 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
771 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
774 int plev = p_ptr->lev;
\r
779 if (name) return _("モンスター感知", "Detect Monsters");
\r
780 if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
\r
783 int rad = DETECT_RAD_DEFAULT;
\r
785 if (info) return info_radius(rad);
\r
789 detect_monsters_normal(rad);
\r
795 if (name) return _("ショート・テレポート", "Phase Door");
\r
796 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");
\r
799 POSITION range = 10;
\r
801 if (info) return info_range(range);
\r
805 teleport_player(range, 0L);
\r
811 if (name) return _("罠と扉感知", "Detect Doors and Traps");
\r
812 if (desc) return _("近くの全ての扉と罠を感知する。", "Detects traps, doors, and stairs in your vicinity.");
\r
815 int rad = DETECT_RAD_DEFAULT;
\r
817 if (info) return info_radius(rad);
\r
821 detect_traps(rad, TRUE);
\r
823 detect_stairs(rad);
\r
829 if (name) return _("ライト・エリア", "Light Area");
\r
830 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
\r
834 int sides = plev / 2;
\r
835 int rad = plev / 10 + 1;
\r
837 if (info) return info_damage(dice, sides, 0);
\r
841 lite_area(damroll(dice, sides), rad);
\r
847 if (name) return _("パニック・モンスター", "Confuse Monster");
\r
848 if (desc) return _("モンスター1体を混乱させる。抵抗されると無効。", "Attempts to confuse a monster.");
\r
851 int power = (plev * 3) / 2;
\r
853 if (info) return info_power(power);
\r
857 if (!get_aim_dir(&dir)) return NULL;
\r
859 confuse_monster(dir, power);
\r
865 if (name) return _("テレポート", "Teleport");
\r
866 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
\r
869 POSITION range = plev * 5;
\r
871 if (info) return info_range(range);
\r
875 teleport_player(range, 0L);
\r
881 if (name) return _("スリープ・モンスター", "Sleep Monster");
\r
882 if (desc) return _("モンスター1体を眠らせる。抵抗されると無効。", "Attempts to sleep a monster.");
\r
887 if (info) return info_power(power);
\r
891 if (!get_aim_dir(&dir)) return NULL;
\r
893 sleep_monster(dir, plev);
\r
899 if (name) return _("魔力充填", "Recharging");
\r
900 if (desc) return _("杖/魔法棒の充填回数を増やすか、充填中のロッドの充填時間を減らす。", "Recharges staffs, wands or rods.");
\r
903 int power = plev * 4;
\r
905 if (info) return info_power(power);
\r
909 if (!recharge(power)) return NULL;
\r
915 if (name) return _("魔法の地図", "Magic Mapping");
\r
916 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
\r
919 int rad = DETECT_RAD_MAP;
\r
921 if (info) return info_radius(rad);
\r
931 if (name) return _("鑑定", "Identify");
\r
932 if (desc) return _("アイテムを識別する。", "Identifies an item.");
\r
937 if (!ident_spell(FALSE)) return NULL;
\r
943 if (name) return _("スロウ・モンスター", "Slow Monster");
\r
944 if (desc) return _("モンスター1体を減速さる。抵抗されると無効。", "Attempts to slow a monster.");
\r
949 if (info) return info_power(power);
\r
953 if (!get_aim_dir(&dir)) return NULL;
\r
955 slow_monster(dir, plev);
\r
961 if (name) return _("周辺スリープ", "Mass Sleep");
\r
962 if (desc) return _("視界内の全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep all monsters in sight.");
\r
967 if (info) return info_power(power);
\r
971 sleep_monsters(plev);
\r
977 if (name) return _("テレポート・モンスター", "Teleport Away");
\r
978 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
\r
983 if (info) return info_power(power);
\r
987 if (!get_aim_dir(&dir)) return NULL;
\r
989 fire_beam(GF_AWAY_ALL, dir, power);
\r
995 if (name) return _("スピード", "Haste Self");
\r
996 if (desc) return _("一定時間、加速する。", "Hastes you for a while.");
\r
1000 int sides = 20 + plev;
\r
1002 if (info) return info_duration(base, sides);
\r
1006 set_fast(randint1(sides) + base, FALSE);
\r
1012 if (name) return _("真・感知", "Detection True");
\r
1013 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
\r
1014 "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
\r
1017 int rad = DETECT_RAD_DEFAULT;
\r
1019 if (info) return info_radius(rad);
\r
1029 if (name) return _("真・鑑定", "Identify True");
\r
1030 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
\r
1035 if (!identify_fully(FALSE)) return NULL;
\r
1041 if (name) return _("物体と財宝感知", "Detect items and Treasure");
\r
1042 if (desc) return _("近くの全てのアイテムと財宝を感知する。", "Detects all treasures and items in your vicinity.");
\r
1045 int rad = DETECT_RAD_DEFAULT;
\r
1047 if (info) return info_radius(rad);
\r
1051 detect_objects_normal(rad);
\r
1052 detect_treasure(rad);
\r
1053 detect_objects_gold(rad);
\r
1059 if (name) return _("チャーム・モンスター", "Charm Monster");
\r
1060 if (desc) return _("モンスター1体を魅了する。抵抗されると無効。", "Attempts to charm a monster.");
\r
1065 if (info) return info_power(power);
\r
1069 if (!get_aim_dir(&dir)) return NULL;
\r
1071 charm_monster(dir, power);
\r
1077 if (name) return _("精神感知", "Sense Minds");
\r
1078 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
\r
1084 if (info) return info_duration(base, sides);
\r
1088 set_tim_esp(randint1(sides) + base, FALSE);
\r
1094 if (name) return _("街移動", "Teleport to town");
\r
1095 if (desc) return _("街へ移動する。地上にいるときしか使えない。", "Teleport to a town which you choose in a moment. Can only be used outdoors.");
\r
1100 if (!tele_town()) return NULL;
\r
1106 if (name) return _("自己分析", "Self Knowledge");
\r
1107 if (desc) return _("現在の自分の状態を完全に知る。",
\r
1108 "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");
\r
1119 if (name) return _("テレポート・レベル", "Teleport Level");
\r
1120 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");
\r
1125 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
\r
1126 teleport_level(0);
\r
1132 if (name) return _("帰還の呪文", "Word of Recall");
\r
1133 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
\r
1134 "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
\r
1140 if (info) return info_delay(base, sides);
\r
1144 if (!word_of_recall()) return NULL;
\r
1150 if (name) return _("次元の扉", "Dimension Door");
\r
1151 if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleport to given location.");
\r
1154 POSITION range = plev / 2 + 10;
\r
1156 if (info) return info_range(range);
\r
1160 msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));
\r
1161 if (!dimension_door()) return NULL;
\r
1167 if (name) return _("調査", "Probing");
\r
1168 if (desc) return _("モンスターの属性、残り体力、最大体力、スピード、正体を知る。",
\r
1169 "Proves all monsters' alignment, HP, speed and their true character.");
\r
1180 if (name) return _("爆発のルーン", "Explosive Rune");
\r
1181 if (desc) return _("自分のいる床の上に、モンスターが通ると爆発してダメージを与えるルーンを描く。",
\r
1182 "Sets a glyph under you. The glyph will explode when a monster moves on it.");
\r
1189 if (info) return info_damage(dice, sides, base);
\r
1199 if (name) return _("念動力", "Telekinesis");
\r
1200 if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");
\r
1203 int weight = plev * 15;
\r
1205 if (info) return info_weight(weight);
\r
1209 if (!get_aim_dir(&dir)) return NULL;
\r
1211 fetch(dir, weight, FALSE);
\r
1217 if (name) return _("千里眼", "Clairvoyance");
\r
1218 if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。さらに、一定時間テレパシー能力を得る。",
\r
1219 "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");
\r
1225 if (info) return info_duration(base, sides);
\r
1229 chg_virtue(V_KNOWLEDGE, 1);
\r
1230 chg_virtue(V_ENLIGHTEN, 1);
\r
1234 if (!p_ptr->telepathy)
\r
1236 set_tim_esp(randint1(sides) + base, FALSE);
\r
1243 if (name) return _("魅了の視線", "Charm monsters");
\r
1244 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
\r
1247 int power = plev * 2;
\r
1249 if (info) return info_power(power);
\r
1253 charm_monsters(power);
\r
1259 if (name) return _("錬金術", "Alchemy");
\r
1260 if (desc) return _("アイテム1つをお金に変える。", "Turns an item into 1/3 of its value in gold.");
\r
1265 if (!alchemy()) return NULL;
\r
1271 if (name) return _("怪物追放", "Banishment");
\r
1272 if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");
\r
1275 int power = plev * 4;
\r
1277 if (info) return info_power(power);
\r
1281 banish_monsters(power);
\r
1287 if (name) return _("無傷の球", "Globe of Invulnerability");
\r
1288 if (desc) return _("一定時間、ダメージを受けなくなるバリアを張る。切れた瞬間に少しターンを消費するので注意。",
\r
1289 "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
1294 if (info) return info_duration(base, base);
\r
1298 set_invuln(randint1(base) + base, FALSE);
\r
1309 * @brief 自然領域魔法の各処理を行う
\r
1310 * @param spell 魔法ID
\r
1311 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
1312 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
1314 static cptr do_nature_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
1316 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
1317 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
1318 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
1319 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
1321 static const char s_dam[] = _("損傷:", "dam ");
\r
1322 static const char s_rng[] = _("射程", "rng ");
\r
1325 int plev = p_ptr->lev;
\r
1330 if (name) return _("モンスター感知", "Detect Creatures");
\r
1331 if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
\r
1334 int rad = DETECT_RAD_DEFAULT;
\r
1336 if (info) return info_radius(rad);
\r
1340 detect_monsters_normal(rad);
\r
1346 if (name) return _("稲妻", "Lightning");
\r
1347 if (desc) return _("電撃の短いビームを放つ。", "Fires a short beam of lightning.");
\r
1350 int dice = 3 + (plev - 1) / 5;
\r
1352 POSITION range = plev / 6 + 2;
\r
1354 if (info) return format("%s%dd%d %s%d", s_dam, dice, sides, s_rng, range);
\r
1358 project_length = range;
\r
1360 if (!get_aim_dir(&dir)) return NULL;
\r
1362 fire_beam(GF_ELEC, dir, damroll(dice, sides));
\r
1368 if (name) return _("罠と扉感知", "Detect Doors and Traps");
\r
1369 if (desc) return _("近くの全ての罠と扉を感知する。", "Detects traps, doors, and stairs in your vicinity.");
\r
1372 int rad = DETECT_RAD_DEFAULT;
\r
1374 if (info) return info_radius(rad);
\r
1378 detect_traps(rad, TRUE);
\r
1379 detect_doors(rad);
\r
1380 detect_stairs(rad);
\r
1386 if (name) return _("食糧生成", "Produce Food");
\r
1387 if (desc) return _("食料を一つ作り出す。", "Produces a Ration of Food.");
\r
1392 object_type forge, *q_ptr = &forge;
\r
1393 msg_print(_("食料を生成した。", "A food ration is produced."));
\r
1395 /* Create the food ration */
\r
1396 object_prep(q_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION));
\r
1398 /* Drop the object from heaven */
\r
1399 drop_near(q_ptr, -1, p_ptr->y, p_ptr->x);
\r
1405 if (name) return _("日の光", "Daylight");
\r
1406 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
\r
1410 int sides = plev / 2;
\r
1411 int rad = (plev / 10) + 1;
\r
1413 if (info) return info_damage(dice, sides, 0);
\r
1417 lite_area(damroll(dice, sides), rad);
\r
1419 if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)
\r
1421 msg_print(_("日の光があなたの肉体を焦がした!", "The daylight scorches your flesh!"));
\r
1422 take_hit(DAMAGE_NOESCAPE, damroll(2, 2), _("日の光", "daylight"), -1);
\r
1429 if (name) return _("動物習し", "Animal Taming");
\r
1430 if (desc) return _("動物1体を魅了する。抵抗されると無効。", "Attempts to charm an animal.");
\r
1435 if (info) return info_power(power);
\r
1439 if (!get_aim_dir(&dir)) return NULL;
\r
1441 charm_animal(dir, power);
\r
1447 if (name) return _("環境への耐性", "Resist Environment");
\r
1448 if (desc) return _("一定時間、冷気、炎、電撃に対する耐性を得る。装備による耐性に累積する。",
\r
1449 "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");
\r
1454 if (info) return info_duration(base, base);
\r
1458 set_oppose_cold(randint1(base) + base, FALSE);
\r
1459 set_oppose_fire(randint1(base) + base, FALSE);
\r
1460 set_oppose_elec(randint1(base) + base, FALSE);
\r
1466 if (name) return _("傷と毒治療", "Cure Wounds & Poison");
\r
1467 if (desc) return _("怪我を全快させ、毒を体から完全に取り除き、体力を少し回復させる。", "Heals all cut and poison status. Heals HP a little.");
\r
1473 if (info) return info_heal(dice, sides, 0);
\r
1477 hp_player(damroll(dice, sides));
\r
1485 if (name) return _("岩石溶解", "Stone to Mud");
\r
1486 if (desc) return _("壁を溶かして床にする。", "Turns one rock square to mud.");
\r
1493 if (info) return info_damage(dice, sides, base);
\r
1497 if (!get_aim_dir(&dir)) return NULL;
\r
1499 wall_to_mud(dir, 20 + randint1(30));
\r
1505 if (name) return _("アイス・ボルト", "Frost Bolt");
\r
1506 if (desc) return _("冷気のボルトもしくはビームを放つ。", "Fires a bolt or beam of cold.");
\r
1509 int dice = 3 + (plev - 5) / 4;
\r
1512 if (info) return info_damage(dice, sides, 0);
\r
1516 if (!get_aim_dir(&dir)) return NULL;
\r
1517 fire_bolt_or_beam(beam_chance() - 10, GF_COLD, dir, damroll(dice, sides));
\r
1523 if (name) return _("自然の覚醒", "Nature Awareness");
\r
1524 if (desc) return _("周辺の地形を感知し、近くの罠、扉、階段、全てのモンスターを感知する。",
\r
1525 "Maps nearby area. Detects all monsters, traps, doors and stairs.");
\r
1528 int rad1 = DETECT_RAD_MAP;
\r
1529 int rad2 = DETECT_RAD_DEFAULT;
\r
1531 if (info) return info_radius(MAX(rad1, rad2));
\r
1536 detect_traps(rad2, TRUE);
\r
1537 detect_doors(rad2);
\r
1538 detect_stairs(rad2);
\r
1539 detect_monsters_normal(rad2);
\r
1545 if (name) return _("ファイア・ボルト", "Fire Bolt");
\r
1546 if (desc) return _("火炎のボルトもしくはビームを放つ。", "Fires a bolt or beam of fire.");
\r
1549 int dice = 5 + (plev - 5) / 4;
\r
1552 if (info) return info_damage(dice, sides, 0);
\r
1556 if (!get_aim_dir(&dir)) return NULL;
\r
1557 fire_bolt_or_beam(beam_chance() - 10, GF_FIRE, dir, damroll(dice, sides));
\r
1563 if (name) return _("太陽光線", "Ray of Sunlight");
\r
1564 if (desc) return _("光線を放つ。光りを嫌うモンスターに効果がある。", "Fires a beam of light which damages to light-sensitive monsters.");
\r
1570 if (info) return info_damage(dice, sides, 0);
\r
1574 if (!get_aim_dir(&dir)) return NULL;
\r
1575 msg_print(_("太陽光線が現れた。", "A line of sunlight appears."));
\r
1576 lite_line(dir, damroll(6, 8));
\r
1582 if (name) return _("足かせ", "Entangle");
\r
1583 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
\r
1588 if (info) return info_power(power);
\r
1592 slow_monsters(plev);
\r
1598 if (name) return _("動物召喚", "Summon Animal");
\r
1599 if (desc) return _("動物を1体召喚する。", "Summons an animal.");
\r
1604 if (!(summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_ANIMAL_RANGER, (PM_ALLOW_GROUP | PM_FORCE_PET))))
\r
1606 msg_print(_("動物は現れなかった。", "No animals arrive."));
\r
1614 if (name) return _("薬草治療", "Herbal Healing");
\r
1615 if (desc) return _("体力を大幅に回復させ、負傷、朦朧状態、毒から全快する。", "Heals HP greatly. And heals cut, stun and poison completely.");
\r
1620 if (info) return info_heal(0, 0, heal);
\r
1633 if (name) return _("階段生成", "Stair Building");
\r
1634 if (desc) return _("自分のいる位置に階段を作る。", "Creates a stair which goes down or up.");
\r
1645 if (name) return _("肌石化", "Stone Skin");
\r
1646 if (desc) return _("一定時間、ACを上昇させる。", "Gives bonus to AC for a while.");
\r
1652 if (info) return info_duration(base, sides);
\r
1656 set_shield(randint1(sides) + base, FALSE);
\r
1662 if (name) return _("真・耐性", "Resistance True");
\r
1663 if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
\r
1664 "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
1669 if (info) return info_duration(base, base);
\r
1673 set_oppose_acid(randint1(base) + base, FALSE);
\r
1674 set_oppose_elec(randint1(base) + base, FALSE);
\r
1675 set_oppose_fire(randint1(base) + base, FALSE);
\r
1676 set_oppose_cold(randint1(base) + base, FALSE);
\r
1677 set_oppose_pois(randint1(base) + base, FALSE);
\r
1683 if (name) return _("森林創造", "Forest Creation");
\r
1684 if (desc) return _("周囲に木を作り出す。", "Creates trees in all adjacent squares.");
\r
1695 if (name) return _("動物友和", "Animal Friendship");
\r
1696 if (desc) return _("視界内の全ての動物を魅了する。抵抗されると無効。", "Attempts to charm all animals in sight.");
\r
1699 int power = plev * 2;
\r
1701 if (info) return info_power(power);
\r
1705 charm_animals(power);
\r
1711 if (name) return _("試金石", "Stone Tell");
\r
1712 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
\r
1717 if (!identify_fully(FALSE)) return NULL;
\r
1723 if (name) return _("石の壁", "Wall of Stone");
\r
1724 if (desc) return _("自分の周囲に花崗岩の壁を作る。", "Creates granite walls in all adjacent squares.");
\r
1735 if (name) return _("腐食防止", "Protect from Corrosion");
\r
1736 if (desc) return _("アイテムを酸で傷つかないよう加工する。", "Makes an equipment acid-proof.");
\r
1741 if (!rustproof()) return NULL;
\r
1747 if (name) return _("地震", "Earthquake");
\r
1748 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
\r
1749 "Shakes dungeon structure, and results in random swapping of floors and walls.");
\r
1754 if (info) return info_radius(rad);
\r
1758 earthquake(p_ptr->y, p_ptr->x, rad);
\r
1764 if (name) return _("カマイタチ", "Cyclone");
\r
1765 if (desc) return _("全方向に向かって攻撃する。", "Attacks all adjacent monsters.");
\r
1772 monster_type *m_ptr;
\r
1774 for (dir = 0; dir < 8; dir++)
\r
1776 y = p_ptr->y + ddy_ddd[dir];
\r
1777 x = p_ptr->x + ddx_ddd[dir];
\r
1778 c_ptr = &cave[y][x];
\r
1780 /* Get the monster */
\r
1781 m_ptr = &m_list[c_ptr->m_idx];
\r
1783 /* Hack -- attack monsters */
\r
1784 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
\r
1785 py_attack(y, x, 0);
\r
1792 if (name) return _("ブリザード", "Blizzard");
\r
1793 if (desc) return _("巨大な冷気の球を放つ。", "Fires a huge ball of cold.");
\r
1796 HIT_POINT dam = 70 + plev * 3 / 2;
\r
1797 int rad = plev / 12 + 1;
\r
1799 if (info) return info_damage(0, 0, dam);
\r
1803 if (!get_aim_dir(&dir)) return NULL;
\r
1805 fire_ball(GF_COLD, dir, dam, rad);
\r
1811 if (name) return _("稲妻嵐", "Lightning Storm");
\r
1812 if (desc) return _("巨大な電撃の球を放つ。", "Fires a huge electric ball.");
\r
1815 HIT_POINT dam = 90 + plev * 3 / 2;
\r
1816 int rad = plev / 12 + 1;
\r
1818 if (info) return info_damage(0, 0, dam);
\r
1822 if (!get_aim_dir(&dir)) return NULL;
\r
1823 fire_ball(GF_ELEC, dir, dam, rad);
\r
1830 if (name) return _("渦潮", "Whirlpool");
\r
1831 if (desc) return _("巨大な水の球を放つ。", "Fires a huge ball of water.");
\r
1834 HIT_POINT dam = 100 + plev * 3 / 2;
\r
1835 int rad = plev / 12 + 1;
\r
1837 if (info) return info_damage(0, 0, dam);
\r
1841 if (!get_aim_dir(&dir)) return NULL;
\r
1842 fire_ball(GF_WATER, dir, dam, rad);
\r
1848 if (name) return _("陽光召喚", "Call Sunlight");
\r
1849 if (desc) return _("自分を中心とした光の球を発生させる。さらに、その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。",
\r
1850 "Generates ball of light centered on you. Maps and lights whole dungeon level. Knows all objects location.");
\r
1853 HIT_POINT dam = 150;
\r
1856 if (info) return info_damage(0, 0, dam/2);
\r
1860 fire_ball(GF_LITE, 0, dam, rad);
\r
1861 chg_virtue(V_KNOWLEDGE, 1);
\r
1862 chg_virtue(V_ENLIGHTEN, 1);
\r
1865 if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)
\r
1867 msg_print(_("日光があなたの肉体を焦がした!", "The sunlight scorches your flesh!"));
\r
1868 take_hit(DAMAGE_NOESCAPE, 50, _("日光", "sunlight"), -1);
\r
1875 if (name) return _("精霊の刃", "Elemental Branding");
\r
1876 if (desc) return _("武器に炎か冷気の属性をつける。", "Makes current weapon fire or frost branded.");
\r
1881 brand_weapon(randint0(2));
\r
1887 if (name) return _("自然の脅威", "Nature's Wrath");
\r
1888 if (desc) return _("近くの全てのモンスターにダメージを与え、地震を起こし、自分を中心とした分解の球を発生させる。",
\r
1889 "Damages all monsters in sight. Makes quake. Generates disintegration ball centered on you.");
\r
1892 int d_dam = 4 * plev;
\r
1893 int b_dam = (100 + plev) * 2;
\r
1894 int b_rad = 1 + plev / 12;
\r
1895 int q_rad = 20 + plev / 2;
\r
1897 if (info) return format("%s%d+%d", s_dam, d_dam, b_dam/2);
\r
1901 dispel_monsters(d_dam);
\r
1902 earthquake(p_ptr->y, p_ptr->x, q_rad);
\r
1903 project(0, b_rad, p_ptr->y, p_ptr->x, b_dam, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM, -1);
\r
1914 * @brief カオス領域魔法の各処理を行う
\r
1915 * @param spell 魔法ID
\r
1916 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
1917 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
1919 static cptr do_chaos_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
1921 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
1922 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
1923 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
1924 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
1926 static const char s_dam[] = _("損傷:", "dam ");
\r
1927 static const char s_random[] = _("ランダム", "random");
\r
1930 int plev = p_ptr->lev;
\r
1935 if (name) return _("マジック・ミサイル", "Magic Missile");
\r
1936 if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");
\r
1939 int dice = 3 + ((plev - 1) / 5);
\r
1942 if (info) return info_damage(dice, sides, 0);
\r
1946 if (!get_aim_dir(&dir)) return NULL;
\r
1948 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));
\r
1954 if (name) return _("トラップ/ドア破壊", "Trap / Door Destruction");
\r
1955 if (desc) return _("隣接する罠と扉を破壊する。", "Destroys all traps in adjacent squares.");
\r
1960 if (info) return info_radius(rad);
\r
1964 destroy_doors_touch();
\r
1970 if (name) return _("閃光", "Flash of Light");
\r
1971 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
\r
1975 int sides = plev / 2;
\r
1976 int rad = (plev / 10) + 1;
\r
1978 if (info) return info_damage(dice, sides, 0);
\r
1982 lite_area(damroll(dice, sides), rad);
\r
1988 if (name) return _("混乱の手", "Touch of Confusion");
\r
1989 if (desc) return _("相手を混乱させる攻撃をできるようにする。", "Attempts to confuse the next monster that you hit.");
\r
1994 if (!(p_ptr->special_attack & ATTACK_CONFUSE))
\r
1996 msg_print(_("あなたの手は光り始めた。", "Your hands start glowing."));
\r
1997 p_ptr->special_attack |= ATTACK_CONFUSE;
\r
1998 p_ptr->redraw |= (PR_STATUS);
\r
2005 if (name) return _("魔力炸裂", "Mana Burst");
\r
2006 if (desc) return _("魔法の球を放つ。", "Fires a ball of magic.");
\r
2011 int rad = (plev < 30) ? 2 : 3;
\r
2014 if (p_ptr->pclass == CLASS_MAGE ||
\r
2015 p_ptr->pclass == CLASS_HIGH_MAGE ||
\r
2016 p_ptr->pclass == CLASS_SORCERER)
\r
2017 base = plev + plev / 2;
\r
2019 base = plev + plev / 4;
\r
2022 if (info) return info_damage(dice, sides, base);
\r
2026 if (!get_aim_dir(&dir)) return NULL;
\r
2028 fire_ball(GF_MISSILE, dir, damroll(dice, sides) + base, rad);
\r
2031 * Shouldn't actually use GF_MANA, as
\r
2032 * it will destroy all items on the
\r
2040 if (name) return _("ファイア・ボルト", "Fire Bolt");
\r
2041 if (desc) return _("炎のボルトもしくはビームを放つ。", "Fires a bolt or beam of fire.");
\r
2044 int dice = 8 + (plev - 5) / 4;
\r
2047 if (info) return info_damage(dice, sides, 0);
\r
2051 if (!get_aim_dir(&dir)) return NULL;
\r
2053 fire_bolt_or_beam(beam_chance(), GF_FIRE, dir, damroll(dice, sides));
\r
2059 if (name) return _("力の拳", "Fist of Force");
\r
2060 if (desc) return _("ごく小さな分解の球を放つ。", "Fires a tiny ball of disintegration.");
\r
2063 int dice = 8 + ((plev - 5) / 4);
\r
2066 if (info) return info_damage(dice, sides, 0);
\r
2070 if (!get_aim_dir(&dir)) return NULL;
\r
2072 fire_ball(GF_DISINTEGRATE, dir, damroll(dice, sides), 0);
\r
2078 if (name) return _("テレポート", "Teleport Self");
\r
2079 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
\r
2082 POSITION range = plev * 5;
\r
2084 if (info) return info_range(range);
\r
2088 teleport_player(range, 0L);
\r
2094 if (name) return _("ワンダー", "Wonder");
\r
2095 if (desc) return _("モンスターにランダムな効果を与える。", "Fires something with random effects.");
\r
2098 if (info) return s_random;
\r
2103 if (!get_aim_dir(&dir)) return NULL;
\r
2111 if (name) return _("カオス・ボルト", "Chaos Bolt");
\r
2112 if (desc) return _("カオスのボルトもしくはビームを放つ。", "Fires a bolt or ball of chaos.");
\r
2115 int dice = 10 + (plev - 5) / 4;
\r
2118 if (info) return info_damage(dice, sides, 0);
\r
2122 if (!get_aim_dir(&dir)) return NULL;
\r
2124 fire_bolt_or_beam(beam_chance(), GF_CHAOS, dir, damroll(dice, sides));
\r
2130 if (name) return _("ソニック・ブーム", "Sonic Boom");
\r
2131 if (desc) return _("自分を中心とした轟音の球を発生させる。", "Generates a ball of sound centered on you.");
\r
2134 HIT_POINT dam = 60 + plev;
\r
2135 int rad = plev / 10 + 2;
\r
2137 if (info) return info_damage(0, 0, dam/2);
\r
2141 msg_print(_("ドーン!部屋が揺れた!", "BOOM! Shake the room!"));
\r
2142 project(0, rad, p_ptr->y, p_ptr->x, dam, GF_SOUND, PROJECT_KILL | PROJECT_ITEM, -1);
\r
2148 if (name) return _("破滅の矢", "Doom Bolt");
\r
2149 if (desc) return _("純粋な魔力のビームを放つ。", "Fires a beam of pure mana.");
\r
2152 int dice = 11 + (plev - 5) / 4;
\r
2155 if (info) return info_damage(dice, sides, 0);
\r
2159 if (!get_aim_dir(&dir)) return NULL;
\r
2161 fire_beam(GF_MANA, dir, damroll(dice, sides));
\r
2167 if (name) return _("ファイア・ボール", "Fire Ball");
\r
2168 if (desc) return _("炎の球を放つ。", "Fires a ball of fire.");
\r
2171 HIT_POINT dam = plev + 55;
\r
2174 if (info) return info_damage(0, 0, dam);
\r
2178 if (!get_aim_dir(&dir)) return NULL;
\r
2180 fire_ball(GF_FIRE, dir, dam, rad);
\r
2186 if (name) return _("テレポート・アウェイ", "Teleport Other");
\r
2187 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
\r
2192 if (info) return info_power(power);
\r
2196 if (!get_aim_dir(&dir)) return NULL;
\r
2198 fire_beam(GF_AWAY_ALL, dir, power);
\r
2204 if (name) return _("破壊の言葉", "Word of Destruction");
\r
2205 if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroy everything in nearby area.");
\r
2213 destroy_area(p_ptr->y, p_ptr->x, base + randint1(sides), FALSE);
\r
2219 if (name) return _("ログルス発動", "Invoke Logrus");
\r
2220 if (desc) return _("巨大なカオスの球を放つ。", "Fires a huge ball of chaos.");
\r
2223 HIT_POINT dam = plev * 2 + 99;
\r
2224 int rad = plev / 5;
\r
2226 if (info) return info_damage(0, 0, dam);
\r
2230 if (!get_aim_dir(&dir)) return NULL;
\r
2232 fire_ball(GF_CHAOS, dir, dam, rad);
\r
2238 if (name) return _("他者変容", "Polymorph Other");
\r
2239 if (desc) return _("モンスター1体を変身させる。抵抗されると無効。", "Attempts to polymorph a monster.");
\r
2244 if (info) return info_power(power);
\r
2248 if (!get_aim_dir(&dir)) return NULL;
\r
2250 poly_monster(dir, plev);
\r
2256 if (name) return _("連鎖稲妻", "Chain Lightning");
\r
2257 if (desc) return _("全方向に対して電撃のビームを放つ。", "Fires lightning beams in all directions.");
\r
2260 int dice = 5 + plev / 10;
\r
2263 if (info) return info_damage(dice, sides, 0);
\r
2267 for (dir = 0; dir <= 9; dir++)
\r
2268 fire_beam(GF_ELEC, dir, damroll(dice, sides));
\r
2274 if (name) return _("魔力封入", "Arcane Binding");
\r
2275 if (desc) return _("杖/魔法棒の充填回数を増やすか、充填中のロッドの充填時間を減らす。", "Recharges staffs, wands or rods.");
\r
2280 if (info) return info_power(power);
\r
2284 if (!recharge(power)) return NULL;
\r
2290 if (name) return _("原子分解", "Disintegrate");
\r
2291 if (desc) return _("巨大な分解の球を放つ。", "Fires a huge ball of disintegration.");
\r
2294 HIT_POINT dam = plev + 70;
\r
2295 int rad = 3 + plev / 40;
\r
2297 if (info) return info_damage(0, 0, dam);
\r
2301 if (!get_aim_dir(&dir)) return NULL;
\r
2303 fire_ball(GF_DISINTEGRATE, dir, dam, rad);
\r
2309 if (name) return _("現実変容", "Alter Reality");
\r
2310 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
\r
2316 if (info) return info_delay(base, sides);
\r
2326 if (name) return _("マジック・ロケット", "Magic Rocket");
\r
2327 if (desc) return _("ロケットを発射する。", "Fires a magic rocket.");
\r
2330 HIT_POINT dam = 120 + plev * 2;
\r
2333 if (info) return info_damage(0, 0, dam);
\r
2337 if (!get_aim_dir(&dir)) return NULL;
\r
2339 msg_print(_("ロケット発射!", "You launch a rocket!"));
\r
2340 fire_rocket(GF_ROCKET, dir, dam, rad);
\r
2346 if (name) return _("混沌の刃", "Chaos Branding");
\r
2347 if (desc) return _("武器にカオスの属性をつける。", "Makes current weapon a Chaotic weapon.");
\r
2358 if (name) return _("悪魔召喚", "Summon Demon");
\r
2359 if (desc) return _("悪魔を1体召喚する。", "Summons a demon.");
\r
2365 bool pet = !one_in_(3);
\r
2367 if (pet) flg |= PM_FORCE_PET;
\r
2368 else flg |= PM_NO_PET;
\r
2369 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
\r
2371 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_DEMON, flg))
\r
2373 msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));
\r
2376 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
\r
2380 msg_print(_("「卑しき者よ、我は汝の下僕にあらず! お前の魂を頂くぞ!」",
\r
2381 "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));
\r
2389 if (name) return _("重力光線", "Beam of Gravity");
\r
2390 if (desc) return _("重力のビームを放つ。", "Fires a beam of gravity.");
\r
2393 int dice = 9 + (plev - 5) / 4;
\r
2396 if (info) return info_damage(dice, sides, 0);
\r
2400 if (!get_aim_dir(&dir)) return NULL;
\r
2402 fire_beam(GF_GRAVITY, dir, damroll(dice, sides));
\r
2408 if (name) return _("流星群", "Meteor Swarm");
\r
2409 if (desc) return _("自分の周辺に隕石を落とす。", "Makes meteor balls fall down to nearby random locations.");
\r
2412 HIT_POINT dam = plev * 2;
\r
2415 if (info) return info_multi_damage(dam);
\r
2419 cast_meteor(dam, rad);
\r
2425 if (name) return _("焔の一撃", "Flame Strike");
\r
2426 if (desc) return _("自分を中心とした超巨大な炎の球を発生させる。", "Generate a huge ball of fire centered on you.");
\r
2429 HIT_POINT dam = 300 + 3 * plev;
\r
2432 if (info) return info_damage(0, 0, dam/2);
\r
2436 fire_ball(GF_FIRE, 0, dam, rad);
\r
2442 if (name) return _("混沌召来", "Call Chaos");
\r
2443 if (desc) return _("ランダムな属性の球やビームを発生させる。", "Generate random kind of balls or beams.");
\r
2446 if (info) return format("%s150 / 250", s_dam);
\r
2456 if (name) return _("自己変容", "Polymorph Self");
\r
2457 if (desc) return _("自分を変身させようとする。", "Polymorphs yourself.");
\r
2462 if (!get_check(_("変身します。よろしいですか?", "You will polymorph yourself. Are you sure? "))) return NULL;
\r
2469 if (name) return _("魔力の嵐", "Mana Storm");
\r
2470 if (desc) return _("非常に強力で巨大な純粋な魔力の球を放つ。", "Fires an extremely powerful huge ball of pure mana.");
\r
2473 HIT_POINT dam = 300 + plev * 4;
\r
2476 if (info) return info_damage(0, 0, dam);
\r
2480 if (!get_aim_dir(&dir)) return NULL;
\r
2482 fire_ball(GF_MANA, dir, dam, rad);
\r
2488 if (name) return _("ログルスのブレス", "Breathe Logrus");
\r
2489 if (desc) return _("非常に強力なカオスの球を放つ。", "Fires an extremely powerful ball of chaos.");
\r
2492 HIT_POINT dam = p_ptr->chp;
\r
2495 if (info) return info_damage(0, 0, dam);
\r
2499 if (!get_aim_dir(&dir)) return NULL;
\r
2501 fire_ball(GF_CHAOS, dir, dam, rad);
\r
2507 if (name) return _("虚無召来", "Call the Void");
\r
2508 if (desc) return _("自分に周囲に向かって、ロケット、純粋な魔力の球、放射性廃棄物の球を放つ。ただし、壁に隣接して使用すると広範囲を破壊する。",
\r
2509 "Fires rockets, mana balls and nuclear waste balls in all directions each unless you are not adjacent to any walls. Otherwise *destroys* huge area.");
\r
2512 if (info) return format("%s3 * 175", s_dam);
\r
2526 * @brief 暗黒領域魔法の各処理を行う
\r
2527 * @param spell 魔法ID
\r
2528 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
2529 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
2531 static cptr do_death_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
2533 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
2534 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
2535 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
2536 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
2538 static const char s_dam[] = _("損傷:", "dam ");
\r
2539 static const char s_random[] = _("ランダム", "random");
\r
2542 int plev = p_ptr->lev;
\r
2547 if (name) return _("無生命感知", "Detect Unlife");
\r
2548 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
\r
2551 int rad = DETECT_RAD_DEFAULT;
\r
2553 if (info) return info_radius(rad);
\r
2557 detect_monsters_nonliving(rad);
\r
2563 if (name) return _("呪殺弾", "Malediction");
\r
2564 if (desc) return _("ごく小さな邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",
\r
2565 "Fires a tiny ball of evil power which hurts good monsters greatly.");
\r
2568 int dice = 3 + (plev - 1) / 5;
\r
2572 if (info) return info_damage(dice, sides, 0);
\r
2576 if (!get_aim_dir(&dir)) return NULL;
\r
2579 * A radius-0 ball may (1) be aimed at
\r
2580 * objects etc., and will affect them;
\r
2581 * (2) may be aimed at ANY visible
\r
2582 * monster, unlike a 'bolt' which must
\r
2583 * travel to the monster.
\r
2586 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides), rad);
\r
2590 /* Special effect first */
\r
2591 int effect = randint1(1000);
\r
2593 if (effect == 666)
\r
2594 fire_ball_hide(GF_DEATH_RAY, dir, plev * 200, 0);
\r
2595 else if (effect < 500)
\r
2596 fire_ball_hide(GF_TURN_ALL, dir, plev, 0);
\r
2597 else if (effect < 800)
\r
2598 fire_ball_hide(GF_OLD_CONF, dir, plev, 0);
\r
2600 fire_ball_hide(GF_STUN, dir, plev, 0);
\r
2607 if (name) return _("邪悪感知", "Detect Evil");
\r
2608 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
\r
2611 int rad = DETECT_RAD_DEFAULT;
\r
2613 if (info) return info_radius(rad);
\r
2617 detect_monsters_evil(rad);
\r
2623 if (name) return _("悪臭雲", "Stinking Cloud");
\r
2624 if (desc) return _("毒の球を放つ。", "Fires a ball of poison.");
\r
2627 HIT_POINT dam = 10 + plev / 2;
\r
2630 if (info) return info_damage(0, 0, dam);
\r
2634 if (!get_aim_dir(&dir)) return NULL;
\r
2636 fire_ball(GF_POIS, dir, dam, rad);
\r
2642 if (name) return _("黒い眠り", "Black Sleep");
\r
2643 if (desc) return _("1体のモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep a monster.");
\r
2648 if (info) return info_power(power);
\r
2652 if (!get_aim_dir(&dir)) return NULL;
\r
2654 sleep_monster(dir, plev);
\r
2660 if (name) return _("耐毒", "Resist Poison");
\r
2661 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",
\r
2662 "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");
\r
2667 if (info) return info_duration(base, base);
\r
2671 set_oppose_pois(randint1(base) + base, FALSE);
\r
2677 if (name) return _("恐慌", "Horrify");
\r
2678 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
\r
2683 if (info) return info_power(power);
\r
2687 if (!get_aim_dir(&dir)) return NULL;
\r
2689 fear_monster(dir, power);
\r
2690 stun_monster(dir, power);
\r
2696 if (name) return _("アンデッド従属", "Enslave Undead");
\r
2697 if (desc) return _("アンデッド1体を魅了する。抵抗されると無効。", "Attempts to charm an undead monster.");
\r
2702 if (info) return info_power(power);
\r
2706 if (!get_aim_dir(&dir)) return NULL;
\r
2708 control_one_undead(dir, power);
\r
2714 if (name) return _("エントロピーの球", "Orb of Entropy");
\r
2715 if (desc) return _("生命のある者のHPと最大HP双方にダメージを与える効果のある球を放つ。", "Fires a ball which damages to both HP and MaxHP of living monsters.");
\r
2720 int rad = (plev < 30) ? 2 : 3;
\r
2723 if (p_ptr->pclass == CLASS_MAGE ||
\r
2724 p_ptr->pclass == CLASS_HIGH_MAGE ||
\r
2725 p_ptr->pclass == CLASS_SORCERER)
\r
2726 base = plev + plev / 2;
\r
2728 base = plev + plev / 4;
\r
2731 if (info) return info_damage(dice, sides, base);
\r
2735 if (!get_aim_dir(&dir)) return NULL;
\r
2737 fire_ball(GF_HYPODYNAMIA, dir, damroll(dice, sides) + base, rad);
\r
2743 if (name) return _("地獄の矢", "Nether Bolt");
\r
2744 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
\r
2747 int dice = 8 + (plev - 5) / 4;
\r
2750 if (info) return info_damage(dice, sides, 0);
\r
2754 if (!get_aim_dir(&dir)) return NULL;
\r
2756 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
\r
2762 if (name) return _("殺戮雲", "Cloud kill");
\r
2763 if (desc) return _("自分を中心とした毒の球を発生させる。", "Generate a ball of poison centered on you.");
\r
2766 HIT_POINT dam = (30 + plev) * 2;
\r
2767 int rad = plev / 10 + 2;
\r
2769 if (info) return info_damage(0, 0, dam/2);
\r
2773 project(0, rad, p_ptr->y, p_ptr->x, dam, GF_POIS, PROJECT_KILL | PROJECT_ITEM, -1);
\r
2779 if (name) return _("モンスター消滅", "Genocide One");
\r
2780 if (desc) return _("モンスター1体を消し去る。経験値やアイテムは手に入らない。抵抗されると無効。", "Attempts to vanish a monster.");
\r
2783 int power = plev + 50;
\r
2785 if (info) return info_power(power);
\r
2789 if (!get_aim_dir(&dir)) return NULL;
\r
2791 fire_ball_hide(GF_GENOCIDE, dir, power, 0);
\r
2797 if (name) return _("毒の刃", "Poison Branding");
\r
2798 if (desc) return _("武器に毒の属性をつける。", "Makes current weapon poison branded.");
\r
2809 if (name) return _("吸血の矢", "Vampiric Bolt");
\r
2810 if (desc) return _("ボルトによりモンスター1体から生命力を吸いとる。吸いとった生命力によって満腹度が上がる。",
\r
2811 "Absorbs some HP from a monster and gives them to you by bolt. You will also gain nutritional sustenance from this.");
\r
2815 int sides = plev * 2;
\r
2816 int base = plev * 2;
\r
2818 if (info) return info_damage(dice, sides, base);
\r
2822 HIT_POINT dam = base + damroll(dice, sides);
\r
2824 if (!get_aim_dir(&dir)) return NULL;
\r
2826 if (hypodynamic_bolt(dir, dam))
\r
2828 chg_virtue(V_SACRIFICE, -1);
\r
2829 chg_virtue(V_VITALITY, -1);
\r
2834 * Gain nutritional sustenance:
\r
2837 * A Food ration gives 5000
\r
2838 * food points (by contrast)
\r
2839 * Don't ever get more than
\r
2840 * "Full" this way But if we
\r
2841 * ARE Gorged, it won't cure
\r
2844 dam = p_ptr->food + MIN(5000, 100 * dam);
\r
2846 /* Not gorged already */
\r
2847 if (p_ptr->food < PY_FOOD_MAX)
\r
2848 set_food(dam >= PY_FOOD_MAX ? PY_FOOD_MAX - 1 : dam);
\r
2855 if (name) return _("反魂の術", "Animate dead");
\r
2856 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
\r
2861 animate_dead(0, p_ptr->y, p_ptr->x);
\r
2867 if (name) return _("抹殺", "Genocide");
\r
2868 if (desc) return _("指定した文字のモンスターを現在の階から消し去る。抵抗されると無効。",
\r
2869 "Eliminates an entire class of monster, exhausting you. Powerful or unique monsters may resist.");
\r
2872 int power = plev+50;
\r
2874 if (info) return info_power(power);
\r
2878 symbol_genocide(power, TRUE);
\r
2884 if (name) return _("狂戦士化", "Berserk");
\r
2885 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");
\r
2890 if (info) return info_duration(base, base);
\r
2894 set_shero(randint1(base) + base, FALSE);
\r
2902 if (name) return _("悪霊召喚", "Invoke Spirits");
\r
2903 if (desc) return _("ランダムで様々な効果が起こる。", "Causes random effects.");
\r
2906 if (info) return s_random;
\r
2910 if (!get_aim_dir(&dir)) return NULL;
\r
2912 cast_invoke_spirits(dir);
\r
2918 if (name) return _("暗黒の矢", "Dark Bolt");
\r
2919 if (desc) return _("暗黒のボルトもしくはビームを放つ。", "Fires a bolt or beam of darkness.");
\r
2922 int dice = 4 + (plev - 5) / 4;
\r
2925 if (info) return info_damage(dice, sides, 0);
\r
2929 if (!get_aim_dir(&dir)) return NULL;
\r
2931 fire_bolt_or_beam(beam_chance(), GF_DARK, dir, damroll(dice, sides));
\r
2937 if (name) return _("狂乱戦士", "Battle Frenzy");
\r
2938 if (desc) return _("狂戦士化し、恐怖を除去し、加速する。",
\r
2939 "Gives another bonus to hit and HP, immunity to fear for a while. Hastes you. But decreases AC.");
\r
2943 int sp_base = plev / 2;
\r
2944 int sp_sides = 20 + plev / 2;
\r
2946 if (info) return info_duration(b_base, b_base);
\r
2950 set_shero(randint1(25) + 25, FALSE);
\r
2953 set_fast(randint1(sp_sides) + sp_base, FALSE);
\r
2959 if (name) return _("吸血の刃", "Vampiric Branding");
\r
2960 if (desc) return _("武器に吸血の属性をつける。", "Makes current weapon Vampiric.");
\r
2971 if (name) return _("吸血の連矢", "Vampiric Bolts");
\r
2972 if (desc) return _("3連射のボルトによりモンスター1体から生命力を吸いとる。吸いとった生命力によって体力が回復する。",
\r
2973 "Fires 3 bolts. Each of the bolts absorbs some HP from a monster and gives them to you.");
\r
2975 HIT_POINT dam = 100;
\r
2977 if (info) return format("%s3*%d", s_dam, dam);
\r
2983 if (!get_aim_dir(&dir)) return NULL;
\r
2985 chg_virtue(V_SACRIFICE, -1);
\r
2986 chg_virtue(V_VITALITY, -1);
\r
2988 for (i = 0; i < 3; i++)
\r
2990 if (hypodynamic_bolt(dir, dam))
\r
2998 if (name) return _("死の言魂", "Nether Wave");
\r
2999 if (desc) return _("視界内の生命のあるモンスターにダメージを与える。", "Damages all living monsters in sight.");
\r
3002 int sides = plev * 3;
\r
3004 if (info) return info_damage(1, sides, 0);
\r
3008 dispel_living(randint1(sides));
\r
3014 if (name) return _("暗黒の嵐", "Darkness Storm");
\r
3015 if (desc) return _("巨大な暗黒の球を放つ。", "Fires a huge ball of darkness.");
\r
3018 HIT_POINT dam = 100 + plev * 2;
\r
3021 if (info) return info_damage(0, 0, dam);
\r
3025 if (!get_aim_dir(&dir)) return NULL;
\r
3027 fire_ball(GF_DARK, dir, dam, rad);
\r
3033 if (name) return _("死の光線", "Death Ray");
\r
3034 if (desc) return _("死の光線を放つ。", "Fires a beam of death.");
\r
3039 if (!get_aim_dir(&dir)) return NULL;
\r
3041 death_ray(dir, plev);
\r
3047 if (name) return _("死者召喚", "Raise the Dead");
\r
3048 if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");
\r
3054 bool pet = one_in_(3);
\r
3057 type = (plev > 47 ? SUMMON_HI_UNDEAD : SUMMON_UNDEAD);
\r
3059 if (!pet || (pet && (plev > 24) && one_in_(3)))
\r
3060 flg |= PM_ALLOW_GROUP;
\r
3062 if (pet) flg |= PM_FORCE_PET;
\r
3063 else flg |= (PM_ALLOW_UNIQUE | PM_NO_PET);
\r
3065 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, type, flg))
\r
3067 msg_print(_("冷たい風があなたの周りに吹き始めた。それは腐敗臭を運んでいる...",
\r
3068 "Cold winds begin to blow around you, carrying with them the stench of decay..."));
\r
3073 msg_print(_("古えの死せる者共があなたに仕えるため土から甦った!",
\r
3074 "Ancient, long-dead forms arise from the ground to serve you!"));
\r
3078 msg_print(_("死者が甦った。眠りを妨げるあなたを罰するために!",
\r
3079 "'The dead arise... to punish you for disturbing them!'"));
\r
3082 chg_virtue(V_UNLIFE, 1);
\r
3089 if (name) return _("死者の秘伝", "Esoteria");
\r
3090 if (desc) return _("アイテムを1つ識別する。レベルが高いとアイテムの能力を完全に知ることができる。",
\r
3091 "Identifies an item. Or *identifies* an item at higher level.");
\r
3096 if (randint1(50) > plev)
\r
3098 if (!ident_spell(FALSE)) return NULL;
\r
3102 if (!identify_fully(FALSE)) return NULL;
\r
3109 if (name) return _("吸血鬼変化", "Polymorph Vampire");
\r
3110 if (desc) return _("一定時間、吸血鬼に変化する。変化している間は本来の種族の能力を失い、代わりに吸血鬼としての能力を得る。",
\r
3111 "Mimic a vampire for a while. Loses abilities of original race and gets abilities as a vampire.");
\r
3114 int base = 10 + plev / 2;
\r
3116 if (info) return info_duration(base, base);
\r
3120 set_mimic(base + randint1(base), MIMIC_VAMPIRE, FALSE);
\r
3126 if (name) return _("経験値復活", "Restore Life");
\r
3127 if (desc) return _("失った経験値を回復する。", "Restore lost experience.");
\r
3138 if (name) return _("周辺抹殺", "Mass Genocide");
\r
3139 if (desc) return _("自分の周囲にいるモンスターを現在の階から消し去る。抵抗されると無効。",
\r
3140 "Eliminates all nearby monsters, exhausting you. Powerful or unique monsters may be able to resist.");
\r
3143 int power = plev + 50;
\r
3145 if (info) return info_power(power);
\r
3149 mass_genocide(power, TRUE);
\r
3155 if (name) return _("地獄の劫火", "Hellfire");
\r
3156 if (desc) return _("邪悪な力を持つ宝珠を放つ。善良なモンスターには大きなダメージを与える。",
\r
3157 "Fires a powerful ball of evil power. Hurts good monsters greatly.");
\r
3160 HIT_POINT dam = 666;
\r
3163 if (info) return info_damage(0, 0, dam);
\r
3167 if (!get_aim_dir(&dir)) return NULL;
\r
3169 fire_ball(GF_HELL_FIRE, dir, dam, rad);
\r
3170 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("地獄の劫火の呪文を唱えた疲労", "the strain of casting Hellfire"), -1);
\r
3176 if (name) return _("幽体化", "Wraithform");
\r
3177 if (desc) return _("一定時間、壁を通り抜けることができ受けるダメージが軽減される幽体の状態に変身する。",
\r
3178 "Becomes wraith form which gives ability to pass walls and makes all damages half.");
\r
3181 int base = plev / 2;
\r
3183 if (info) return info_duration(base, base);
\r
3187 set_wraith_form(randint1(base) + base, FALSE);
\r
3198 * @brief トランプ領域魔法の各処理を行う
\r
3199 * @param spell 魔法ID
\r
3200 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
3201 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
3203 static cptr do_trump_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
3205 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
3206 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
3207 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
3208 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
3209 bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
\r
3210 static const char s_random[] = _("ランダム", "random");
\r
3213 int plev = p_ptr->lev;
\r
3218 if (name) return _("ショート・テレポート", "Phase Door");
\r
3219 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");
\r
3222 POSITION range = 10;
\r
3224 if (info) return info_range(range);
\r
3228 teleport_player(range, 0L);
\r
3234 if (name) return _("蜘蛛のカード", "Trump Spiders");
\r
3235 if (desc) return _("蜘蛛を召喚する。", "Summons spiders.");
\r
3240 msg_print(_("あなたは蜘蛛のカードに集中する...", "You concentrate on the trump of an spider..."));
\r
3241 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_SPIDER, PM_ALLOW_GROUP))
\r
3245 msg_print(_("召喚された蜘蛛は怒っている!", "The summoned spiders get angry!"));
\r
3253 if (name) return _("シャッフル", "Shuffle");
\r
3254 if (desc) return _("カードの占いをする。", "Causes random effects.");
\r
3257 if (info) return s_random;
\r
3267 if (name) return _("フロア・リセット", "Reset Recall");
\r
3268 if (desc) return _("最深階を変更する。", "Resets the 'deepest' level for recall spell.");
\r
3273 if (!reset_recall()) return NULL;
\r
3279 if (name) return _("テレポート", "Teleport");
\r
3280 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
\r
3283 POSITION range = plev * 4;
\r
3285 if (info) return info_range(range);
\r
3289 teleport_player(range, 0L);
\r
3295 if (name) return _("感知のカード", "Trump Spying");
\r
3296 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
\r
3302 if (info) return info_duration(base, sides);
\r
3306 set_tim_esp(randint1(sides) + base, FALSE);
\r
3312 if (name) return _("テレポート・モンスター", "Teleport Away");
\r
3313 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
\r
3318 if (info) return info_power(power);
\r
3322 if (!get_aim_dir(&dir)) return NULL;
\r
3324 fire_beam(GF_AWAY_ALL, dir, power);
\r
3330 if (name) return _("動物のカード", "Trump Animals");
\r
3331 if (desc) return _("1体の動物を召喚する。", "Summons an animal.");
\r
3336 int type = (!fail ? SUMMON_ANIMAL_RANGER : SUMMON_ANIMAL);
\r
3337 msg_print(_("あなたは動物のカードに集中する...", "You concentrate on the trump of an animal..."));
\r
3338 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, type, 0L))
\r
3342 msg_print(_("召喚された動物は怒っている!", "The summoned animal gets angry!"));
\r
3350 if (name) return _("移動のカード", "Trump Reach");
\r
3351 if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");
\r
3354 int weight = plev * 15;
\r
3356 if (info) return info_weight(weight);
\r
3360 if (!get_aim_dir(&dir)) return NULL;
\r
3362 fetch(dir, weight, FALSE);
\r
3368 if (name) return _("カミカゼのカード", "Trump Kamikaze");
\r
3369 if (desc) return _("複数の爆発するモンスターを召喚する。", "Summons monsters which explode by itself.");
\r
3379 if (!target_set(TARGET_KILL)) return NULL;
\r
3385 /* Summons near player when failed */
\r
3390 if (p_ptr->pclass == CLASS_BEASTMASTER)
\r
3391 type = SUMMON_KAMIKAZE_LIVING;
\r
3393 type = SUMMON_KAMIKAZE;
\r
3395 msg_print(_("あなたはカミカゼのカードに集中する...", "You concentrate on several trumps at once..."));
\r
3396 if (trump_summoning(2 + randint0(plev / 7), !fail, y, x, 0, type, 0L))
\r
3400 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
\r
3408 if (name) return _("幻霊召喚", "Phantasmal Servant");
\r
3409 if (desc) return _("1体の幽霊を召喚する。", "Summons a ghost.");
\r
3412 /* Phantasmal Servant is not summoned as enemy when failed */
\r
3415 int summon_lev = plev * 2 / 3 + randint1(plev / 2);
\r
3417 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, (summon_lev * 3 / 2), SUMMON_PHANTOM, 0L))
\r
3419 msg_print(_("御用でございますか、御主人様?", "'Your wish, master?'"));
\r
3426 if (name) return _("スピード・モンスター", "Haste Monster");
\r
3427 if (desc) return _("モンスター1体を加速させる。", "Hastes a monster.");
\r
3434 /* Temporary enable target_pet option */
\r
3435 bool old_target_pet = target_pet;
\r
3436 target_pet = TRUE;
\r
3438 result = get_aim_dir(&dir);
\r
3440 /* Restore target_pet option */
\r
3441 target_pet = old_target_pet;
\r
3443 if (!result) return NULL;
\r
3445 speed_monster(dir, plev);
\r
3451 if (name) return _("テレポート・レベル", "Teleport Level");
\r
3452 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");
\r
3457 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
\r
3458 teleport_level(0);
\r
3464 if (name) return _("次元の扉", "Dimension Door");
\r
3465 if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleport to given location.");
\r
3468 POSITION range = plev / 2 + 10;
\r
3470 if (info) return info_range(range);
\r
3474 msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));
\r
3475 if (!dimension_door()) return NULL;
\r
3481 if (name) return _("帰還の呪文", "Word of Recall");
\r
3482 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
\r
3483 "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
\r
3489 if (info) return info_delay(base, sides);
\r
3493 if (!word_of_recall()) return NULL;
\r
3499 if (name) return _("怪物追放", "Banish");
\r
3500 if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");
\r
3503 int power = plev * 4;
\r
3505 if (info) return info_power(power);
\r
3509 banish_monsters(power);
\r
3515 if (name) return _("位置交換のカード", "Swap Position");
\r
3516 if (desc) return _("1体のモンスターと位置を交換する。", "Swap positions of you and a monster.");
\r
3523 /* HACK -- No range limit */
\r
3524 project_length = -1;
\r
3526 result = get_aim_dir(&dir);
\r
3528 /* Restore range to default */
\r
3529 project_length = 0;
\r
3531 if (!result) return NULL;
\r
3533 teleport_swap(dir);
\r
3539 if (name) return _("アンデッドのカード", "Trump Undead");
\r
3540 if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");
\r
3545 msg_print(_("あなたはアンデッドのカードに集中する...", "You concentrate on the trump of an undead creature..."));
\r
3546 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_UNDEAD, 0L))
\r
3550 msg_print(_("召喚されたアンデッドは怒っている!", "The summoned undead creature gets angry!"));
\r
3558 if (name) return _("爬虫類のカード", "Trump Reptiles");
\r
3559 if (desc) return _("1体のヒドラを召喚する。", "Summons a hydra.");
\r
3564 msg_print(_("あなたは爬虫類のカードに集中する...", "You concentrate on the trump of a reptile..."));
\r
3565 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HYDRA, 0L))
\r
3569 msg_print(_("召喚された爬虫類は怒っている!", "The summoned reptile gets angry!"));
\r
3577 if (name) return _("モンスターのカード", "Trump Monsters");
\r
3578 if (desc) return _("複数のモンスターを召喚する。", "Summons some monsters.");
\r
3584 msg_print(_("あなたはモンスターのカードに集中する...", "You concentrate on several trumps at once..."));
\r
3585 if (p_ptr->pclass == CLASS_BEASTMASTER)
\r
3586 type = SUMMON_LIVING;
\r
3590 if (trump_summoning((1 + (plev - 15)/ 10), !fail, p_ptr->y, p_ptr->x, 0, type, 0L))
\r
3594 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
\r
3603 if (name) return _("ハウンドのカード", "Trump Hounds");
\r
3604 if (desc) return _("1グループのハウンドを召喚する。", "Summons a group of hounds.");
\r
3609 msg_print(_("あなたはハウンドのカードに集中する...", "You concentrate on the trump of a hound..."));
\r
3610 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HOUND, PM_ALLOW_GROUP))
\r
3614 msg_print(_("召喚されたハウンドは怒っている!", "The summoned hounds get angry!"));
\r
3622 if (name) return _("トランプの刃", "Trump Branding");
\r
3623 if (desc) return _("武器にトランプの属性をつける。", "Makes current weapon a Trump weapon.");
\r
3634 if (name) return _("人間トランプ", "Living Trump");
\r
3635 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",
\r
3636 "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");
\r
3644 /* Teleport control */
\r
3647 /* Random teleportation (uncontrolled) */
\r
3650 /* Gain the mutation */
\r
3651 if (gain_random_mutation(mutation))
\r
3653 msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));
\r
3660 if (name) return _("サイバーデーモンのカード", "Trump Cyberdemon");
\r
3661 if (desc) return _("1体のサイバーデーモンを召喚する。", "Summons a cyber demon.");
\r
3666 msg_print(_("あなたはサイバーデーモンのカードに集中する...", "You concentrate on the trump of a Cyberdemon..."));
\r
3667 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_CYBER, 0L))
\r
3671 msg_print(_("召喚されたサイバーデーモンは怒っている!", "The summoned Cyberdemon gets angry!"));
\r
3679 if (name) return _("予見のカード", "Trump Divination");
\r
3680 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
\r
3681 "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
\r
3684 int rad = DETECT_RAD_DEFAULT;
\r
3686 if (info) return info_radius(rad);
\r
3696 if (name) return _("知識のカード", "Trump Lore");
\r
3697 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
\r
3702 if (!identify_fully(FALSE)) return NULL;
\r
3708 if (name) return _("回復モンスター", "Heal Monster");
\r
3709 if (desc) return _("モンスター1体の体力を回復させる。", "Heal a monster.");
\r
3712 int heal = plev * 10 + 200;
\r
3714 if (info) return info_heal(0, 0, heal);
\r
3720 /* Temporary enable target_pet option */
\r
3721 bool old_target_pet = target_pet;
\r
3722 target_pet = TRUE;
\r
3724 result = get_aim_dir(&dir);
\r
3726 /* Restore target_pet option */
\r
3727 target_pet = old_target_pet;
\r
3729 if (!result) return NULL;
\r
3731 heal_monster(dir, heal);
\r
3737 if (name) return _("ドラゴンのカード", "Trump Dragon");
\r
3738 if (desc) return _("1体のドラゴンを召喚する。", "Summons a dragon.");
\r
3743 msg_print(_("あなたはドラゴンのカードに集中する...", "You concentrate on the trump of a dragon..."));
\r
3744 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_DRAGON, 0L))
\r
3748 msg_print(_("召喚されたドラゴンは怒っている!", "The summoned dragon gets angry!"));
\r
3756 if (name) return _("隕石のカード", "Trump Meteor");
\r
3757 if (desc) return _("自分の周辺に隕石を落とす。", "Makes meteor balls fall down to nearby random locations.");
\r
3760 HIT_POINT dam = plev * 2;
\r
3763 if (info) return info_multi_damage(dam);
\r
3767 cast_meteor(dam, rad);
\r
3773 if (name) return _("デーモンのカード", "Trump Demon");
\r
3774 if (desc) return _("1体の悪魔を召喚する。", "Summons a demon.");
\r
3779 msg_print(_("あなたはデーモンのカードに集中する...", "You concentrate on the trump of a demon..."));
\r
3780 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_DEMON, 0L))
\r
3784 msg_print(_("召喚されたデーモンは怒っている!", "The summoned demon gets angry!"));
\r
3792 if (name) return _("地獄のカード", "Trump Greater Undead");
\r
3793 if (desc) return _("1体の上級アンデッドを召喚する。", "Summons a greater undead.");
\r
3798 msg_print(_("あなたは強力なアンデッドのカードに集中する...", "You concentrate on the trump of a greater undead being..."));
\r
3799 /* May allow unique depend on level and dice roll */
\r
3800 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HI_UNDEAD, PM_ALLOW_UNIQUE))
\r
3804 msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead creature gets angry!"));
\r
3812 if (name) return _("古代ドラゴンのカード", "Trump Ancient Dragon");
\r
3813 if (desc) return _("1体の古代ドラゴンを召喚する。", "Summons an ancient dragon.");
\r
3820 if (p_ptr->pclass == CLASS_BEASTMASTER)
\r
3821 type = SUMMON_HI_DRAGON_LIVING;
\r
3823 type = SUMMON_HI_DRAGON;
\r
3825 msg_print(_("あなたは古代ドラゴンのカードに集中する...", "You concentrate on the trump of an ancient dragon..."));
\r
3826 /* May allow unique depend on level and dice roll */
\r
3827 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, type, PM_ALLOW_UNIQUE))
\r
3831 msg_print(_("召喚された古代ドラゴンは怒っている!", "The summoned ancient dragon gets angry!"));
\r
3844 * @brief 秘術領域魔法の各処理を行う
\r
3845 * @param spell 魔法ID
\r
3846 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
3847 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
3849 static cptr do_arcane_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
3851 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
3852 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
3853 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
3854 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
3857 int plev = p_ptr->lev;
\r
3862 if (name) return _("電撃", "Zap");
\r
3863 if (desc) return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");
\r
3866 int dice = 3 + (plev - 1) / 5;
\r
3869 if (info) return info_damage(dice, sides, 0);
\r
3873 if (!get_aim_dir(&dir)) return NULL;
\r
3875 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));
\r
3881 if (name) return _("魔法の施錠", "Wizard Lock");
\r
3882 if (desc) return _("扉に鍵をかける。", "Locks a door.");
\r
3887 if (!get_aim_dir(&dir)) return NULL;
\r
3895 if (name) return _("透明体感知", "Detect Invisibility");
\r
3896 if (desc) return _("近くの透明なモンスターを感知する。", "Detects all invisible monsters in your vicinity.");
\r
3899 int rad = DETECT_RAD_DEFAULT;
\r
3901 if (info) return info_radius(rad);
\r
3905 detect_monsters_invis(rad);
\r
3911 if (name) return _("モンスター感知", "Detect Monsters");
\r
3912 if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
\r
3915 int rad = DETECT_RAD_DEFAULT;
\r
3917 if (info) return info_radius(rad);
\r
3921 detect_monsters_normal(rad);
\r
3927 if (name) return _("ショート・テレポート", "Blink");
\r
3928 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");
\r
3931 POSITION range = 10;
\r
3933 if (info) return info_range(range);
\r
3937 teleport_player(range, 0L);
\r
3943 if (name) return _("ライト・エリア", "Light Area");
\r
3944 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
\r
3948 int sides = plev / 2;
\r
3949 int rad = plev / 10 + 1;
\r
3951 if (info) return info_damage(dice, sides, 0);
\r
3955 lite_area(damroll(dice, sides), rad);
\r
3961 if (name) return _("罠と扉 破壊", "Trap & Door Destruction");
\r
3962 if (desc) return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");
\r
3967 if (!get_aim_dir(&dir)) return NULL;
\r
3969 destroy_door(dir);
\r
3975 if (name) return _("軽傷の治癒", "Cure Light Wounds");
\r
3976 if (desc) return _("怪我と体力を少し回復させる。", "Heals cut and HP a little.");
\r
3982 if (info) return info_heal(dice, sides, 0);
\r
3986 hp_player(damroll(dice, sides));
\r
3987 set_cut(p_ptr->cut - 10);
\r
3993 if (name) return _("罠と扉 感知", "Detect Doors & Traps");
\r
3994 if (desc) return _("近くの全ての罠と扉と階段を感知する。", "Detects traps, doors, and stairs in your vicinity.");
\r
3997 int rad = DETECT_RAD_DEFAULT;
\r
3999 if (info) return info_radius(rad);
\r
4003 detect_traps(rad, TRUE);
\r
4004 detect_doors(rad);
\r
4005 detect_stairs(rad);
\r
4011 if (name) return _("燃素", "Phlogiston");
\r
4012 if (desc) return _("光源に燃料を補給する。", "Adds more turns of light to a lantern or torch.");
\r
4023 if (name) return _("財宝感知", "Detect Treasure");
\r
4024 if (desc) return _("近くの財宝を感知する。", "Detects all treasures in your vicinity.");
\r
4027 int rad = DETECT_RAD_DEFAULT;
\r
4029 if (info) return info_radius(rad);
\r
4033 detect_treasure(rad);
\r
4034 detect_objects_gold(rad);
\r
4040 if (name) return _("魔法 感知", "Detect Enchantment");
\r
4041 if (desc) return _("近くの魔法がかかったアイテムを感知する。", "Detects all magical items in your vicinity.");
\r
4044 int rad = DETECT_RAD_DEFAULT;
\r
4046 if (info) return info_radius(rad);
\r
4050 detect_objects_magic(rad);
\r
4056 if (name) return _("アイテム感知", "Detect Objects");
\r
4057 if (desc) return _("近くの全てのアイテムを感知する。", "Detects all items in your vicinity.");
\r
4060 int rad = DETECT_RAD_DEFAULT;
\r
4062 if (info) return info_radius(rad);
\r
4066 detect_objects_normal(rad);
\r
4072 if (name) return _("解毒", "Cure Poison");
\r
4073 if (desc) return _("毒を体内から完全に取り除く。", "Cures poison status.");
\r
4084 if (name) return _("耐冷", "Resist Cold");
\r
4085 if (desc) return _("一定時間、冷気への耐性を得る。装備による耐性に累積する。", "Gives resistance to cold. This resistance can be added to which from equipment for more powerful resistance.");
\r
4090 if (info) return info_duration(base, base);
\r
4094 set_oppose_cold(randint1(base) + base, FALSE);
\r
4100 if (name) return _("耐火", "Resist Fire");
\r
4101 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
\r
4102 "Gives resistance to fire. This resistance can be added to which from equipment for more powerful resistance.");
\r
4107 if (info) return info_duration(base, base);
\r
4111 set_oppose_fire(randint1(base) + base, FALSE);
\r
4117 if (name) return _("耐電", "Resist Lightning");
\r
4118 if (desc) return _("一定時間、電撃への耐性を得る。装備による耐性に累積する。",
\r
4119 "Gives resistance to electricity. This resistance can be added to which from equipment for more powerful resistance.");
\r
4124 if (info) return info_duration(base, base);
\r
4128 set_oppose_elec(randint1(base) + base, FALSE);
\r
4134 if (name) return _("耐酸", "Resist Acid");
\r
4135 if (desc) return _("一定時間、酸への耐性を得る。装備による耐性に累積する。",
\r
4136 "Gives resistance to acid. This resistance can be added to which from equipment for more powerful resistance.");
\r
4141 if (info) return info_duration(base, base);
\r
4145 set_oppose_acid(randint1(base) + base, FALSE);
\r
4151 if (name) return _("重傷の治癒", "Cure Medium Wounds");
\r
4152 if (desc) return _("怪我と体力を中程度回復させる。", "Heals cut and HP more.");
\r
4158 if (info) return info_heal(dice, sides, 0);
\r
4162 hp_player(damroll(dice, sides));
\r
4163 set_cut((p_ptr->cut / 2) - 50);
\r
4169 if (name) return _("テレポート", "Teleport");
\r
4170 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
\r
4173 POSITION range = plev * 5;
\r
4175 if (info) return info_range(range);
\r
4179 teleport_player(range, 0L);
\r
4185 if (name) return _("鑑定", "Identify");
\r
4186 if (desc) return _("アイテムを識別する。", "Identifies an item.");
\r
4191 if (!ident_spell(FALSE)) return NULL;
\r
4197 if (name) return _("岩石溶解", "Stone to Mud");
\r
4198 if (desc) return _("壁を溶かして床にする。", "Turns one rock square to mud.");
\r
4205 if (info) return info_damage(dice, sides, base);
\r
4209 if (!get_aim_dir(&dir)) return NULL;
\r
4211 wall_to_mud(dir, 20 + randint1(30));
\r
4217 if (name) return _("閃光", "Ray of Light");
\r
4218 if (desc) return _("光線を放つ。光りを嫌うモンスターに効果がある。", "Fires a beam of light which damages to light-sensitive monsters.");
\r
4224 if (info) return info_damage(dice, sides, 0);
\r
4228 if (!get_aim_dir(&dir)) return NULL;
\r
4230 msg_print(_("光線が放たれた。", "A line of light appears."));
\r
4231 lite_line(dir, damroll(6, 8));
\r
4237 if (name) return _("空腹充足", "Satisfy Hunger");
\r
4238 if (desc) return _("満腹にする。", "Satisfies hunger.");
\r
4243 set_food(PY_FOOD_MAX - 1);
\r
4249 if (name) return _("透明視認", "See Invisible");
\r
4250 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
\r
4255 if (info) return info_duration(base, base);
\r
4259 set_tim_invis(randint1(base) + base, FALSE);
\r
4265 if (name) return _("エレメンタル召喚", "Conjure Elemental");
\r
4266 if (desc) return _("1体のエレメンタルを召喚する。", "Summons an elemental.");
\r
4271 if (!summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_ELEMENTAL, (PM_ALLOW_GROUP | PM_FORCE_PET)))
\r
4273 msg_print(_("エレメンタルは現れなかった。", "No Elementals arrive."));
\r
4280 if (name) return _("テレポート・レベル", "Teleport Level");
\r
4281 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");
\r
4286 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
\r
4287 teleport_level(0);
\r
4293 if (name) return _("テレポート・モンスター", "Teleport Away");
\r
4294 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
\r
4299 if (info) return info_power(power);
\r
4303 if (!get_aim_dir(&dir)) return NULL;
\r
4305 fire_beam(GF_AWAY_ALL, dir, power);
\r
4311 if (name) return _("元素の球", "Elemental Ball");
\r
4312 if (desc) return _("炎、電撃、冷気、酸のどれかの球を放つ。", "Fires a ball of some elements.");
\r
4315 HIT_POINT dam = 75 + plev;
\r
4318 if (info) return info_damage(0, 0, dam);
\r
4324 if (!get_aim_dir(&dir)) return NULL;
\r
4326 switch (randint1(4))
\r
4328 case 1: type = GF_FIRE;break;
\r
4329 case 2: type = GF_ELEC;break;
\r
4330 case 3: type = GF_COLD;break;
\r
4331 default: type = GF_ACID;break;
\r
4334 fire_ball(type, dir, dam, rad);
\r
4340 if (name) return _("全感知", "Detection");
\r
4341 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
\r
4342 "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
\r
4345 int rad = DETECT_RAD_DEFAULT;
\r
4347 if (info) return info_radius(rad);
\r
4357 if (name) return _("帰還の呪文", "Word of Recall");
\r
4358 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
\r
4359 "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
\r
4365 if (info) return info_delay(base, sides);
\r
4369 if (!word_of_recall()) return NULL;
\r
4375 if (name) return _("千里眼", "Clairvoyance");
\r
4376 if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。さらに、一定時間テレパシー能力を得る。",
\r
4377 "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");
\r
4383 if (info) return info_duration(base, sides);
\r
4387 chg_virtue(V_KNOWLEDGE, 1);
\r
4388 chg_virtue(V_ENLIGHTEN, 1);
\r
4392 if (!p_ptr->telepathy)
\r
4394 set_tim_esp(randint1(sides) + base, FALSE);
\r
4405 * @brief 匠領域魔法の各処理を行う
\r
4406 * @param spell 魔法ID
\r
4407 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
4408 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
4410 static cptr do_craft_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
4412 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
4413 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
4414 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
4415 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
4417 int plev = p_ptr->lev;
\r
4422 if (name) return _("赤外線視力", "Infravision");
\r
4423 if (desc) return _("一定時間、赤外線視力が増強される。", "Gives infravision for a while.");
\r
4428 if (info) return info_duration(base, base);
\r
4432 set_tim_infra(base + randint1(base), FALSE);
\r
4438 if (name) return _("回復力強化", "Regeneration");
\r
4439 if (desc) return _("一定時間、回復力が増強される。", "Gives regeneration ability for a while.");
\r
4444 if (info) return info_duration(base, base);
\r
4448 set_tim_regen(base + randint1(base), FALSE);
\r
4454 if (name) return _("空腹充足", "Satisfy Hunger");
\r
4455 if (desc) return _("満腹になる。", "Satisfies hunger.");
\r
4460 set_food(PY_FOOD_MAX - 1);
\r
4466 if (name) return _("耐冷気", "Resist Cold");
\r
4467 if (desc) return _("一定時間、冷気への耐性を得る。装備による耐性に累積する。",
\r
4468 "Gives resistance to cold. This resistance can be added to which from equipment for more powerful resistance.");
\r
4473 if (info) return info_duration(base, base);
\r
4477 set_oppose_cold(randint1(base) + base, FALSE);
\r
4483 if (name) return _("耐火炎", "Resist Fire");
\r
4484 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
\r
4485 "Gives resistance to fire. This resistance can be added to which from equipment for more powerful resistance.");
\r
4490 if (info) return info_duration(base, base);
\r
4494 set_oppose_fire(randint1(base) + base, FALSE);
\r
4500 if (name) return _("士気高揚", "Heroism");
\r
4501 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
4506 if (info) return info_duration(base, base);
\r
4510 set_hero(randint1(base) + base, FALSE);
\r
4518 if (name) return _("耐電撃", "Resist Lightning");
\r
4519 if (desc) return _("一定時間、電撃への耐性を得る。装備による耐性に累積する。",
\r
4520 "Gives resistance to electricity. This resistance can be added to which from equipment for more powerful resistance.");
\r
4525 if (info) return info_duration(base, base);
\r
4529 set_oppose_elec(randint1(base) + base, FALSE);
\r
4535 if (name) return _("耐酸", "Resist Acid");
\r
4536 if (desc) return _("一定時間、酸への耐性を得る。装備による耐性に累積する。",
\r
4537 "Gives resistance to acid. This resistance can be added to which from equipment for more powerful resistance.");
\r
4542 if (info) return info_duration(base, base);
\r
4546 set_oppose_acid(randint1(base) + base, FALSE);
\r
4552 if (name) return _("透明視認", "See Invisibility");
\r
4553 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
\r
4558 if (info) return info_duration(base, base);
\r
4562 set_tim_invis(randint1(base) + base, FALSE);
\r
4568 if (name) return _("解呪", "Remove Curse");
\r
4569 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
\r
4574 if (remove_curse())
\r
4576 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
4583 if (name) return _("耐毒", "Resist Poison");
\r
4584 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",
\r
4585 "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");
\r
4590 if (info) return info_duration(base, base);
\r
4594 set_oppose_pois(randint1(base) + base, FALSE);
\r
4600 if (name) return _("狂戦士化", "Berserk");
\r
4601 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");
\r
4606 if (info) return info_duration(base, base);
\r
4610 set_shero(randint1(base) + base, FALSE);
\r
4618 if (name) return _("自己分析", "Self Knowledge");
\r
4619 if (desc) return _("現在の自分の状態を完全に知る。",
\r
4620 "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");
\r
4631 if (name) return _("対邪悪結界", "Protection from Evil");
\r
4632 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");
\r
4635 int base = 3 * plev;
\r
4638 if (info) return info_duration(base, sides);
\r
4642 set_protevil(randint1(sides) + base, FALSE);
\r
4648 if (name) return _("癒し", "Cure");
\r
4649 if (desc) return _("毒、朦朧状態、負傷を全快させ、幻覚を直す。", "Heals poison, stun, cut and hallucination completely.");
\r
4663 if (name) return _("魔法剣", "Mana Branding");
\r
4664 if (desc) return _("一定時間、武器に冷気、炎、電撃、酸、毒のいずれかの属性をつける。武器を持たないと使えない。",
\r
4665 "Makes current weapon some elemental branded. You must wield weapons.");
\r
4668 int base = plev / 2;
\r
4670 if (info) return info_duration(base, base);
\r
4674 if (!choose_ele_attack()) return NULL;
\r
4680 if (name) return _("テレパシー", "Telepathy");
\r
4681 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
\r
4687 if (info) return info_duration(base, sides);
\r
4691 set_tim_esp(randint1(sides) + base, FALSE);
\r
4697 if (name) return _("肌石化", "Stone Skin");
\r
4698 if (desc) return _("一定時間、ACを上昇させる。", "Gives bonus to AC for a while.");
\r
4704 if (info) return info_duration(base, sides);
\r
4708 set_shield(randint1(sides) + base, FALSE);
\r
4714 if (name) return _("全耐性", "Resistance");
\r
4715 if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
\r
4716 "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
4721 if (info) return info_duration(base, base);
\r
4725 set_oppose_acid(randint1(base) + base, FALSE);
\r
4726 set_oppose_elec(randint1(base) + base, FALSE);
\r
4727 set_oppose_fire(randint1(base) + base, FALSE);
\r
4728 set_oppose_cold(randint1(base) + base, FALSE);
\r
4729 set_oppose_pois(randint1(base) + base, FALSE);
\r
4735 if (name) return _("スピード", "Haste Self");
\r
4736 if (desc) return _("一定時間、加速する。", "Hastes you for a while.");
\r
4740 int sides = 20 + plev;
\r
4742 if (info) return info_duration(base, sides);
\r
4746 set_fast(randint1(sides) + base, FALSE);
\r
4752 if (name) return _("壁抜け", "Walk through Wall");
\r
4753 if (desc) return _("一定時間、半物質化し壁を通り抜けられるようになる。", "Gives ability to pass walls for a while.");
\r
4756 int base = plev / 2;
\r
4758 if (info) return info_duration(base, base);
\r
4762 set_kabenuke(randint1(base) + base, FALSE);
\r
4768 if (name) return _("盾磨き", "Polish Shield");
\r
4769 if (desc) return _("盾に反射の属性をつける。", "Makes a shield a shield of reflection.");
\r
4780 if (name) return _("ゴーレム製造", "Create Golem");
\r
4781 if (desc) return _("1体のゴーレムを製造する。", "Creates a golem.");
\r
4786 if (summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_GOLEM, PM_FORCE_PET))
\r
4788 msg_print(_("ゴーレムを作った。", "You make a golem."));
\r
4792 msg_print(_("うまくゴーレムを作れなかった。", "No Golems arrive."));
\r
4799 if (name) return _("魔法の鎧", "Magical armor");
\r
4800 if (desc) return _("一定時間、魔法防御力とACが上がり、混乱と盲目の耐性、反射能力、麻痺知らず、浮遊を得る。",
\r
4801 "Gives resistance to magic, bonus to AC, resistance to confusion, blindness, reflection, free action and levitation for a while.");
\r
4806 if (info) return info_duration(base, base);
\r
4810 set_magicdef(randint1(base) + base, FALSE);
\r
4816 if (name) return _("装備無力化", "Remove Enchantment");
\r
4817 if (desc) return _("武器・防具にかけられたあらゆる魔力を完全に解除する。", "Removes all magics completely from any weapon or armor.");
\r
4822 if (!mundane_spell(TRUE)) return NULL;
\r
4828 if (name) return _("呪い粉砕", "Remove All Curse");
\r
4829 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
\r
4834 if (remove_all_curse())
\r
4836 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
4843 if (name) return _("完全なる知識", "Knowledge True");
\r
4844 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
\r
4849 if (!identify_fully(FALSE)) return NULL;
\r
4855 if (name) return _("武器強化", "Enchant Weapon");
\r
4856 if (desc) return _("武器の命中率修正とダメージ修正を強化する。", "Attempts to increase +to-hit, +to-dam of a weapon.");
\r
4861 if (!enchant_spell(randint0(4) + 1, randint0(4) + 1, 0)) return NULL;
\r
4867 if (name) return _("防具強化", "Enchant Armor");
\r
4868 if (desc) return _("鎧の防御修正を強化する。", "Attempts to increase +AC of an armor.");
\r
4873 if (!enchant_spell(0, 0, randint0(3) + 2)) return NULL;
\r
4879 if (name) return _("武器属性付与", "Brand Weapon");
\r
4880 if (desc) return _("武器にランダムに属性をつける。", "Makes current weapon a random ego weapon.");
\r
4885 brand_weapon(randint0(18));
\r
4891 if (name) return _("人間トランプ", "Living Trump");
\r
4892 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",
\r
4893 "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");
\r
4901 /* Teleport control */
\r
4904 /* Random teleportation (uncontrolled) */
\r
4907 /* Gain the mutation */
\r
4908 if (gain_random_mutation(mutation))
\r
4910 msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));
\r
4917 if (name) return _("属性への免疫", "Immunity");
\r
4918 if (desc) return _("一定時間、冷気、炎、電撃、酸のいずれかに対する免疫を得る。",
\r
4919 "Gives an immunity to fire, cold, electricity or acid for a while.");
\r
4924 if (info) return info_duration(base, base);
\r
4928 if (!choose_ele_immune(base + randint1(base))) return NULL;
\r
4938 * @brief 悪魔領域魔法の各処理を行う
\r
4939 * @param spell 魔法ID
\r
4940 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
4941 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
4943 static cptr do_daemon_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
4945 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
4946 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
4947 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
4948 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
4949 static const char s_dam[] = _("損傷:", "dam ");
\r
4952 int plev = p_ptr->lev;
\r
4957 if (name) return _("マジック・ミサイル", "Magic Missile");
\r
4958 if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");
\r
4961 int dice = 3 + (plev - 1) / 5;
\r
4964 if (info) return info_damage(dice, sides, 0);
\r
4968 if (!get_aim_dir(&dir)) return NULL;
\r
4970 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));
\r
4976 if (name) return _("無生命感知", "Detect Unlife");
\r
4977 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
\r
4980 int rad = DETECT_RAD_DEFAULT;
\r
4982 if (info) return info_radius(rad);
\r
4986 detect_monsters_nonliving(rad);
\r
4992 if (name) return _("邪なる祝福", "Evil Bless");
\r
4993 if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
\r
4998 if (info) return info_duration(base, base);
\r
5002 set_blessed(randint1(base) + base, FALSE);
\r
5008 if (name) return _("耐火炎", "Resist Fire");
\r
5009 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
\r
5010 "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");
\r
5015 if (info) return info_duration(base, base);
\r
5019 set_oppose_fire(randint1(base) + base, FALSE);
\r
5025 if (name) return _("恐慌", "Horrify");
\r
5026 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
\r
5031 if (info) return info_power(power);
\r
5035 if (!get_aim_dir(&dir)) return NULL;
\r
5037 fear_monster(dir, power);
\r
5038 stun_monster(dir, power);
\r
5044 if (name) return _("地獄の矢", "Nether Bolt");
\r
5045 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
\r
5048 int dice = 6 + (plev - 5) / 4;
\r
5051 if (info) return info_damage(dice, sides, 0);
\r
5055 if (!get_aim_dir(&dir)) return NULL;
\r
5057 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
\r
5063 if (name) return _("古代の死霊召喚", "Summon Manes");
\r
5064 if (desc) return _("古代の死霊を召喚する。", "Summons a manes.");
\r
5069 if (!summon_specific(-1, p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET)))
\r
5071 msg_print(_("古代の死霊は現れなかった。", "No Manes arrive."));
\r
5078 if (name) return _("地獄の焔", "Hellish Flame");
\r
5079 if (desc) return _("邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",
\r
5080 "Fires a ball of evil power. Hurts good monsters greatly.");
\r
5085 int rad = (plev < 30) ? 2 : 3;
\r
5088 if (p_ptr->pclass == CLASS_MAGE ||
\r
5089 p_ptr->pclass == CLASS_HIGH_MAGE ||
\r
5090 p_ptr->pclass == CLASS_SORCERER)
\r
5091 base = plev + plev / 2;
\r
5093 base = plev + plev / 4;
\r
5096 if (info) return info_damage(dice, sides, base);
\r
5100 if (!get_aim_dir(&dir)) return NULL;
\r
5102 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides) + base, rad);
\r
5108 if (name) return _("デーモン支配", "Dominate Demon");
\r
5109 if (desc) return _("悪魔1体を魅了する。抵抗されると無効", "Attempts to charm a demon.");
\r
5114 if (info) return info_power(power);
\r
5118 if (!get_aim_dir(&dir)) return NULL;
\r
5120 control_one_demon(dir, power);
\r
5126 if (name) return _("ビジョン", "Vision");
\r
5127 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
\r
5130 int rad = DETECT_RAD_MAP;
\r
5132 if (info) return info_radius(rad);
\r
5142 if (name) return _("耐地獄", "Resist Nether");
\r
5143 if (desc) return _("一定時間、地獄への耐性を得る。", "Gives resistance to nether for a while.");
\r
5148 if (info) return info_duration(base, base);
\r
5152 set_tim_res_nether(randint1(base) + base, FALSE);
\r
5158 if (name) return _("プラズマ・ボルト", "Plasma bolt");
\r
5159 if (desc) return _("プラズマのボルトもしくはビームを放つ。", "Fires a bolt or beam of plasma.");
\r
5162 int dice = 11 + (plev - 5) / 4;
\r
5165 if (info) return info_damage(dice, sides, 0);
\r
5169 if (!get_aim_dir(&dir)) return NULL;
\r
5171 fire_bolt_or_beam(beam_chance(), GF_PLASMA, dir, damroll(dice, sides));
\r
5177 if (name) return _("ファイア・ボール", "Fire Ball");
\r
5178 if (desc) return _("炎の球を放つ。", "Fires a ball of fire.");
\r
5181 HIT_POINT dam = plev + 55;
\r
5184 if (info) return info_damage(0, 0, dam);
\r
5188 if (!get_aim_dir(&dir)) return NULL;
\r
5190 fire_ball(GF_FIRE, dir, dam, rad);
\r
5196 if (name) return _("炎の刃", "Fire Branding");
\r
5197 if (desc) return _("武器に炎の属性をつける。", "Makes current weapon fire branded.");
\r
5208 if (name) return _("地獄球", "Nether Ball");
\r
5209 if (desc) return _("大きな地獄の球を放つ。", "Fires a huge ball of nether.");
\r
5212 HIT_POINT dam = plev * 3 / 2 + 100;
\r
5213 int rad = plev / 20 + 2;
\r
5215 if (info) return info_damage(0, 0, dam);
\r
5219 if (!get_aim_dir(&dir)) return NULL;
\r
5221 fire_ball(GF_NETHER, dir, dam, rad);
\r
5227 if (name) return _("デーモン召喚", "Summon Demon");
\r
5228 if (desc) return _("悪魔1体を召喚する。", "Summons a demon.");
\r
5233 bool pet = !one_in_(3);
\r
5236 if (pet) flg |= PM_FORCE_PET;
\r
5237 else flg |= PM_NO_PET;
\r
5238 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
\r
5240 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, plev*2/3+randint1(plev/2), SUMMON_DEMON, flg))
\r
5242 msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));
\r
5246 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
\r
5250 msg_print(_("「卑しき者よ、我は汝の下僕にあらず! お前の魂を頂くぞ!」",
\r
5251 "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));
\r
5256 msg_print(_("悪魔は現れなかった。", "No demons arrive."));
\r
5264 if (name) return _("悪魔の目", "Devilish Eye");
\r
5265 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
\r
5271 if (info) return info_duration(base, sides);
\r
5275 set_tim_esp(randint1(sides) + base, FALSE);
\r
5281 if (name) return _("悪魔のクローク", "Devil Cloak");
\r
5282 if (desc) return _("恐怖を取り除き、一定時間、炎と冷気の耐性、炎のオーラを得る。耐性は装備による耐性に累積する。",
\r
5283 "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
5286 TIME_EFFECT base = 20;
\r
5288 if (info) return info_duration(base, base);
\r
5292 TIME_EFFECT dur = randint1(base) + base;
\r
5294 set_oppose_fire(dur, FALSE);
\r
5295 set_oppose_cold(dur, FALSE);
\r
5296 set_tim_sh_fire(dur, FALSE);
\r
5304 if (name) return _("溶岩流", "The Flow of Lava");
\r
5305 if (desc) return _("自分を中心とした炎の球を作り出し、床を溶岩に変える。",
\r
5306 "Generates a ball of fire centered on you which transforms floors to magma.");
\r
5309 HIT_POINT dam = (55 + plev) * 2;
\r
5312 if (info) return info_damage(0, 0, dam/2);
\r
5316 fire_ball(GF_FIRE, 0, dam, rad);
\r
5317 fire_ball_hide(GF_LAVA_FLOW, 0, 2 + randint1(2), rad);
\r
5323 if (name) return _("プラズマ球", "Plasma Ball");
\r
5324 if (desc) return _("プラズマの球を放つ。", "Fires a ball of plasma.");
\r
5327 HIT_POINT dam = plev * 3 / 2 + 80;
\r
5328 int rad = 2 + plev / 40;
\r
5330 if (info) return info_damage(0, 0, dam);
\r
5334 if (!get_aim_dir(&dir)) return NULL;
\r
5336 fire_ball(GF_PLASMA, dir, dam, rad);
\r
5342 if (name) return _("悪魔変化", "Polymorph Demon");
\r
5343 if (desc) return _("一定時間、悪魔に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔としての能力を得る。",
\r
5344 "Mimic a demon for a while. Loses abilities of original race and gets abilities as a demon.");
\r
5347 int base = 10 + plev / 2;
\r
5349 if (info) return info_duration(base, base);
\r
5353 set_mimic(base + randint1(base), MIMIC_DEMON, FALSE);
\r
5359 if (name) return _("地獄の波動", "Nather Wave");
\r
5360 if (desc) return _("視界内の全てのモンスターにダメージを与える。善良なモンスターに特に大きなダメージを与える。",
\r
5361 "Damages all monsters in sight. Hurts good monsters greatly.");
\r
5364 int sides1 = plev * 2;
\r
5365 int sides2 = plev * 2;
\r
5367 if (info) return format("%sd%d+d%d", s_dam, sides1, sides2);
\r
5371 dispel_monsters(randint1(sides1));
\r
5372 dispel_good(randint1(sides2));
\r
5378 if (name) return _("サキュバスの接吻", "Kiss of Succubus");
\r
5379 if (desc) return _("因果混乱の球を放つ。", "Fires a ball of nexus.");
\r
5382 HIT_POINT dam = 100 + plev * 2;
\r
5385 if (info) return info_damage(0, 0, dam);
\r
5389 if (!get_aim_dir(&dir)) return NULL;
\r
5390 fire_ball(GF_NEXUS, dir, dam, rad);
\r
5396 if (name) return _("破滅の手", "Doom Hand");
\r
5397 if (desc) return _("破滅の手を放つ。食らったモンスターはそのときのHPの半分前後のダメージを受ける。", "Attempts to make a monster's HP almost half.");
\r
5402 if (!get_aim_dir(&dir))
\r
5405 msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));
\r
5407 fire_ball_hide(GF_HAND_DOOM, dir, plev * 2, 0);
\r
5413 if (name) return _("士気高揚", "Raise the Morale");
\r
5414 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
5419 if (info) return info_duration(base, base);
\r
5423 set_hero(randint1(base) + base, FALSE);
\r
5431 if (name) return _("不滅の肉体", "Immortal Body");
\r
5432 if (desc) return _("一定時間、時間逆転への耐性を得る。", "Gives resistance to time for a while.");
\r
5437 if (info) return info_duration(base, base);
\r
5441 set_tim_res_time(randint1(base)+base, FALSE);
\r
5447 if (name) return _("狂気の円環", "Insanity Circle");
\r
5448 if (desc) return _("自分を中心としたカオスの球、混乱の球を発生させ、近くのモンスターを魅了する。",
\r
5449 "Generate balls of chaos, confusion and charm centered on you.");
\r
5452 HIT_POINT dam = 50 + plev;
\r
5453 int power = 20 + plev;
\r
5454 int rad = 3 + plev / 20;
\r
5456 if (info) return format("%s%d+%d", s_dam, dam/2, dam/2);
\r
5460 fire_ball(GF_CHAOS, 0, dam, rad);
\r
5461 fire_ball(GF_CONFUSION, 0, dam, rad);
\r
5462 fire_ball(GF_CHARM, 0, power, rad);
\r
5468 if (name) return _("ペット爆破", "Explode Pets");
\r
5469 if (desc) return _("全てのペットを強制的に爆破させる。", "Makes all pets explode.");
\r
5474 discharge_minion();
\r
5480 if (name) return _("グレーターデーモン召喚", "Summon Greater Demon");
\r
5481 if (desc) return _("上級デーモンを召喚する。召喚するには人間('p','h','t'で表されるモンスター)の死体を捧げなければならない。",
\r
5482 "Summons greater demon. It need to sacrifice a corpse of human ('p','h' or 't').");
\r
5487 if (!cast_summon_greater_demon()) return NULL;
\r
5493 if (name) return _("地獄嵐", "Nether Storm");
\r
5494 if (desc) return _("超巨大な地獄の球を放つ。", "Generate a huge ball of nether.");
\r
5497 HIT_POINT dam = plev * 15;
\r
5498 int rad = plev / 5;
\r
5500 if (info) return info_damage(0, 0, dam);
\r
5504 if (!get_aim_dir(&dir)) return NULL;
\r
5506 fire_ball(GF_NETHER, dir, dam, rad);
\r
5512 if (name) return _("血の呪い", "Bloody Curse");
\r
5513 if (desc) return _("自分がダメージを受けることによって対象に呪いをかけ、ダメージを与え様々な効果を引き起こす。",
\r
5514 "Puts blood curse which damages and causes various effects on a monster. You also take damage.");
\r
5517 HIT_POINT dam = 600;
\r
5520 if (info) return info_damage(0, 0, dam);
\r
5524 if (!get_aim_dir(&dir)) return NULL;
\r
5526 fire_ball_hide(GF_BLOOD_CURSE, dir, dam, rad);
\r
5527 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("血の呪い", "Blood curse"), -1);
\r
5533 if (name) return _("魔王変化", "Polymorph Demonlord");
\r
5534 if (desc) return _("悪魔の王に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔の王としての能力を得、壁を破壊しながら歩く。",
\r
5535 "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
5540 if (info) return info_duration(base, base);
\r
5544 set_mimic(base + randint1(base), MIMIC_DEMON_LORD, FALSE);
\r
5554 * @brief 破邪領域魔法の各処理を行う
\r
5555 * @param spell 魔法ID
\r
5556 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
5557 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
5559 static cptr do_crusade_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
5561 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
5562 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
5563 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
5564 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
5567 int plev = p_ptr->lev;
\r
5572 if (name) return _("懲罰", "Punishment");
\r
5573 if (desc) return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");
\r
5576 int dice = 3 + (plev - 1) / 5;
\r
5579 if (info) return info_damage(dice, sides, 0);
\r
5583 if (!get_aim_dir(&dir)) return NULL;
\r
5585 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));
\r
5591 if (name) return _("邪悪存在感知", "Detect Evil");
\r
5592 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
\r
5595 int rad = DETECT_RAD_DEFAULT;
\r
5597 if (info) return info_radius(rad);
\r
5601 detect_monsters_evil(rad);
\r
5607 if (name) return _("恐怖除去", "Remove Fear");
\r
5608 if (desc) return _("恐怖を取り除く。", "Removes fear.");
\r
5619 if (name) return _("威圧", "Scare Monster");
\r
5620 if (desc) return _("モンスター1体を恐怖させる。抵抗されると無効。", "Attempts to scare a monster.");
\r
5625 if (info) return info_power(power);
\r
5629 if (!get_aim_dir(&dir)) return NULL;
\r
5631 fear_monster(dir, power);
\r
5637 if (name) return _("聖域", "Sanctuary");
\r
5638 if (desc) return _("隣接した全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep monsters in the adjacent squares.");
\r
5643 if (info) return info_power(power);
\r
5647 sleep_monsters_touch();
\r
5653 if (name) return _("入口", "Portal");
\r
5654 if (desc) return _("中距離のテレポートをする。", "Teleport medium distance.");
\r
5657 POSITION range = 25 + plev / 2;
\r
5659 if (info) return info_range(range);
\r
5663 teleport_player(range, 0L);
\r
5669 if (name) return _("スターダスト", "Star Dust");
\r
5670 if (desc) return _("ターゲット付近に閃光のボルトを連射する。", "Fires many bolts of light near the target.");
\r
5673 int dice = 3 + (plev - 1) / 9;
\r
5676 if (info) return info_multi_damage_dice(dice, sides);
\r
5680 if (!get_aim_dir(&dir)) return NULL;
\r
5681 fire_blast(GF_LITE, dir, dice, sides, 10, 3);
\r
5687 if (name) return _("身体浄化", "Purify");
\r
5688 if (desc) return _("傷、毒、朦朧から全快する。", "Heals all cut, stun and poison status.");
\r
5701 if (name) return _("邪悪飛ばし", "Scatter Evil");
\r
5702 if (desc) return _("邪悪なモンスター1体をテレポートさせる。抵抗されると無効。", "Attempts to teleport an evil monster away.");
\r
5705 int power = MAX_SIGHT * 5;
\r
5707 if (info) return info_power(power);
\r
5711 if (!get_aim_dir(&dir)) return NULL;
\r
5712 fire_ball(GF_AWAY_EVIL, dir, power, 0);
\r
5718 if (name) return _("聖なる光球", "Holy Orb");
\r
5719 if (desc) return _("聖なる力をもつ宝珠を放つ。邪悪なモンスターに対して大きなダメージを与えるが、善良なモンスターには効果がない。",
\r
5720 "Fires a ball with holy power. Hurts evil monsters greatly, but don't effect good monsters.");
\r
5725 int rad = (plev < 30) ? 2 : 3;
\r
5728 if (p_ptr->pclass == CLASS_PRIEST ||
\r
5729 p_ptr->pclass == CLASS_HIGH_MAGE ||
\r
5730 p_ptr->pclass == CLASS_SORCERER)
\r
5731 base = plev + plev / 2;
\r
5733 base = plev + plev / 4;
\r
5736 if (info) return info_damage(dice, sides, base);
\r
5740 if (!get_aim_dir(&dir)) return NULL;
\r
5742 fire_ball(GF_HOLY_FIRE, dir, damroll(dice, sides) + base, rad);
\r
5748 if (name) return _("悪魔払い", "Exorcism");
\r
5749 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与え、邪悪なモンスターを恐怖させる。",
\r
5750 "Damages all undead and demons in sight, and scares all evil monsters in sight.");
\r
5756 if (info) return info_damage(1, sides, 0);
\r
5760 dispel_undead(randint1(sides));
\r
5761 dispel_demons(randint1(sides));
\r
5768 if (name) return _("解呪", "Remove Curse");
\r
5769 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
\r
5774 if (remove_curse())
\r
5776 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
5783 if (name) return _("透明視認", "Sense Unseen");
\r
5784 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
\r
5789 if (info) return info_duration(base, base);
\r
5793 set_tim_invis(randint1(base) + base, FALSE);
\r
5799 if (name) return _("対邪悪結界", "Protection from Evil");
\r
5800 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");
\r
5804 int sides = 3 * plev;
\r
5806 if (info) return info_duration(base, sides);
\r
5810 set_protevil(randint1(sides) + base, FALSE);
\r
5816 if (name) return _("裁きの雷", "Judgment Thunder");
\r
5817 if (desc) return _("強力な電撃のボルトを放つ。", "Fires a powerful bolt of lightning.");
\r
5820 HIT_POINT dam = plev * 5;
\r
5822 if (info) return info_damage(0, 0, dam);
\r
5826 if (!get_aim_dir(&dir)) return NULL;
\r
5827 fire_bolt(GF_ELEC, dir, dam);
\r
5833 if (name) return _("聖なる御言葉", "Holy Word");
\r
5834 if (desc) return _("視界内の邪悪な存在に大きなダメージを与え、体力を回復し、毒、恐怖、朦朧状態、負傷から全快する。",
\r
5835 "Damages all evil monsters in sight, heals HP somewhat, and completely heals poison, fear, stun and cut status.");
\r
5838 int dam_sides = plev * 6;
\r
5841 if (info) return format(_("損:1d%d/回%d", "dam:d%d/h%d"), dam_sides, heal);
\r
5844 dispel_evil(randint1(dam_sides));
\r
5855 if (name) return _("開かれた道", "Unbarring Ways");
\r
5856 if (desc) return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");
\r
5861 if (!get_aim_dir(&dir)) return NULL;
\r
5863 destroy_door(dir);
\r
5869 if (name) return _("封魔", "Arrest");
\r
5870 if (desc) return _("邪悪なモンスターの動きを止める。", "Attempts to paralyze an evil monster.");
\r
5873 int power = plev * 2;
\r
5875 if (info) return info_power(power);
\r
5879 if (!get_aim_dir(&dir)) return NULL;
\r
5886 if (name) return _("聖なるオーラ", "Holy Aura");
\r
5887 if (desc) return _("一定時間、邪悪なモンスターを傷つける聖なるオーラを得る。",
\r
5888 "Gives aura of holy power which injures evil monsters which attacked you for a while.");
\r
5893 if (info) return info_duration(base, base);
\r
5897 set_tim_sh_holy(randint1(base) + base, FALSE);
\r
5903 if (name) return _("アンデッド&悪魔退散", "Dispel Undead & Demons");
\r
5904 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与える。", "Damages all undead and demons in sight.");
\r
5907 int sides = plev * 4;
\r
5909 if (info) return info_damage(1, sides, 0);
\r
5913 dispel_undead(randint1(sides));
\r
5914 dispel_demons(randint1(sides));
\r
5920 if (name) return _("邪悪退散", "Dispel Evil");
\r
5921 if (desc) return _("視界内の全ての邪悪なモンスターにダメージを与える。", "Damages all evil monsters in sight.");
\r
5924 int sides = plev * 4;
\r
5926 if (info) return info_damage(1, sides, 0);
\r
5930 dispel_evil(randint1(sides));
\r
5936 if (name) return _("聖なる刃", "Holy Blade");
\r
5937 if (desc) return _("通常の武器に滅邪の属性をつける。", "Makes current weapon especially deadly against evil monsters.");
\r
5948 if (name) return _("スターバースト", "Star Burst");
\r
5949 if (desc) return _("巨大な閃光の球を放つ。", "Fires a huge ball of powerful light.");
\r
5952 HIT_POINT dam = 100 + plev * 2;
\r
5955 if (info) return info_damage(0, 0, dam);
\r
5959 if (!get_aim_dir(&dir)) return NULL;
\r
5961 fire_ball(GF_LITE, dir, dam, rad);
\r
5967 if (name) return _("天使召喚", "Summon Angel");
\r
5968 if (desc) return _("天使を1体召喚する。", "Summons an angel.");
\r
5973 bool pet = !one_in_(3);
\r
5976 if (pet) flg |= PM_FORCE_PET;
\r
5977 else flg |= PM_NO_PET;
\r
5978 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
\r
5980 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_ANGEL, flg))
\r
5984 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
\r
5988 msg_print(_("「我は汝の下僕にあらず! 悪行者よ、悔い改めよ!」", "Mortal! Repent of thy impiousness."));
\r
5996 if (name) return _("士気高揚", "Heroism");
\r
5997 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
6002 if (info) return info_duration(base, base);
\r
6006 set_hero(randint1(base) + base, FALSE);
\r
6014 if (name) return _("呪い退散", "Dispel Curse");
\r
6015 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
\r
6020 if (remove_all_curse())
\r
6022 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
6029 if (name) return _("邪悪追放", "Banish Evil");
\r
6030 if (desc) return _("視界内の全ての邪悪なモンスターをテレポートさせる。抵抗されると無効。",
\r
6031 "Teleports all evil monsters in sight away unless resisted.");
\r
6036 if (info) return info_power(power);
\r
6040 if (banish_evil(power))
\r
6042 msg_print(_("神聖な力が邪悪を打ち払った!", "The holy power banishes evil!"));
\r
6049 if (name) return _("ハルマゲドン", "Armageddon");
\r
6050 if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroy everything in nearby area.");
\r
6058 destroy_area(p_ptr->y, p_ptr->x, base + randint1(sides), FALSE);
\r
6064 if (name) return _("目には目を", "An Eye for an Eye");
\r
6065 if (desc) return _("一定時間、自分がダメージを受けたときに攻撃を行ったモンスターに対して同等のダメージを与える。",
\r
6066 "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
6071 if (info) return info_duration(base, base);
\r
6075 set_tim_eyeeye(randint1(base) + base, FALSE);
\r
6081 if (name) return _("神の怒り", "Wrath of the God");
\r
6082 if (desc) return _("ターゲットの周囲に分解の球を多数落とす。", "Drops many balls of disintegration near the target.");
\r
6085 HIT_POINT dam = plev * 3 + 25;
\r
6088 if (info) return info_multi_damage(dam);
\r
6092 if (!cast_wrath_of_the_god(dam, rad)) return NULL;
\r
6098 if (name) return _("神威", "Divine Intervention");
\r
6099 if (desc) return _("隣接するモンスターに聖なるダメージを与え、視界内のモンスターにダメージ、減速、朦朧、混乱、恐怖、眠りを与える。さらに体力を回復する。",
\r
6100 "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
6103 int b_dam = plev * 11;
\r
6104 int d_dam = plev * 4;
\r
6106 int power = plev * 4;
\r
6108 if (info) return format(_("回%d/損%d+%d", "h%d/dm%d+%d"), heal, d_dam, b_dam/2);
\r
6111 project(0, 1, p_ptr->y, p_ptr->x, b_dam, GF_HOLY_FIRE, PROJECT_KILL, -1);
\r
6112 dispel_monsters(d_dam);
\r
6113 slow_monsters(plev);
\r
6114 stun_monsters(power);
\r
6115 confuse_monsters(power);
\r
6116 turn_monsters(power);
\r
6117 stasis_monsters(power);
\r
6124 if (name) return _("聖戦", "Crusade");
\r
6125 if (desc) return _("視界内の善良なモンスターをペットにしようとし、ならなかった場合及び善良でないモンスターを恐怖させる。さらに多数の加速された騎士を召喚し、ヒーロー、祝福、加速、対邪悪結界を得る。",
\r
6126 "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
6132 int sp_sides = 20 + plev;
\r
6133 int sp_base = plev;
\r
6137 for (i = 0; i < 12; i++)
\r
6140 POSITION my = 0, mx = 0;
\r
6144 scatter(&my, &mx, p_ptr->y, p_ptr->x, 4, 0);
\r
6146 /* Require empty grids */
\r
6147 if (cave_empty_bold2(my, mx)) break;
\r
6149 if (attempt < 0) continue;
\r
6150 summon_specific(-1, my, mx, plev, SUMMON_KNIGHTS, (PM_ALLOW_GROUP | PM_FORCE_PET | PM_HASTE));
\r
6152 set_hero(randint1(base) + base, FALSE);
\r
6153 set_blessed(randint1(base) + base, FALSE);
\r
6154 set_fast(randint1(sp_sides) + sp_base, FALSE);
\r
6155 set_protevil(randint1(base) + base, FALSE);
\r
6168 * @param spell 歌ID
\r
6169 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP)
\r
6170 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
\r
6172 static cptr do_music_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
6174 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
6175 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
6176 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
6177 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
6178 bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
\r
6179 bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
\r
6180 bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
\r
6181 static const char s_dam[] = _("損傷:", "dam ");
\r
6184 int plev = p_ptr->lev;
\r
6189 if (name) return _("遅鈍の歌", "Song of Holding");
\r
6190 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
\r
6192 /* Stop singing before start another */
\r
6193 if (cast || fail) stop_singing();
\r
6197 msg_print(_("ゆっくりとしたメロディを口ずさみ始めた...", "You start humming a slow, steady melody..."));
\r
6198 start_singing(spell, MUSIC_SLOW);
\r
6204 if (info) return info_power(power);
\r
6208 slow_monsters(plev);
\r
6214 if (name) return _("祝福の歌", "Song of Blessing");
\r
6215 if (desc) return _("命中率とACのボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
\r
6217 /* Stop singing before start another */
\r
6218 if (cast || fail) stop_singing();
\r
6222 msg_print(_("厳かなメロディを奏で始めた...", "The holy power of the Music of the Ainur enters you..."));
\r
6223 start_singing(spell, MUSIC_BLESS);
\r
6228 if (!p_ptr->blessed)
\r
6230 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
\r
6237 if (name) return _("崩壊の音色", "Wrecking Note");
\r
6238 if (desc) return _("轟音のボルトを放つ。", "Fires a bolt of sound.");
\r
6240 /* Stop singing before start another */
\r
6241 if (cast || fail) stop_singing();
\r
6244 int dice = 4 + (plev - 1) / 5;
\r
6247 if (info) return info_damage(dice, sides, 0);
\r
6251 if (!get_aim_dir(&dir)) return NULL;
\r
6253 fire_bolt(GF_SOUND, dir, damroll(dice, sides));
\r
6259 if (name) return _("朦朧の旋律", "Stun Pattern");
\r
6260 if (desc) return _("視界内の全てのモンスターを朦朧させる。抵抗されると無効。", "Attempts to stun all monsters in sight.");
\r
6262 /* Stop singing before start another */
\r
6263 if (cast || fail) stop_singing();
\r
6267 msg_print(_("眩惑させるメロディを奏で始めた...", "You weave a pattern of sounds to bewilder and daze..."));
\r
6268 start_singing(spell, MUSIC_STUN);
\r
6272 int dice = plev / 10;
\r
6275 if (info) return info_power_dice(dice, sides);
\r
6279 stun_monsters(damroll(dice, sides));
\r
6286 if (name) return _("生命の流れ", "Flow of Life");
\r
6287 if (desc) return _("体力を少し回復させる。", "Heals HP a little.");
\r
6289 /* Stop singing before start another */
\r
6290 if (cast || fail) stop_singing();
\r
6294 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing a song of healing..."));
\r
6295 start_singing(spell, MUSIC_L_LIFE);
\r
6302 if (info) return info_heal(dice, sides, 0);
\r
6306 hp_player(damroll(dice, sides));
\r
6313 if (name) return _("太陽の歌", "Song of the Sun");
\r
6314 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
\r
6316 /* Stop singing before start another */
\r
6317 if (cast || fail) stop_singing();
\r
6321 int sides = plev / 2;
\r
6322 int rad = plev / 10 + 1;
\r
6324 if (info) return info_damage(dice, sides, 0);
\r
6328 msg_print(_("光り輝く歌が辺りを照らした。", "Your uplifting song brings brightness to dark places..."));
\r
6329 lite_area(damroll(dice, sides), rad);
\r
6335 if (name) return _("恐怖の歌", "Song of Fear");
\r
6336 if (desc) return _("視界内の全てのモンスターを恐怖させる。抵抗されると無効。", "Attempts to scare all monsters in sight.");
\r
6338 /* Stop singing before start another */
\r
6339 if (cast || fail) stop_singing();
\r
6343 msg_print(_("おどろおどろしいメロディを奏で始めた...", "You start weaving a fearful pattern..."));
\r
6344 start_singing(spell, MUSIC_FEAR);
\r
6350 if (info) return info_power(power);
\r
6354 project_hack(GF_TURN_ALL, power);
\r
6361 if (name) return _("戦いの歌", "Heroic Ballad");
\r
6362 if (desc) return _("ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
6364 /* Stop singing before start another */
\r
6365 if (cast || fail) stop_singing();
\r
6369 msg_print(_("激しい戦いの歌を歌った...", "You start singing a song of intense fighting..."));
\r
6371 (void)hp_player(10);
\r
6372 (void)set_afraid(0);
\r
6374 /* Recalculate hitpoints */
\r
6375 p_ptr->update |= (PU_HP);
\r
6377 start_singing(spell, MUSIC_HERO);
\r
6384 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
\r
6385 /* Recalculate hitpoints */
\r
6386 p_ptr->update |= (PU_HP);
\r
6393 if (name) return _("霊的知覚", "Clairaudience");
\r
6394 if (desc) return _("近くの罠/扉/階段を感知する。レベル15で全てのモンスター、20で財宝とアイテムを感知できるようになる。レベル25で周辺の地形を感知し、40でその階全体を永久に照らし、ダンジョン内のすべてのアイテムを感知する。この効果は歌い続けることで順に起こる。",
\r
6395 "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
6397 /* Stop singing before start another */
\r
6398 if (cast || fail) stop_singing();
\r
6402 msg_print(_("静かな音楽が感覚を研ぎ澄まさせた...", "Your quiet music sharpens your sense of hearing..."));
\r
6403 /* Hack -- Initialize the turn count */
\r
6404 SINGING_COUNT(p_ptr) = 0;
\r
6405 start_singing(spell, MUSIC_DETECT);
\r
6409 int rad = DETECT_RAD_DEFAULT;
\r
6411 if (info) return info_radius(rad);
\r
6415 int count = SINGING_COUNT(p_ptr);
\r
6417 if (count >= 19) wiz_lite(FALSE);
\r
6421 if (plev > 39 && count < 19)
\r
6422 SINGING_COUNT(p_ptr) = count + 1;
\r
6426 /* There are too many hidden treasure. So... */
\r
6427 /* detect_treasure(rad); */
\r
6428 detect_objects_gold(rad);
\r
6429 detect_objects_normal(rad);
\r
6431 if (plev > 24 && count < 11)
\r
6432 SINGING_COUNT(p_ptr) = count + 1;
\r
6436 detect_monsters_invis(rad);
\r
6437 detect_monsters_normal(rad);
\r
6439 if (plev > 19 && count < 6)
\r
6440 SINGING_COUNT(p_ptr) = count + 1;
\r
6442 detect_traps(rad, TRUE);
\r
6443 detect_doors(rad);
\r
6444 detect_stairs(rad);
\r
6446 if (plev > 14 && count < 3)
\r
6447 SINGING_COUNT(p_ptr) = count + 1;
\r
6454 if (name) return _("魂の歌", "Soul Shriek");
\r
6455 if (desc) return _("視界内の全てのモンスターに対して精神攻撃を行う。", "Damages all monsters in sight with PSI damages.");
\r
6457 /* Stop singing before start another */
\r
6458 if (cast || fail) stop_singing();
\r
6462 msg_print(_("精神を捻じ曲げる歌を歌った...", "You start singing a song of soul in pain..."));
\r
6463 start_singing(spell, MUSIC_PSI);
\r
6468 int sides = plev * 3 / 2;
\r
6470 if (info) return info_damage(dice, sides, 0);
\r
6474 project_hack(GF_PSI, damroll(dice, sides));
\r
6481 if (name) return _("知識の歌", "Song of Lore");
\r
6482 if (desc) return _("自分のいるマスと隣りのマスに落ちているアイテムを鑑定する。", "Identifies all items which are in the adjacent squares.");
\r
6484 /* Stop singing before start another */
\r
6485 if (cast || fail) stop_singing();
\r
6489 msg_print(_("この世界の知識が流れ込んできた...", "You recall the rich lore of the world..."));
\r
6490 start_singing(spell, MUSIC_ID);
\r
6496 if (info) return info_radius(rad);
\r
6500 * MP不足で鑑定が発動される前に歌が中断してしまうのを防止。
\r
6504 project(0, rad, p_ptr->y, p_ptr->x, 0, GF_IDENTIFY, PROJECT_ITEM, -1);
\r
6511 if (name) return _("隠遁の歌", "Hiding Tune");
\r
6512 if (desc) return _("隠密行動能力を上昇させる。", "Gives improved stealth.");
\r
6514 /* Stop singing before start another */
\r
6515 if (cast || fail) stop_singing();
\r
6519 msg_print(_("あなたの姿が景色にとけこんでいった...", "Your song carries you beyond the sight of mortal eyes..."));
\r
6520 start_singing(spell, MUSIC_STEALTH);
\r
6525 if (!p_ptr->tim_stealth)
\r
6527 msg_print(_("姿がはっきりと見えるようになった。", "You are no longer hided."));
\r
6534 if (name) return _("幻影の旋律", "Illusion Pattern");
\r
6535 if (desc) return _("視界内の全てのモンスターを混乱させる。抵抗されると無効。", "Attempts to confuse all monsters in sight.");
\r
6537 /* Stop singing before start another */
\r
6538 if (cast || fail) stop_singing();
\r
6542 msg_print(_("辺り一面に幻影が現れた...", "You weave a pattern of sounds to beguile and confuse..."));
\r
6543 start_singing(spell, MUSIC_CONF);
\r
6547 int power = plev * 2;
\r
6549 if (info) return info_power(power);
\r
6553 confuse_monsters(power);
\r
6560 if (name) return _("破滅の叫び", "Doomcall");
\r
6561 if (desc) return _("視界内の全てのモンスターに対して轟音攻撃を行う。", "Damages all monsters in sight with booming sound.");
\r
6563 /* Stop singing before start another */
\r
6564 if (cast || fail) stop_singing();
\r
6568 msg_print(_("轟音が響いた...", "The fury of the Downfall of Numenor lashes out..."));
\r
6569 start_singing(spell, MUSIC_SOUND);
\r
6573 int dice = 10 + plev / 5;
\r
6576 if (info) return info_damage(dice, sides, 0);
\r
6580 project_hack(GF_SOUND, damroll(dice, sides));
\r
6587 if (name) return _("フィリエルの歌", "Firiel's Song");
\r
6588 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
\r
6591 /* Stop singing before start another */
\r
6592 if (cast || fail) stop_singing();
\r
6596 msg_print(_("生命と復活のテーマを奏で始めた...", "The themes of life and revival are woven into your song..."));
\r
6597 animate_dead(0, p_ptr->y, p_ptr->x);
\r
6603 if (name) return _("旅の仲間", "Fellowship Chant");
\r
6604 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
\r
6606 /* Stop singing before start another */
\r
6607 if (cast || fail) stop_singing();
\r
6611 msg_print(_("安らかなメロディを奏で始めた...", "You weave a slow, soothing melody of imploration..."));
\r
6612 start_singing(spell, MUSIC_CHARM);
\r
6616 int dice = 10 + plev / 15;
\r
6619 if (info) return info_power_dice(dice, sides);
\r
6623 charm_monsters(damroll(dice, sides));
\r
6630 if (name) return _("分解音波", "Sound of disintegration");
\r
6631 if (desc) return _("壁を掘り進む。自分の足元のアイテムは蒸発する。", "Makes you be able to burrow into walls. Objects under your feet evaporate.");
\r
6633 /* Stop singing before start another */
\r
6634 if (cast || fail) stop_singing();
\r
6638 msg_print(_("粉砕するメロディを奏で始めた...", "You weave a violent pattern of sounds to break wall."));
\r
6639 start_singing(spell, MUSIC_WALL);
\r
6645 * MP不足で効果が発動される前に歌が中断してしまうのを防止。
\r
6649 project(0, 0, p_ptr->y, p_ptr->x,
\r
6650 0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1);
\r
6656 if (name) return _("元素耐性", "Finrod's Resistance");
\r
6657 if (desc) return _("酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
\r
6658 "Gives resistance to fire, cold, electricity, acid and poison. These resistances can be added to which from equipment for more powerful resistances.");
\r
6660 /* Stop singing before start another */
\r
6661 if (cast || fail) stop_singing();
\r
6665 msg_print(_("元素の力に対する忍耐の歌を歌った。", "You sing a song of perseverance against powers..."));
\r
6666 start_singing(spell, MUSIC_RESIST);
\r
6671 if (!p_ptr->oppose_acid)
\r
6673 msg_print(_("酸への耐性が薄れた気がする。", "You feel less resistant to acid."));
\r
6676 if (!p_ptr->oppose_elec)
\r
6678 msg_print(_("電撃への耐性が薄れた気がする。", "You feel less resistant to elec."));
\r
6681 if (!p_ptr->oppose_fire)
\r
6683 msg_print(_("火への耐性が薄れた気がする。", "You feel less resistant to fire."));
\r
6686 if (!p_ptr->oppose_cold)
\r
6688 msg_print(_("冷気への耐性が薄れた気がする。", "You feel less resistant to cold."));
\r
6691 if (!p_ptr->oppose_pois)
\r
6693 msg_print(_("毒への耐性が薄れた気がする。", "You feel less resistant to pois."));
\r
6700 if (name) return _("ホビットのメロディ", "Hobbit Melodies");
\r
6701 if (desc) return _("加速する。", "Hastes you.");
\r
6703 /* Stop singing before start another */
\r
6704 if (cast || fail) stop_singing();
\r
6708 msg_print(_("軽快な歌を口ずさみ始めた...", "You start singing joyful pop song..."));
\r
6709 start_singing(spell, MUSIC_SPEED);
\r
6716 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
\r
6723 if (name) return _("歪んだ世界", "World Contortion");
\r
6724 if (desc) return _("近くのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all nearby monsters away unless resisted.");
\r
6727 int rad = plev / 15 + 1;
\r
6728 int power = plev * 3 + 1;
\r
6730 if (info) return info_radius(rad);
\r
6732 /* Stop singing before start another */
\r
6733 if (cast || fail) stop_singing();
\r
6737 msg_print(_("歌が空間を歪めた...", "Reality whirls wildly as you sing a dizzying melody..."));
\r
6738 project(0, rad, p_ptr->y, p_ptr->x, power, GF_AWAY_ALL, PROJECT_KILL, -1);
\r
6744 if (name) return _("退散の歌", "Dispelling chant");
\r
6745 if (desc) return _("視界内の全てのモンスターにダメージを与える。邪悪なモンスターに特に大きなダメージを与える。",
\r
6746 "Damages all monsters in sight. Hurts evil monsters greatly.");
\r
6748 /* Stop singing before start another */
\r
6749 if (cast || fail) stop_singing();
\r
6753 msg_print(_("耐えられない不協和音が敵を責め立てた...", "You cry out in an ear-wracking voice..."));
\r
6754 start_singing(spell, MUSIC_DISPEL);
\r
6758 int m_sides = plev * 3;
\r
6759 int e_sides = plev * 3;
\r
6761 if (info) return format("%s1d%d+1d%d", s_dam, m_sides, e_sides);
\r
6765 dispel_monsters(randint1(m_sides));
\r
6766 dispel_evil(randint1(e_sides));
\r
6772 if (name) return _("サルマンの甘言", "The Voice of Saruman");
\r
6773 if (desc) return _("視界内の全てのモンスターを減速させ、眠らせようとする。抵抗されると無効。", "Attempts to slow and sleep all monsters in sight.");
\r
6775 /* Stop singing before start another */
\r
6776 if (cast || fail) stop_singing();
\r
6780 msg_print(_("優しく、魅力的な歌を口ずさみ始めた...", "You start humming a gentle and attractive song..."));
\r
6781 start_singing(spell, MUSIC_SARUMAN);
\r
6787 if (info) return info_power(power);
\r
6791 slow_monsters(plev);
\r
6792 sleep_monsters(plev);
\r
6799 if (name) return _("嵐の音色", "Song of the Tempest");
\r
6800 if (desc) return _("轟音のビームを放つ。", "Fires a beam of sound.");
\r
6803 int dice = 15 + (plev - 1) / 2;
\r
6806 if (info) return info_damage(dice, sides, 0);
\r
6808 /* Stop singing before start another */
\r
6809 if (cast || fail) stop_singing();
\r
6813 if (!get_aim_dir(&dir)) return NULL;
\r
6815 fire_beam(GF_SOUND, dir, damroll(dice, sides));
\r
6821 if (name) return _("もう一つの世界", "Ambarkanta");
\r
6822 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
\r
6828 if (info) return info_delay(base, sides);
\r
6830 /* Stop singing before start another */
\r
6831 if (cast || fail) stop_singing();
\r
6835 msg_print(_("周囲が変化し始めた...", "You sing of the primeval shaping of Middle-earth..."));
\r
6842 if (name) return _("破壊の旋律", "Wrecking Pattern");
\r
6843 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
\r
6844 "Shakes dungeon structure, and results in random swapping of floors and walls.");
\r
6846 /* Stop singing before start another */
\r
6847 if (cast || fail) stop_singing();
\r
6851 msg_print(_("破壊的な歌が響きわたった...", "You weave a pattern of sounds to contort and shatter..."));
\r
6852 start_singing(spell, MUSIC_QUAKE);
\r
6858 if (info) return info_radius(rad);
\r
6862 earthquake(p_ptr->y, p_ptr->x, 10);
\r
6870 if (name) return _("停滞の歌", "Stationary Shriek");
\r
6871 if (desc) return _("視界内の全てのモンスターを麻痺させようとする。抵抗されると無効。", "Attempts to freeze all monsters in sight.");
\r
6873 /* Stop singing before start another */
\r
6874 if (cast || fail) stop_singing();
\r
6878 msg_print(_("ゆっくりとしたメロディを奏で始めた...", "You weave a very slow pattern which is almost likely to stop..."));
\r
6879 start_singing(spell, MUSIC_STASIS);
\r
6883 int power = plev * 4;
\r
6885 if (info) return info_power(power);
\r
6889 stasis_monsters(power);
\r
6896 if (name) return _("守りの歌", "Endurance");
\r
6897 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。",
\r
6898 "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
6901 /* Stop singing before start another */
\r
6902 if (cast || fail) stop_singing();
\r
6906 msg_print(_("歌が神聖な場を作り出した...", "The holy power of the Music is creating sacred field..."));
\r
6913 if (name) return _("英雄の詩", "The Hero's Poem");
\r
6914 if (desc) return _("加速し、ヒーロー気分になり、視界内の全てのモンスターにダメージを与える。",
\r
6915 "Hastes you. Gives heroism. Damages all monsters in sight.");
\r
6917 /* Stop singing before start another */
\r
6918 if (cast || fail) stop_singing();
\r
6922 msg_print(_("英雄の歌を口ずさんだ...", "You chant a powerful, heroic call to arms..."));
\r
6923 (void)hp_player(10);
\r
6924 (void)set_afraid(0);
\r
6926 /* Recalculate hitpoints */
\r
6927 p_ptr->update |= (PU_HP);
\r
6929 start_singing(spell, MUSIC_SHERO);
\r
6936 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
\r
6937 /* Recalculate hitpoints */
\r
6938 p_ptr->update |= (PU_HP);
\r
6943 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
\r
6949 int sides = plev * 3;
\r
6951 if (info) return info_damage(dice, sides, 0);
\r
6955 dispel_monsters(damroll(dice, sides));
\r
6961 if (name) return _("ヤヴァンナの助け", "Relief of Yavanna");
\r
6962 if (desc) return _("強力な回復の歌で、負傷と朦朧状態も全快する。", "Powerful healing song. Also heals cut and stun completely.");
\r
6964 /* Stop singing before start another */
\r
6965 if (cast || fail) stop_singing();
\r
6969 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing the song..."));
\r
6970 start_singing(spell, MUSIC_H_LIFE);
\r
6977 if (info) return info_heal(dice, sides, 0);
\r
6981 hp_player(damroll(dice, sides));
\r
6990 if (name) return _("再生の歌", "Goddess' rebirth");
\r
6991 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
\r
6994 /* Stop singing before start another */
\r
6995 if (cast || fail) stop_singing();
\r
6999 msg_print(_("暗黒の中に光と美をふりまいた。体が元の活力を取り戻した。",
\r
7000 "You strewed light and beauty in the dark as you sing. You feel refreshed."));
\r
7001 (void)do_res_stat(A_STR);
\r
7002 (void)do_res_stat(A_INT);
\r
7003 (void)do_res_stat(A_WIS);
\r
7004 (void)do_res_stat(A_DEX);
\r
7005 (void)do_res_stat(A_CON);
\r
7006 (void)do_res_stat(A_CHR);
\r
7007 (void)restore_level();
\r
7013 if (name) return _("サウロンの魔術", "Wizardry of Sauron");
\r
7014 if (desc) return _("非常に強力でごく小さい轟音の球を放つ。", "Fires an extremely powerful tiny ball of sound.");
\r
7017 int dice = 50 + plev;
\r
7021 if (info) return info_damage(dice, sides, 0);
\r
7023 /* Stop singing before start another */
\r
7024 if (cast || fail) stop_singing();
\r
7028 if (!get_aim_dir(&dir)) return NULL;
\r
7030 fire_ball(GF_SOUND, dir, damroll(dice, sides), rad);
\r
7036 if (name) return _("フィンゴルフィンの挑戦", "Fingolfin's Challenge");
\r
7037 if (desc) return _("ダメージを受けなくなるバリアを張る。",
\r
7038 "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks.");
\r
7040 /* Stop singing before start another */
\r
7041 if (cast || fail) stop_singing();
\r
7045 msg_print(_("フィンゴルフィンの冥王への挑戦を歌った...",
\r
7046 "You recall the valor of Fingolfin's challenge to the Dark Lord..."));
\r
7049 p_ptr->redraw |= (PR_MAP);
\r
7051 /* Update monsters */
\r
7052 p_ptr->update |= (PU_MONSTERS);
\r
7054 /* Window stuff */
\r
7055 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
\r
7057 start_singing(spell, MUSIC_INVULN);
\r
7062 if (!p_ptr->invuln)
\r
7064 msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));
\r
7066 p_ptr->redraw |= (PR_MAP);
\r
7068 /* Update monsters */
\r
7069 p_ptr->update |= (PU_MONSTERS);
\r
7071 /* Window stuff */
\r
7072 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
\r
7083 * @brief 剣術の各処理を行う
\r
7084 * @param spell 剣術ID
\r
7085 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_CAST)
\r
7086 * @return SPELL_NAME / SPELL_DESC 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
7088 static cptr do_hissatsu_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
7090 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
7091 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
7092 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
7095 int plev = p_ptr->lev;
\r
7100 if (name) return _("飛飯綱", "Tobi-Izuna");
\r
7101 if (desc) return _("2マス離れたところにいるモンスターを攻撃する。", "Attacks a two squares distant monster.");
\r
7105 project_length = 2;
\r
7106 if (!get_aim_dir(&dir)) return NULL;
\r
7108 project_hook(GF_ATTACK, dir, HISSATSU_2, PROJECT_STOP | PROJECT_KILL);
\r
7113 if (name) return _("五月雨斬り", "3-Way Attack");
\r
7114 if (desc) return _("3方向に対して攻撃する。", "Attacks in 3 directions in one time.");
\r
7121 if (!get_rep_dir2(&dir)) return NULL;
\r
7122 if (dir == 5) return NULL;
\r
7124 for (cdir = 0;cdir < 8; cdir++)
\r
7126 if (cdd[cdir] == dir) break;
\r
7129 if (cdir == 8) return NULL;
\r
7131 y = p_ptr->y + ddy_cdd[cdir];
\r
7132 x = p_ptr->x + ddx_cdd[cdir];
\r
7133 if (cave[y][x].m_idx)
\r
7134 py_attack(y, x, 0);
\r
7136 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
\r
7138 y = p_ptr->y + ddy_cdd[(cdir + 7) % 8];
\r
7139 x = p_ptr->x + ddx_cdd[(cdir + 7) % 8];
\r
7140 if (cave[y][x].m_idx)
\r
7141 py_attack(y, x, 0);
\r
7143 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
\r
7145 y = p_ptr->y + ddy_cdd[(cdir + 1) % 8];
\r
7146 x = p_ptr->x + ddx_cdd[(cdir + 1) % 8];
\r
7147 if (cave[y][x].m_idx)
\r
7148 py_attack(y, x, 0);
\r
7150 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
\r
7155 if (name) return _("ブーメラン", "Boomerang");
\r
7156 if (desc) return _("武器を手元に戻ってくるように投げる。戻ってこないこともある。",
\r
7157 "Throws current weapon. And it'll return to your hand unless failed.");
\r
7161 if (!do_cmd_throw(1, TRUE, -1)) return NULL;
\r
7166 if (name) return _("焔霊", "Burning Strike");
\r
7167 if (desc) return _("火炎耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to fire.");
\r
7173 if (!get_rep_dir2(&dir)) return NULL;
\r
7174 if (dir == 5) return NULL;
\r
7176 y = p_ptr->y + ddy[dir];
\r
7177 x = p_ptr->x + ddx[dir];
\r
7179 if (cave[y][x].m_idx)
\r
7180 py_attack(y, x, HISSATSU_FIRE);
\r
7183 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7190 if (name) return _("殺気感知", "Detect Ferocity");
\r
7191 if (desc) return _("近くの思考することができるモンスターを感知する。", "Detects all monsters except mindless in your vicinity.");
\r
7195 detect_monsters_mind(DETECT_RAD_DEFAULT);
\r
7200 if (name) return _("みね打ち", "Strike to Stun");
\r
7201 if (desc) return _("相手にダメージを与えないが、朦朧とさせる。", "Attempts to stun a monster in the adjacent.");
\r
7207 if (!get_rep_dir2(&dir)) return NULL;
\r
7208 if (dir == 5) return NULL;
\r
7210 y = p_ptr->y + ddy[dir];
\r
7211 x = p_ptr->x + ddx[dir];
\r
7213 if (cave[y][x].m_idx)
\r
7214 py_attack(y, x, HISSATSU_MINEUCHI);
\r
7217 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7224 if (name) return _("カウンター", "Counter");
\r
7225 if (desc) return _("相手に攻撃されたときに反撃する。反撃するたびにMPを消費。",
\r
7226 "Prepares to counterattack. When attack by a monster, strikes back using SP each time.");
\r
7230 if (p_ptr->riding)
\r
7232 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
\r
7235 msg_print(_("相手の攻撃に対して身構えた。", "You prepare to counter blow."));
\r
7236 p_ptr->counter = TRUE;
\r
7241 if (name) return _("払い抜け", "Harainuke");
\r
7242 if (desc) return _("攻撃した後、反対側に抜ける。",
\r
7243 "Attacks monster with your weapons normally, then move through counter side of the monster.");
\r
7249 if (p_ptr->riding)
\r
7251 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
\r
7255 if (!get_rep_dir2(&dir)) return NULL;
\r
7257 if (dir == 5) return NULL;
\r
7258 y = p_ptr->y + ddy[dir];
\r
7259 x = p_ptr->x + ddx[dir];
\r
7261 if (!cave[y][x].m_idx)
\r
7263 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7267 py_attack(y, x, 0);
\r
7269 if (!player_can_enter(cave[y][x].feat, 0) || is_trap(cave[y][x].feat))
\r
7275 if (player_can_enter(cave[y][x].feat, 0) && !is_trap(cave[y][x].feat) && !cave[y][x].m_idx)
\r
7279 /* Move the player */
\r
7280 (void)move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);
\r
7286 if (name) return _("サーペンツタン", "Serpent's Tongue");
\r
7287 if (desc) return _("毒耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to poison.");
\r
7293 if (!get_rep_dir2(&dir)) return NULL;
\r
7294 if (dir == 5) return NULL;
\r
7296 y = p_ptr->y + ddy[dir];
\r
7297 x = p_ptr->x + ddx[dir];
\r
7299 if (cave[y][x].m_idx)
\r
7300 py_attack(y, x, HISSATSU_POISON);
\r
7303 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7310 if (name) return _("斬魔剣弐の太刀", "Zammaken");
\r
7311 if (desc) return _("生命のない邪悪なモンスターに大ダメージを与えるが、他のモンスターには全く効果がない。",
\r
7312 "Attacks an evil unliving monster with great damage. No effect to other monsters.");
\r
7318 if (!get_rep_dir2(&dir)) return NULL;
\r
7319 if (dir == 5) return NULL;
\r
7321 y = p_ptr->y + ddy[dir];
\r
7322 x = p_ptr->x + ddx[dir];
\r
7324 if (cave[y][x].m_idx)
\r
7325 py_attack(y, x, HISSATSU_ZANMA);
\r
7328 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7335 if (name) return _("裂風剣", "Wind Blast");
\r
7336 if (desc) return _("攻撃した相手を後方へ吹き飛ばす。", "Attacks an adjacent monster, and blow it away.");
\r
7342 if (!get_rep_dir2(&dir)) return NULL;
\r
7343 if (dir == 5) return NULL;
\r
7345 y = p_ptr->y + ddy[dir];
\r
7346 x = p_ptr->x + ddx[dir];
\r
7348 if (cave[y][x].m_idx)
\r
7349 py_attack(y, x, 0);
\r
7352 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7355 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
\r
7359 if (cave[y][x].m_idx)
\r
7362 POSITION ty = y, tx = x;
\r
7363 POSITION oy = y, ox = x;
\r
7364 MONSTER_IDX m_idx = cave[y][x].m_idx;
\r
7365 monster_type *m_ptr = &m_list[m_idx];
\r
7368 monster_desc(m_name, m_ptr, 0);
\r
7370 for (i = 0; i < 5; i++)
\r
7374 if (cave_empty_bold(y, x))
\r
7381 if ((ty != oy) || (tx != ox))
\r
7383 msg_format(_("%sを吹き飛ばした!", "You blow %s away!"), m_name);
\r
7384 cave[oy][ox].m_idx = 0;
\r
7385 cave[ty][tx].m_idx = m_idx;
\r
7389 update_mon(m_idx, TRUE);
\r
7390 lite_spot(oy, ox);
\r
7391 lite_spot(ty, tx);
\r
7393 if (r_info[m_ptr->r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))
\r
7394 p_ptr->update |= (PU_MON_LITE);
\r
7401 if (name) return _("刀匠の目利き", "Judge");
\r
7402 if (desc) return _("武器・防具を1つ識別する。レベル45以上で武器・防具の能力を完全に知ることができる。",
\r
7403 "Identifies a weapon or armor. Or *identifies* these at level 45.");
\r
7409 if (!identify_fully(TRUE)) return NULL;
\r
7413 if (!ident_spell(TRUE)) return NULL;
\r
7419 if (name) return _("破岩斬", "Rock Smash");
\r
7420 if (desc) return _("岩を壊し、岩石系のモンスターに大ダメージを与える。", "Breaks rock. Or greatly damage a monster made by rocks.");
\r
7426 if (!get_rep_dir2(&dir)) return NULL;
\r
7427 if (dir == 5) return NULL;
\r
7429 y = p_ptr->y + ddy[dir];
\r
7430 x = p_ptr->x + ddx[dir];
\r
7432 if (cave[y][x].m_idx)
\r
7433 py_attack(y, x, HISSATSU_HAGAN);
\r
7435 if (!cave_have_flag_bold(y, x, FF_HURT_ROCK)) break;
\r
7437 /* Destroy the feature */
\r
7438 cave_alter_feat(y, x, FF_HURT_ROCK);
\r
7440 /* Update some things */
\r
7441 p_ptr->update |= (PU_FLOW);
\r
7446 if (name) return _("乱れ雪月花", "Midare-Setsugekka");
\r
7447 if (desc) return _("攻撃回数が増え、冷気耐性のないモンスターに大ダメージを与える。",
\r
7448 "Attacks a monster with increased number of attacks and more damage unless it has resistance to cold.");
\r
7454 if (!get_rep_dir2(&dir)) return NULL;
\r
7455 if (dir == 5) return NULL;
\r
7457 y = p_ptr->y + ddy[dir];
\r
7458 x = p_ptr->x + ddx[dir];
\r
7460 if (cave[y][x].m_idx)
\r
7461 py_attack(y, x, HISSATSU_COLD);
\r
7464 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7471 if (name) return _("急所突き", "Spot Aiming");
\r
7472 if (desc) return _("モンスターを一撃で倒す攻撃を繰り出す。失敗すると1点しかダメージを与えられない。",
\r
7473 "Attempts to kill a monster instantly. If failed cause only 1HP of damage.");
\r
7479 if (!get_rep_dir2(&dir)) return NULL;
\r
7480 if (dir == 5) return NULL;
\r
7482 y = p_ptr->y + ddy[dir];
\r
7483 x = p_ptr->x + ddx[dir];
\r
7485 if (cave[y][x].m_idx)
\r
7486 py_attack(y, x, HISSATSU_KYUSHO);
\r
7489 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7496 if (name) return _("魔神斬り", "Majingiri");
\r
7497 if (desc) return _("会心の一撃で攻撃する。攻撃がかわされやすい。",
\r
7498 "Attempts to attack with critical hit. But this attack is easy to evade for a monster.");
\r
7504 if (!get_rep_dir2(&dir)) return NULL;
\r
7505 if (dir == 5) return NULL;
\r
7507 y = p_ptr->y + ddy[dir];
\r
7508 x = p_ptr->x + ddx[dir];
\r
7510 if (cave[y][x].m_idx)
\r
7511 py_attack(y, x, HISSATSU_MAJIN);
\r
7514 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7521 if (name) return _("捨て身", "Desperate Attack");
\r
7522 if (desc) return _("強力な攻撃を繰り出す。次のターンまでの間、食らうダメージが増える。",
\r
7523 "Attacks with all of your power. But all damages you take will be doubled for one turn.");
\r
7529 if (!get_rep_dir2(&dir)) return NULL;
\r
7530 if (dir == 5) return NULL;
\r
7532 y = p_ptr->y + ddy[dir];
\r
7533 x = p_ptr->x + ddx[dir];
\r
7535 if (cave[y][x].m_idx)
\r
7536 py_attack(y, x, HISSATSU_SUTEMI);
\r
7539 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7542 p_ptr->sutemi = TRUE;
\r
7547 if (name) return _("雷撃鷲爪斬", "Lightning Eagle");
\r
7548 if (desc) return _("電撃耐性のないモンスターに非常に大きいダメージを与える。",
\r
7549 "Attacks a monster with more damage unless it has resistance to electricity.");
\r
7555 if (!get_rep_dir2(&dir)) return NULL;
\r
7556 if (dir == 5) return NULL;
\r
7558 y = p_ptr->y + ddy[dir];
\r
7559 x = p_ptr->x + ddx[dir];
\r
7561 if (cave[y][x].m_idx)
\r
7562 py_attack(y, x, HISSATSU_ELEC);
\r
7565 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7572 if (name) return _("入身", "Rush Attack");
\r
7573 if (desc) return _("素早く相手に近寄り攻撃する。", "Steps close to a monster and attacks at a time.");
\r
7577 if (!rush_attack(NULL)) return NULL;
\r
7582 if (name) return _("赤流渦", "Bloody Maelstrom");
\r
7583 if (desc) return _("自分自身も傷を作りつつ、その傷が深いほど大きい威力で全方向の敵を攻撃できる。生きていないモンスターには効果がない。",
\r
7584 "Attacks all adjacent monsters with power corresponding to your cut status. Then increases your cut status. No effect to unliving monsters.");
\r
7591 monster_type *m_ptr;
\r
7593 if (p_ptr->cut < 300)
\r
7594 set_cut(p_ptr->cut + 300);
\r
7596 set_cut(p_ptr->cut * 2);
\r
7598 for (dir = 0; dir < 8; dir++)
\r
7600 y = p_ptr->y + ddy_ddd[dir];
\r
7601 x = p_ptr->x + ddx_ddd[dir];
\r
7602 c_ptr = &cave[y][x];
\r
7604 /* Get the monster */
\r
7605 m_ptr = &m_list[c_ptr->m_idx];
\r
7607 /* Hack -- attack monsters */
\r
7608 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
\r
7610 if (!monster_living(&r_info[m_ptr->r_idx]))
\r
7614 monster_desc(m_name, m_ptr, 0);
\r
7615 msg_format(_("%sには効果がない!", "%s is unharmed!"), m_name);
\r
7617 else py_attack(y, x, HISSATSU_SEKIRYUKA);
\r
7624 if (name) return _("激震撃", "Earthquake Blow");
\r
7625 if (desc) return _("地震を起こす。", "Shakes dungeon structure, and results in random swapping of floors and walls.");
\r
7631 if (!get_rep_dir2(&dir)) return NULL;
\r
7632 if (dir == 5) return NULL;
\r
7634 y = p_ptr->y + ddy[dir];
\r
7635 x = p_ptr->x + ddx[dir];
\r
7637 if (cave[y][x].m_idx)
\r
7638 py_attack(y, x, HISSATSU_QUAKE);
\r
7640 earthquake(p_ptr->y, p_ptr->x, 10);
\r
7645 if (name) return _("地走り", "Crack");
\r
7646 if (desc) return _("衝撃波のビームを放つ。", "Fires a beam of shock wave.");
\r
7650 int total_damage = 0, basedam, i;
\r
7651 u32b flgs[TR_FLAG_SIZE];
\r
7652 object_type *o_ptr;
\r
7653 if (!get_aim_dir(&dir)) return NULL;
\r
7654 msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
\r
7655 for (i = 0; i < 2; i++)
\r
7659 if (!buki_motteruka(INVEN_RARM+i)) break;
\r
7660 o_ptr = &inventory[INVEN_RARM+i];
\r
7661 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
\r
7662 damage = o_ptr->to_d * 100;
\r
7663 object_flags(o_ptr, flgs);
\r
7664 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
\r
7666 /* vorpal blade */
\r
7670 else if (have_flag(flgs, TR_VORPAL))
\r
7672 /* vorpal flag only */
\r
7676 damage += basedam;
\r
7677 damage *= p_ptr->num_blow[i];
\r
7678 total_damage += damage / 200;
\r
7679 if (i) total_damage = total_damage*7/10;
\r
7681 fire_beam(GF_FORCE, dir, total_damage);
\r
7686 if (name) return _("気迫の雄叫び", "War Cry");
\r
7687 if (desc) return _("視界内の全モンスターに対して轟音の攻撃を行う。さらに、近くにいるモンスターを怒らせる。",
\r
7688 "Damages all monsters in sight with sound. Aggravate nearby monsters.");
\r
7692 msg_print(_("雄叫びをあげた!", "You roar out!"));
\r
7693 project_hack(GF_SOUND, randint1(plev * 3));
\r
7694 aggravate_monsters(0);
\r
7699 if (name) return _("無双三段", "Musou-Sandan");
\r
7700 if (desc) return _("強力な3段攻撃を繰り出す。", "Attacks with powerful 3 strikes.");
\r
7706 if (!get_rep_dir2(&dir)) return NULL;
\r
7707 if (dir == 5) return NULL;
\r
7709 for (i = 0; i < 3; i++)
\r
7713 MONSTER_IDX m_idx;
\r
7715 monster_type *m_ptr;
\r
7717 y = p_ptr->y + ddy[dir];
\r
7718 x = p_ptr->x + ddx[dir];
\r
7719 c_ptr = &cave[y][x];
\r
7722 py_attack(y, x, HISSATSU_3DAN);
\r
7725 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7729 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
\r
7734 /* Monster is dead? */
\r
7735 if (!c_ptr->m_idx) break;
\r
7737 ny = y + ddy[dir];
\r
7738 nx = x + ddx[dir];
\r
7739 m_idx = c_ptr->m_idx;
\r
7740 m_ptr = &m_list[m_idx];
\r
7742 /* Monster cannot move back? */
\r
7743 if (!monster_can_enter(ny, nx, &r_info[m_ptr->r_idx], 0))
\r
7746 if (i < 2) msg_print(NULL);
\r
7751 cave[ny][nx].m_idx = m_idx;
\r
7755 update_mon(m_idx, TRUE);
\r
7757 /* Redraw the old spot */
\r
7760 /* Redraw the new spot */
\r
7761 lite_spot(ny, nx);
\r
7763 /* Player can move forward? */
\r
7764 if (player_can_enter(c_ptr->feat, 0))
\r
7766 /* Move the player */
\r
7767 if (!move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP)) break;
\r
7775 if (i < 2) msg_print(NULL);
\r
7781 if (name) return _("吸血鬼の牙", "Vampire's Fang");
\r
7782 if (desc) return _("攻撃した相手の体力を吸いとり、自分の体力を回復させる。生命を持たないモンスターには通じない。",
\r
7783 "Attacks with vampiric strikes which absorbs HP from a monster and gives them to you. No effect to unliving monsters.");
\r
7789 if (!get_rep_dir2(&dir)) return NULL;
\r
7790 if (dir == 5) return NULL;
\r
7792 y = p_ptr->y + ddy[dir];
\r
7793 x = p_ptr->x + ddx[dir];
\r
7795 if (cave[y][x].m_idx)
\r
7796 py_attack(y, x, HISSATSU_DRAIN);
\r
7799 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7806 if (name) return _("幻惑", "Moon Dazzling");
\r
7807 if (desc) return _("視界内の起きている全モンスターに朦朧、混乱、眠りを与えようとする。", "Attempts to stun, confuse and sleep all waking monsters.");
\r
7811 msg_print(_("武器を不規則に揺らした...", "You irregularly wave your weapon..."));
\r
7812 project_hack(GF_ENGETSU, plev * 4);
\r
7813 project_hack(GF_ENGETSU, plev * 4);
\r
7814 project_hack(GF_ENGETSU, plev * 4);
\r
7819 if (name) return _("百人斬り", "Hundred Slaughter");
\r
7820 if (desc) return _("連続して入身でモンスターを攻撃する。攻撃するたびにMPを消費。MPがなくなるか、モンスターを倒せなかったら百人斬りは終了する。",
\r
7821 "Performs a series of rush attacks. The series continues while killing each monster in a time and SP remains.");
\r
7825 const int mana_cost_per_monster = 8;
\r
7826 bool is_new = TRUE;
\r
7831 if (!rush_attack(&mdeath)) break;
\r
7834 /* Reserve needed mana point */
\r
7835 p_ptr->csp -= technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
\r
7839 p_ptr->csp -= mana_cost_per_monster;
\r
7841 if (!mdeath) break;
\r
7844 p_ptr->redraw |= PR_MANA;
\r
7847 while (p_ptr->csp > mana_cost_per_monster);
\r
7849 if (is_new) return NULL;
\r
7851 /* Restore reserved mana */
\r
7852 p_ptr->csp += technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
\r
7857 if (name) return _("天翔龍閃", "Dragonic Flash");
\r
7858 if (desc) return _("視界内の場所を指定して、その場所と自分の間にいる全モンスターを攻撃し、その場所に移動する。",
\r
7859 "Runs toward given location while attacking all monsters on the path.");
\r
7865 if (!tgt_pt(&x, &y)) return NULL;
\r
7867 if (!cave_player_teleportable_bold(y, x, 0L) ||
\r
7868 (distance(y, x, p_ptr->y, p_ptr->x) > MAX_SIGHT / 2) ||
\r
7869 !projectable(p_ptr->y, p_ptr->x, y, x))
\r
7871 msg_print(_("失敗!", "You cannot move to that place!"));
\r
7874 if (p_ptr->anti_tele)
\r
7876 msg_print(_("不思議な力がテレポートを防いだ!", "A mysterious force prevents you from teleporting!"));
\r
7879 project(0, 0, y, x, HISSATSU_ISSEN, GF_ATTACK, PROJECT_BEAM | PROJECT_KILL, -1);
\r
7880 teleport_player_to(y, x, 0L);
\r
7885 if (name) return _("二重の剣撃", "Twin Slash");
\r
7886 if (desc) return _("1ターンで2度攻撃を行う。", "double attacks at a time.");
\r
7892 if (!get_rep_dir(&dir, FALSE)) return NULL;
\r
7894 y = p_ptr->y + ddy[dir];
\r
7895 x = p_ptr->x + ddx[dir];
\r
7897 if (cave[y][x].m_idx)
\r
7899 py_attack(y, x, 0);
\r
7900 if (cave[y][x].m_idx)
\r
7903 py_attack(y, x, 0);
\r
7908 msg_print(_("その方向にはモンスターはいません。", "You don't see any monster in this direction"));
\r
7915 if (name) return _("虎伏絶刀勢", "Kofuku-Zettousei");
\r
7916 if (desc) return _("強力な攻撃を行い、近くの場所にも効果が及ぶ。", "Performs a powerful attack which even effect nearby monsters.");
\r
7920 int total_damage = 0, basedam, i;
\r
7922 u32b flgs[TR_FLAG_SIZE];
\r
7923 object_type *o_ptr;
\r
7925 if (!get_rep_dir2(&dir)) return NULL;
\r
7926 if (dir == 5) return NULL;
\r
7928 y = p_ptr->y + ddy[dir];
\r
7929 x = p_ptr->x + ddx[dir];
\r
7931 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
\r
7933 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));
\r
7936 msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
\r
7937 for (i = 0; i < 2; i++)
\r
7940 if (!buki_motteruka(INVEN_RARM+i)) break;
\r
7941 o_ptr = &inventory[INVEN_RARM+i];
\r
7942 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
\r
7943 damage = o_ptr->to_d * 100;
\r
7944 object_flags(o_ptr, flgs);
\r
7945 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
\r
7947 /* vorpal blade */
\r
7951 else if (have_flag(flgs, TR_VORPAL))
\r
7953 /* vorpal flag only */
\r
7957 damage += basedam;
\r
7958 damage += p_ptr->to_d[i] * 100;
\r
7959 damage *= p_ptr->num_blow[i];
\r
7960 total_damage += (damage / 100);
\r
7962 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
7967 if (name) return _("慶雲鬼忍剣", "Keiun-Kininken");
\r
7968 if (desc) return _("自分もダメージをくらうが、相手に非常に大きなダメージを与える。アンデッドには特に効果がある。",
\r
7969 "Attacks a monster with extremely powerful damage. But you also takes some damages. Hurts a undead monster greatly.");
\r
7975 if (!get_rep_dir2(&dir)) return NULL;
\r
7976 if (dir == 5) return NULL;
\r
7978 y = p_ptr->y + ddy[dir];
\r
7979 x = p_ptr->x + ddx[dir];
\r
7981 if (cave[y][x].m_idx)
\r
7982 py_attack(y, x, HISSATSU_UNDEAD);
\r
7985 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7988 take_hit(DAMAGE_NOESCAPE, 100 + randint1(100), _("慶雲鬼忍剣を使った衝撃", "exhaustion on using Keiun-Kininken"), -1);
\r
7993 if (name) return _("切腹", "Harakiri");
\r
7994 if (desc) return _("「武士道とは、死ぬことと見つけたり。」", "'Busido is found in death'");
\r
7999 if (!get_check(_("本当に自殺しますか?", "Do you really want to commit suicide? "))) return NULL;
\r
8000 /* Special Verification for suicide */
\r
8001 prt(_("確認のため '@' を押して下さい。", "Please verify SUICIDE by typing the '@' sign: "), 0, 0);
\r
8006 if (i != '@') return NULL;
\r
8007 if (p_ptr->total_winner)
\r
8009 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
\r
8010 p_ptr->total_winner = TRUE;
\r
8014 msg_print(_("武士道とは、死ぬことと見つけたり。", "Meaning of Bushi-do is found in the death."));
\r
8015 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
\r
8025 * @brief 呪術領域の武器呪縛の対象にできる武器かどうかを返す。 / An "item_tester_hook" for offer
\r
8026 * @param o_ptr オブジェクト構造体の参照ポインタ
\r
8027 * @return 呪縛可能な武器ならばTRUEを返す
\r
8029 static bool item_tester_hook_weapon_except_bow(object_type *o_ptr)
\r
8031 switch (o_ptr->tval)
\r
8046 * @brief 呪術領域の各処理に使える呪われた装備かどうかを返す。 / An "item_tester_hook" for offer
\r
8047 * @param o_ptr オブジェクト構造体の参照ポインタ
\r
8048 * @return 使える装備ならばTRUEを返す
\r
8050 static bool item_tester_hook_cursed(object_type *o_ptr)
\r
8052 return (bool)(object_is_cursed(o_ptr));
\r
8056 * @brief 呪術領域魔法の各処理を行う
\r
8057 * @param spell 魔法ID
\r
8058 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_CONT / SPELL_STOP)
\r
8059 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
\r
8061 static cptr do_hex_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
8063 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
8064 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
8065 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
8066 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
8067 bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
\r
8068 bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
\r
8072 PLAYER_LEVEL plev = p_ptr->lev;
\r
8077 /*** 1st book (0-7) ***/
\r
8079 if (name) return _("邪なる祝福", "Evily blessing");
\r
8080 if (desc) return _("祝福により攻撃精度と防御力が上がる。", "Attempts to increase +to_hit of a weapon and AC");
\r
8083 if (!p_ptr->blessed)
\r
8085 msg_print(_("高潔な気分になった!", "You feel righteous!"));
\r
8090 if (!p_ptr->blessed)
\r
8092 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
\r
8098 if (name) return _("軽傷の治癒", "Cure light wounds");
\r
8099 if (desc) return _("HPや傷を少し回復させる。", "Heals cut and HP a little.");
\r
8100 if (info) return info_heal(1, 10, 0);
\r
8103 msg_print(_("気分が良くなってくる。", "You feel better and better."));
\r
8107 hp_player(damroll(1, 10));
\r
8108 set_cut(p_ptr->cut - 10);
\r
8113 if (name) return _("悪魔のオーラ", "Demonic aura");
\r
8114 if (desc) return _("炎のオーラを身にまとい、回復速度が速くなる。", "Gives fire aura and regeneration.");
\r
8117 msg_print(_("体が炎のオーラで覆われた。", "You have enveloped by fiery aura!"));
\r
8121 msg_print(_("炎のオーラが消え去った。", "Fiery aura disappeared."));
\r
8126 if (name) return _("悪臭霧", "Stinking mist");
\r
8127 if (desc) return _("視界内のモンスターに微弱量の毒のダメージを与える。", "Deals few damages of poison to all monsters in your sight.");
\r
8128 power = plev / 2 + 5;
\r
8129 if (info) return info_damage(1, power, 0);
\r
8132 project_hack(GF_POIS, randint1(power));
\r
8137 if (name) return _("腕力強化", "Extra might");
\r
8138 if (desc) return _("術者の腕力を上昇させる。", "Attempts to increase your strength.");
\r
8141 msg_print(_("何だか力が湧いて来る。", "You feel you get stronger."));
\r
8146 if (name) return _("武器呪縛", "Curse weapon");
\r
8147 if (desc) return _("装備している武器を呪う。", "Curses your weapon.");
\r
8152 char o_name[MAX_NLEN];
\r
8153 object_type *o_ptr;
\r
8154 u32b f[TR_FLAG_SIZE];
\r
8156 item_tester_hook = item_tester_hook_weapon_except_bow;
\r
8157 q = _("どれを呪いますか?", "Which weapon do you curse?");
\r
8158 s = _("武器を装備していない。", "You wield no weapons.");
\r
8160 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
\r
8162 o_ptr = &inventory[item];
\r
8163 object_desc(o_name, o_ptr, OD_NAME_ONLY);
\r
8164 object_flags(o_ptr, f);
\r
8166 if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
\r
8168 if (!one_in_(3) &&
\r
8169 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
\r
8171 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
\r
8174 if (o_ptr->to_d > 0)
\r
8176 o_ptr->to_d -= randint1(3) % 2;
\r
8177 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
\r
8179 if (o_ptr->to_h > 0)
\r
8181 o_ptr->to_h -= randint1(3) % 2;
\r
8182 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
\r
8184 if (o_ptr->to_a > 0)
\r
8186 o_ptr->to_a -= randint1(3) % 2;
\r
8187 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
\r
8189 msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
\r
8194 int curse_rank = 0;
\r
8195 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
\r
8196 o_ptr->curse_flags |= (TRC_CURSED);
\r
8198 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
\r
8201 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
\r
8204 o_ptr->curse_flags |= (TRC_TY_CURSE);
\r
8205 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
\r
8207 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
\r
8208 add_flag(o_ptr->art_flags, TR_VORPAL);
\r
8209 add_flag(o_ptr->art_flags, TR_VAMPIRIC);
\r
8210 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
\r
8215 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);
\r
8218 p_ptr->update |= (PU_BONUS);
\r
8224 if (name) return _("邪悪感知", "Evil detection");
\r
8225 if (desc) return _("周囲の邪悪なモンスターを感知する。", "Detects evil monsters.");
\r
8226 if (info) return info_range(MAX_SIGHT);
\r
8229 msg_print(_("邪悪な生物の存在を感じ取ろうとした。", "You attend to the presence of evil creatures."));
\r
8234 if (name) return _("我慢", "Patience");
\r
8235 if (desc) return _("数ターン攻撃を耐えた後、受けたダメージを地獄の業火として周囲に放出する。",
\r
8236 "Bursts hell fire strongly after patients any damage while few turns.");
\r
8237 power = MIN(200, (HEX_REVENGE_POWER(p_ptr) * 2));
\r
8238 if (info) return info_damage(0, 0, power);
\r
8241 int a = 3 - (p_ptr->pspeed - 100) / 10;
\r
8242 MAGIC_NUM2 r = 3 + randint1(3) + MAX(0, MIN(3, a));
\r
8244 if (HEX_REVENGE_TURN(p_ptr) > 0)
\r
8246 msg_print(_("すでに我慢をしている。", "You are already patienting."));
\r
8250 HEX_REVENGE_TYPE(p_ptr) = 1;
\r
8251 HEX_REVENGE_TURN(p_ptr) = r;
\r
8252 HEX_REVENGE_POWER(p_ptr) = 0;
\r
8253 msg_print(_("じっと耐えることにした。", "You decide to patient all damages."));
\r
8258 int rad = 2 + (power / 50);
\r
8260 HEX_REVENGE_TURN(p_ptr)--;
\r
8262 if ((HEX_REVENGE_TURN(p_ptr) <= 0) || (power >= 200))
\r
8264 msg_print(_("我慢が解かれた!", "Time for end of patioence!"));
\r
8267 project(0, rad, p_ptr->y, p_ptr->x, power, GF_HELL_FIRE,
\r
8268 (PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);
\r
8270 if (p_ptr->wizard)
\r
8272 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
\r
8276 HEX_REVENGE_TYPE(p_ptr) = 0;
\r
8277 HEX_REVENGE_TURN(p_ptr) = 0;
\r
8278 HEX_REVENGE_POWER(p_ptr) = 0;
\r
8283 /*** 2nd book (8-15) ***/
\r
8285 if (name) return _("氷の鎧", "Ice armor");
\r
8286 if (desc) return _("氷のオーラを身にまとい、防御力が上昇する。", "Gives fire aura and bonus to AC.");
\r
8289 msg_print(_("体が氷の鎧で覆われた。", "You have enveloped by ice armor!"));
\r
8293 msg_print(_("氷の鎧が消え去った。", "Ice armor disappeared."));
\r
8298 if (name) return _("重傷の治癒", "Cure serious wounds");
\r
8299 if (desc) return _("体力や傷を多少回復させる。", "Heals cut and HP more.");
\r
8300 if (info) return info_heal(2, 10, 0);
\r
8303 msg_print(_("気分が良くなってくる。", "You feel better and better."));
\r
8307 hp_player(damroll(2, 10));
\r
8308 set_cut((p_ptr->cut / 2) - 10);
\r
8313 if (name) return _("薬品吸入", "Inhail potion");
\r
8314 if (desc) return _("呪文詠唱を中止することなく、薬の効果を得ることができる。", "Quaffs a potion without canceling of casting a spell.");
\r
8317 CASTING_HEX_FLAGS(p_ptr) |= (1L << HEX_INHAIL);
\r
8318 do_cmd_quaff_potion();
\r
8319 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_INHAIL);
\r
8325 if (name) return _("衰弱の霧", "Hypodynamic mist");
\r
8326 if (desc) return _("視界内のモンスターに微弱量の衰弱属性のダメージを与える。",
\r
8327 "Deals few damages of hypodynamia to all monsters in your sight.");
\r
8328 power = (plev / 2) + 5;
\r
8329 if (info) return info_damage(1, power, 0);
\r
8332 project_hack(GF_HYPODYNAMIA, randint1(power));
\r
8337 if (name) return _("魔剣化", "Swords to runeswords");
\r
8338 if (desc) return _("武器の攻撃力を上げる。切れ味を得、呪いに応じて与えるダメージが上昇し、善良なモンスターに対するダメージが2倍になる。",
\r
8339 "Gives vorpal ability to your weapon. Increases damages by your weapon acccording to curse of your weapon.");
\r
8343 msg_print("あなたの武器が黒く輝いた。");
\r
8345 if (!empty_hands(FALSE))
\r
8346 msg_print("Your weapons glow bright black.");
\r
8348 msg_print("Your weapon glows bright black.");
\r
8354 msg_print("武器の輝きが消え去った。");
\r
8356 msg_format("Brightness of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
\r
8362 if (name) return _("混乱の手", "Touch of confusion");
\r
8363 if (desc) return _("攻撃した際モンスターを混乱させる。", "Confuses a monster when you attack.");
\r
8366 msg_print(_("あなたの手が赤く輝き始めた。", "Your hands glow bright red."));
\r
8370 msg_print(_("手の輝きがなくなった。", "Brightness on your hands disappeard."));
\r
8375 if (name) return _("肉体強化", "Building up");
\r
8376 if (desc) return _("術者の腕力、器用さ、耐久力を上昇させる。攻撃回数の上限を 1 増加させる。",
\r
8377 "Attempts to increases your strength, dexterity and constitusion.");
\r
8380 msg_print(_("身体が強くなった気がした。", "You feel your body is developed more now."));
\r
8385 if (name) return _("反テレポート結界", "Anti teleport barrier");
\r
8386 if (desc) return _("視界内のモンスターのテレポートを阻害するバリアを張る。", "Obstructs all teleportations by monsters in your sight.");
\r
8387 power = plev * 3 / 2;
\r
8388 if (info) return info_power(power);
\r
8391 msg_print(_("テレポートを防ぐ呪いをかけた。", "You feel anyone can not teleport except you."));
\r
8395 /*** 3rd book (16-23) ***/
\r
8397 if (name) return _("衝撃のクローク", "Cloak of shock");
\r
8398 if (desc) return _("電気のオーラを身にまとい、動きが速くなる。", "Gives lightning aura and a bonus to speed.");
\r
8401 msg_print(_("体が稲妻のオーラで覆われた。", "You have enveloped by electrical aura!"));
\r
8405 msg_print(_("稲妻のオーラが消え去った。", "Electrical aura disappeared."));
\r
8410 if (name) return _("致命傷の治癒", "Cure critical wounds");
\r
8411 if (desc) return _("体力や傷を回復させる。", "Heals cut and HP greatry.");
\r
8412 if (info) return info_heal(4, 10, 0);
\r
8415 msg_print(_("気分が良くなってくる。", "You feel better and better."));
\r
8419 hp_player(damroll(4, 10));
\r
8427 if (name) return _("呪力封入", "Recharging");
\r
8428 if (desc) return _("魔法の道具に魔力を再充填する。", "Recharges a magic device.");
\r
8430 if (info) return info_power(power);
\r
8433 if (!recharge(power)) return NULL;
\r
8439 if (name) return _("死者復活", "Animate Dead");
\r
8440 if (desc) return _("死体を蘇らせてペットにする。", "Raises corpses and skeletons from dead.");
\r
8443 msg_print(_("死者への呼びかけを始めた。", "You start to call deads.!"));
\r
8447 animate_dead(0, p_ptr->y, p_ptr->x);
\r
8452 if (name) return _("防具呪縛", "Curse armor");
\r
8453 if (desc) return _("装備している防具に呪いをかける。", "Curse a piece of armour that you wielding.");
\r
8458 char o_name[MAX_NLEN];
\r
8459 object_type *o_ptr;
\r
8460 u32b f[TR_FLAG_SIZE];
\r
8462 item_tester_hook = object_is_armour;
\r
8463 q = _("どれを呪いますか?", "Which piece of armour do you curse?");
\r
8464 s = _("防具を装備していない。", "You wield no piece of armours.");
\r
8466 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
\r
8468 o_ptr = &inventory[item];
\r
8469 object_desc(o_name, o_ptr, OD_NAME_ONLY);
\r
8470 object_flags(o_ptr, f);
\r
8472 if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
\r
8474 if (!one_in_(3) &&
\r
8475 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
\r
8477 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
\r
8480 if (o_ptr->to_d > 0)
\r
8482 o_ptr->to_d -= randint1(3) % 2;
\r
8483 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
\r
8485 if (o_ptr->to_h > 0)
\r
8487 o_ptr->to_h -= randint1(3) % 2;
\r
8488 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
\r
8490 if (o_ptr->to_a > 0)
\r
8492 o_ptr->to_a -= randint1(3) % 2;
\r
8493 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
\r
8495 msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
\r
8500 int curse_rank = 0;
\r
8501 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
\r
8502 o_ptr->curse_flags |= (TRC_CURSED);
\r
8504 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
\r
8507 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
\r
8510 o_ptr->curse_flags |= (TRC_TY_CURSE);
\r
8511 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
\r
8513 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
\r
8514 add_flag(o_ptr->art_flags, TR_RES_POIS);
\r
8515 add_flag(o_ptr->art_flags, TR_RES_DARK);
\r
8516 add_flag(o_ptr->art_flags, TR_RES_NETHER);
\r
8517 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
\r
8522 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);
\r
8525 p_ptr->update |= (PU_BONUS);
\r
8531 if (name) return _("影のクローク", "Cloak of shadow");
\r
8532 if (desc) return _("影のオーラを身にまとい、敵に影のダメージを与える。", "Gives aura of shadow.");
\r
8535 object_type *o_ptr = &inventory[INVEN_OUTER];
\r
8537 if (!o_ptr->k_idx)
\r
8539 msg_print(_("クロークを身につけていない!", "You don't ware any cloak."));
\r
8542 else if (!object_is_cursed(o_ptr))
\r
8544 msg_print(_("クロークは呪われていない!", "Your cloak is not cursed."));
\r
8549 msg_print(_("影のオーラを身にまとった。", "You have enveloped by shadow aura!"));
\r
8554 object_type *o_ptr = &inventory[INVEN_OUTER];
\r
8556 if ((!o_ptr->k_idx) || (!object_is_cursed(o_ptr)))
\r
8558 do_spell(REALM_HEX, spell, SPELL_STOP);
\r
8559 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << spell);
\r
8560 CASTING_HEX_NUM(p_ptr)--;
\r
8561 if (!SINGING_SONG_ID(p_ptr)) set_action(ACTION_NONE);
\r
8566 msg_print(_("影のオーラが消え去った。", "Shadow aura disappeared."));
\r
8571 if (name) return _("苦痛を魔力に", "Pains to mana");
\r
8572 if (desc) return _("視界内のモンスターに精神ダメージ与え、魔力を吸い取る。", "Deals psychic damages to all monsters in sight, and drains some mana.");
\r
8573 power = plev * 3 / 2;
\r
8574 if (info) return info_damage(1, power, 0);
\r
8577 project_hack(GF_PSI_DRAIN, randint1(power));
\r
8582 if (name) return _("目には目を", "Eye for an eye");
\r
8583 if (desc) return _("打撃や魔法で受けたダメージを、攻撃元のモンスターにも与える。", "Returns same damage which you got to the monster which damaged you.");
\r
8586 msg_print(_("復讐したい欲望にかられた。", "You wish strongly you want to revenge anything."));
\r
8590 /*** 4th book (24-31) ***/
\r
8592 if (name) return _("反増殖結界", "Anti multiply barrier");
\r
8593 if (desc) return _("その階の増殖するモンスターの増殖を阻止する。", "Obstructs all multiplying by monsters in entire floor.");
\r
8596 msg_print(_("増殖を阻止する呪いをかけた。", "You feel anyone can not already multiply."));
\r
8601 if (name) return _("全復活", "Restoration");
\r
8602 if (desc) return _("経験値を徐々に復活し、減少した能力値を回復させる。", "Restores experience and status.");
\r
8605 msg_print(_("体が元の活力を取り戻し始めた。", "You feel your lost status starting to return."));
\r
8609 bool flag = FALSE;
\r
8610 int d = (p_ptr->max_exp - p_ptr->exp);
\r
8611 int r = (p_ptr->exp / 20);
\r
8617 p_ptr->exp = p_ptr->max_exp;
\r
8621 /* Check the experience */
\r
8622 check_experience();
\r
8626 for (i = A_STR; i < 6; i ++)
\r
8628 if (p_ptr->stat_cur[i] < p_ptr->stat_max[i])
\r
8630 if (p_ptr->stat_cur[i] < 18)
\r
8631 p_ptr->stat_cur[i]++;
\r
8633 p_ptr->stat_cur[i] += 10;
\r
8635 if (p_ptr->stat_cur[i] > p_ptr->stat_max[i])
\r
8636 p_ptr->stat_cur[i] = p_ptr->stat_max[i];
\r
8638 /* Recalculate bonuses */
\r
8639 p_ptr->update |= (PU_BONUS);
\r
8647 msg_format(_("%sの呪文の詠唱をやめた。", "Finish casting '%^s'."), do_spell(REALM_HEX, HEX_RESTORE, SPELL_NAME));
\r
8648 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_RESTORE);
\r
8649 if (cont) CASTING_HEX_NUM(p_ptr)--;
\r
8650 if (CASTING_HEX_NUM(p_ptr)) p_ptr->action = ACTION_NONE;
\r
8652 /* Redraw status */
\r
8653 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
\r
8654 p_ptr->redraw |= (PR_EXTRA);
\r
8662 if (name) return _("呪力吸収", "Drain curse power");
\r
8663 if (desc) return _("呪われた武器の呪いを吸収して魔力を回復する。", "Drains curse on your weapon and heals SP a little.");
\r
8668 u32b f[TR_FLAG_SIZE];
\r
8669 object_type *o_ptr;
\r
8671 item_tester_hook = item_tester_hook_cursed;
\r
8672 q = _("どの装備品から吸収しますか?", "Which cursed equipment do you drain mana from?");
\r
8673 s = _("呪われたアイテムを装備していない。", "You have no cursed equipment.");
\r
8675 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
\r
8677 o_ptr = &inventory[item];
\r
8678 object_flags(o_ptr, f);
\r
8680 p_ptr->csp += (p_ptr->lev / 5) + randint1(p_ptr->lev / 5);
\r
8681 if (have_flag(f, TR_TY_CURSE) || (o_ptr->curse_flags & TRC_TY_CURSE)) p_ptr->csp += randint1(5);
\r
8682 if (p_ptr->csp > p_ptr->msp) p_ptr->csp = p_ptr->msp;
\r
8684 if (o_ptr->curse_flags & TRC_PERMA_CURSE)
\r
8688 else if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
\r
8692 msg_print(_("呪いを全て吸い取った。", "Heavy curse vanished away."));
\r
8693 o_ptr->curse_flags = 0L;
\r
8696 else if ((o_ptr->curse_flags & (TRC_CURSED)) && one_in_(3))
\r
8698 msg_print(_("呪いを全て吸い取った。", "Curse vanished away."));
\r
8699 o_ptr->curse_flags = 0L;
\r
8707 if (name) return _("吸血の刃", "Swords to vampires");
\r
8708 if (desc) return _("吸血属性で攻撃する。", "Gives vampiric ability to your weapon.");
\r
8712 msg_print("あなたの武器が血を欲している。");
\r
8714 if (!empty_hands(FALSE))
\r
8715 msg_print("Your weapons want more blood now.");
\r
8717 msg_print("Your weapon wants more blood now.");
\r
8723 msg_print("武器の渇望が消え去った。");
\r
8725 msg_format("Thirsty of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
\r
8731 if (name) return _("朦朧の言葉", "Word of stun");
\r
8732 if (desc) return _("視界内のモンスターを朦朧とさせる。", "Stuns all monsters in your sight.");
\r
8734 if (info) return info_power(power);
\r
8737 stun_monsters(power);
\r
8742 if (name) return _("影移動", "Moving into shadow");
\r
8743 if (desc) return _("モンスターの隣のマスに瞬間移動する。", "Teleports you close to a monster.");
\r
8750 for (i = 0; i < 3; i++)
\r
8752 if (!tgt_pt(&x, &y)) return FALSE;
\r
8756 for (dir = 0; dir < 8; dir++)
\r
8758 int dy = y + ddy_ddd[dir];
\r
8759 int dx = x + ddx_ddd[dir];
\r
8760 if (dir == 5) continue;
\r
8761 if(cave[dy][dx].m_idx) flag = TRUE;
\r
8764 if (!cave_empty_bold(y, x) || (cave[y][x].info & CAVE_ICKY) ||
\r
8765 (distance(y, x, p_ptr->y, p_ptr->x) > plev + 2))
\r
8767 msg_print(_("そこには移動できない。", "Can not teleport to there."));
\r
8773 if (flag && randint0(plev * plev / 2))
\r
8775 teleport_player_to(y, x, 0L);
\r
8779 msg_print(_("おっと!", "Oops!"));
\r
8780 teleport_player(30, 0L);
\r
8788 if (name) return _("反魔法結界", "Anti magic barrier");
\r
8789 if (desc) return _("視界内のモンスターの魔法を阻害するバリアを張る。", "Obstructs all magic spell of monsters in your sight.");
\r
8790 power = plev * 3 / 2;
\r
8791 if (info) return info_power(power);
\r
8794 msg_print(_("魔法を防ぐ呪いをかけた。", "You feel anyone can not cast spells except you."));
\r
8799 if (name) return _("復讐の宣告", "Revenge sentence");
\r
8800 if (desc) return _("数ターン後にそれまで受けたダメージに応じた威力の地獄の劫火の弾を放つ。",
\r
8801 "Fires a ball of hell fire to try revenging after few turns.");
\r
8802 power = HEX_REVENGE_POWER(p_ptr);
\r
8803 if (info) return info_damage(0, 0, power);
\r
8807 int a = 3 - (p_ptr->pspeed - 100) / 10;
\r
8808 r = 1 + randint1(2) + MAX(0, MIN(3, a));
\r
8810 if (HEX_REVENGE_TURN(p_ptr) > 0)
\r
8812 msg_print(_("すでに復讐は宣告済みだ。", "You already pronounced your revenge."));
\r
8816 HEX_REVENGE_TYPE(p_ptr) = 2;
\r
8817 HEX_REVENGE_TURN(p_ptr) = r;
\r
8818 msg_format(_("あなたは復讐を宣告した。あと %d ターン。", "You pronounce your revenge. %d turns left."), r);
\r
8823 HEX_REVENGE_TURN(p_ptr)--;
\r
8825 if (HEX_REVENGE_TURN(p_ptr) <= 0)
\r
8835 msg_print(_("復讐の時だ!", "Time to revenge!"));
\r
8837 while (!get_aim_dir(&dir));
\r
8839 fire_ball(GF_HELL_FIRE, dir, power, 1);
\r
8841 if (p_ptr->wizard)
\r
8843 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
\r
8848 msg_print(_("復讐する気が失せた。", "You are not a mood to revenge."));
\r
8850 HEX_REVENGE_POWER(p_ptr) = 0;
\r
8856 /* start casting */
\r
8857 if ((cast) && (add))
\r
8860 CASTING_HEX_FLAGS(p_ptr) |= 1L << (spell);
\r
8861 CASTING_HEX_NUM(p_ptr)++;
\r
8863 if (p_ptr->action != ACTION_SPELL) set_action(ACTION_SPELL);
\r
8866 /* Redraw status */
\r
8869 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
\r
8870 p_ptr->redraw |= (PR_EXTRA | PR_HP | PR_MANA);
\r
8878 * @brief 魔法処理のメインルーチン
\r
8879 * @param realm 魔法領域のID
\r
8880 * @param spell 各領域の魔法ID
\r
8881 * @param mode 求める処理
\r
8882 * @return 各領域魔法に各種テキストを求めた場合は文字列参照ポインタ、そうでない場合はNULLポインタを返す。
\r
8884 cptr do_spell(REALM_IDX realm, SPELL_IDX spell, BIT_FLAGS mode)
\r
8888 case REALM_LIFE: return do_life_spell(spell, mode);
\r
8889 case REALM_SORCERY: return do_sorcery_spell(spell, mode);
\r
8890 case REALM_NATURE: return do_nature_spell(spell, mode);
\r
8891 case REALM_CHAOS: return do_chaos_spell(spell, mode);
\r
8892 case REALM_DEATH: return do_death_spell(spell, mode);
\r
8893 case REALM_TRUMP: return do_trump_spell(spell, mode);
\r
8894 case REALM_ARCANE: return do_arcane_spell(spell, mode);
\r
8895 case REALM_CRAFT: return do_craft_spell(spell, mode);
\r
8896 case REALM_DAEMON: return do_daemon_spell(spell, mode);
\r
8897 case REALM_CRUSADE: return do_crusade_spell(spell, mode);
\r
8898 case REALM_MUSIC: return do_music_spell(spell, mode);
\r
8899 case REALM_HISSATSU: return do_hissatsu_spell(spell, mode);
\r
8900 case REALM_HEX: return do_hex_spell(spell, mode);
\r