3 @brief 魔法のインターフェイスと発動 / Purpose: Do everything for each spell
\r
6 2013 Deskull rearranged comment for Doxygen.
\r
10 #include "selfinfo.h"
\r
11 #include "cmd-quaff.h"
\r
12 #include "spells-summon.h"
\r
13 #include "realm-arcane.h"
\r
17 * 魔法の効果を「キャプション:ダイス+定数値」のフォーマットで出力する / Generate dice info string such as "foo 2d10"
\r
22 * @return フォーマットに従い整形された文字列
\r
24 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 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 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 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 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 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 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 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 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 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 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 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_craft_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
3856 int plev = p_ptr->lev;
\r
3861 if (name) return _("赤外線視力", "Infravision");
\r
3862 if (desc) return _("一定時間、赤外線視力が増強される。", "Gives infravision for a while.");
\r
3867 if (info) return info_duration(base, base);
\r
3871 set_tim_infra(base + randint1(base), FALSE);
\r
3877 if (name) return _("回復力強化", "Regeneration");
\r
3878 if (desc) return _("一定時間、回復力が増強される。", "Gives regeneration ability for a while.");
\r
3883 if (info) return info_duration(base, base);
\r
3887 set_tim_regen(base + randint1(base), FALSE);
\r
3893 if (name) return _("空腹充足", "Satisfy Hunger");
\r
3894 if (desc) return _("満腹になる。", "Satisfies hunger.");
\r
3899 set_food(PY_FOOD_MAX - 1);
\r
3905 if (name) return _("耐冷気", "Resist Cold");
\r
3906 if (desc) return _("一定時間、冷気への耐性を得る。装備による耐性に累積する。",
\r
3907 "Gives resistance to cold. This resistance can be added to which from equipment for more powerful resistance.");
\r
3912 if (info) return info_duration(base, base);
\r
3916 set_oppose_cold(randint1(base) + base, FALSE);
\r
3922 if (name) return _("耐火炎", "Resist Fire");
\r
3923 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
\r
3924 "Gives resistance to fire. This resistance can be added to which from equipment for more powerful resistance.");
\r
3929 if (info) return info_duration(base, base);
\r
3933 set_oppose_fire(randint1(base) + base, FALSE);
\r
3939 if (name) return _("士気高揚", "Heroism");
\r
3940 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
3945 if (info) return info_duration(base, base);
\r
3949 set_hero(randint1(base) + base, FALSE);
\r
3957 if (name) return _("耐電撃", "Resist Lightning");
\r
3958 if (desc) return _("一定時間、電撃への耐性を得る。装備による耐性に累積する。",
\r
3959 "Gives resistance to electricity. This resistance can be added to which from equipment for more powerful resistance.");
\r
3964 if (info) return info_duration(base, base);
\r
3968 set_oppose_elec(randint1(base) + base, FALSE);
\r
3974 if (name) return _("耐酸", "Resist Acid");
\r
3975 if (desc) return _("一定時間、酸への耐性を得る。装備による耐性に累積する。",
\r
3976 "Gives resistance to acid. This resistance can be added to which from equipment for more powerful resistance.");
\r
3981 if (info) return info_duration(base, base);
\r
3985 set_oppose_acid(randint1(base) + base, FALSE);
\r
3991 if (name) return _("透明視認", "See Invisibility");
\r
3992 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
\r
3997 if (info) return info_duration(base, base);
\r
4001 set_tim_invis(randint1(base) + base, FALSE);
\r
4007 if (name) return _("解呪", "Remove Curse");
\r
4008 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
\r
4013 if (remove_curse())
\r
4015 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
4022 if (name) return _("耐毒", "Resist Poison");
\r
4023 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",
\r
4024 "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");
\r
4029 if (info) return info_duration(base, base);
\r
4033 set_oppose_pois(randint1(base) + base, FALSE);
\r
4039 if (name) return _("狂戦士化", "Berserk");
\r
4040 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");
\r
4045 if (info) return info_duration(base, base);
\r
4049 set_shero(randint1(base) + base, FALSE);
\r
4057 if (name) return _("自己分析", "Self Knowledge");
\r
4058 if (desc) return _("現在の自分の状態を完全に知る。",
\r
4059 "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");
\r
4070 if (name) return _("対邪悪結界", "Protection from Evil");
\r
4071 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");
\r
4074 int base = 3 * plev;
\r
4077 if (info) return info_duration(base, sides);
\r
4081 set_protevil(randint1(sides) + base, FALSE);
\r
4087 if (name) return _("癒し", "Cure");
\r
4088 if (desc) return _("毒、朦朧状態、負傷を全快させ、幻覚を直す。", "Heals poison, stun, cut and hallucination completely.");
\r
4102 if (name) return _("魔法剣", "Mana Branding");
\r
4103 if (desc) return _("一定時間、武器に冷気、炎、電撃、酸、毒のいずれかの属性をつける。武器を持たないと使えない。",
\r
4104 "Makes current weapon some elemental branded. You must wield weapons.");
\r
4107 int base = plev / 2;
\r
4109 if (info) return info_duration(base, base);
\r
4113 if (!choose_ele_attack()) return NULL;
\r
4119 if (name) return _("テレパシー", "Telepathy");
\r
4120 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
\r
4126 if (info) return info_duration(base, sides);
\r
4130 set_tim_esp(randint1(sides) + base, FALSE);
\r
4136 if (name) return _("肌石化", "Stone Skin");
\r
4137 if (desc) return _("一定時間、ACを上昇させる。", "Gives bonus to AC for a while.");
\r
4143 if (info) return info_duration(base, sides);
\r
4147 set_shield(randint1(sides) + base, FALSE);
\r
4153 if (name) return _("全耐性", "Resistance");
\r
4154 if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
\r
4155 "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
4160 if (info) return info_duration(base, base);
\r
4164 set_oppose_acid(randint1(base) + base, FALSE);
\r
4165 set_oppose_elec(randint1(base) + base, FALSE);
\r
4166 set_oppose_fire(randint1(base) + base, FALSE);
\r
4167 set_oppose_cold(randint1(base) + base, FALSE);
\r
4168 set_oppose_pois(randint1(base) + base, FALSE);
\r
4174 if (name) return _("スピード", "Haste Self");
\r
4175 if (desc) return _("一定時間、加速する。", "Hastes you for a while.");
\r
4179 int sides = 20 + plev;
\r
4181 if (info) return info_duration(base, sides);
\r
4185 set_fast(randint1(sides) + base, FALSE);
\r
4191 if (name) return _("壁抜け", "Walk through Wall");
\r
4192 if (desc) return _("一定時間、半物質化し壁を通り抜けられるようになる。", "Gives ability to pass walls for a while.");
\r
4195 int base = plev / 2;
\r
4197 if (info) return info_duration(base, base);
\r
4201 set_kabenuke(randint1(base) + base, FALSE);
\r
4207 if (name) return _("盾磨き", "Polish Shield");
\r
4208 if (desc) return _("盾に反射の属性をつける。", "Makes a shield a shield of reflection.");
\r
4219 if (name) return _("ゴーレム製造", "Create Golem");
\r
4220 if (desc) return _("1体のゴーレムを製造する。", "Creates a golem.");
\r
4225 if (summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_GOLEM, PM_FORCE_PET))
\r
4227 msg_print(_("ゴーレムを作った。", "You make a golem."));
\r
4231 msg_print(_("うまくゴーレムを作れなかった。", "No Golems arrive."));
\r
4238 if (name) return _("魔法の鎧", "Magical armor");
\r
4239 if (desc) return _("一定時間、魔法防御力とACが上がり、混乱と盲目の耐性、反射能力、麻痺知らず、浮遊を得る。",
\r
4240 "Gives resistance to magic, bonus to AC, resistance to confusion, blindness, reflection, free action and levitation for a while.");
\r
4245 if (info) return info_duration(base, base);
\r
4249 set_magicdef(randint1(base) + base, FALSE);
\r
4255 if (name) return _("装備無力化", "Remove Enchantment");
\r
4256 if (desc) return _("武器・防具にかけられたあらゆる魔力を完全に解除する。", "Removes all magics completely from any weapon or armor.");
\r
4261 if (!mundane_spell(TRUE)) return NULL;
\r
4267 if (name) return _("呪い粉砕", "Remove All Curse");
\r
4268 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
\r
4273 if (remove_all_curse())
\r
4275 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
4282 if (name) return _("完全なる知識", "Knowledge True");
\r
4283 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
\r
4288 if (!identify_fully(FALSE)) return NULL;
\r
4294 if (name) return _("武器強化", "Enchant Weapon");
\r
4295 if (desc) return _("武器の命中率修正とダメージ修正を強化する。", "Attempts to increase +to-hit, +to-dam of a weapon.");
\r
4300 if (!enchant_spell(randint0(4) + 1, randint0(4) + 1, 0)) return NULL;
\r
4306 if (name) return _("防具強化", "Enchant Armor");
\r
4307 if (desc) return _("鎧の防御修正を強化する。", "Attempts to increase +AC of an armor.");
\r
4312 if (!enchant_spell(0, 0, randint0(3) + 2)) return NULL;
\r
4318 if (name) return _("武器属性付与", "Brand Weapon");
\r
4319 if (desc) return _("武器にランダムに属性をつける。", "Makes current weapon a random ego weapon.");
\r
4324 brand_weapon(randint0(18));
\r
4330 if (name) return _("人間トランプ", "Living Trump");
\r
4331 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",
\r
4332 "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");
\r
4340 /* Teleport control */
\r
4343 /* Random teleportation (uncontrolled) */
\r
4346 /* Gain the mutation */
\r
4347 if (gain_random_mutation(mutation))
\r
4349 msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));
\r
4356 if (name) return _("属性への免疫", "Immunity");
\r
4357 if (desc) return _("一定時間、冷気、炎、電撃、酸のいずれかに対する免疫を得る。",
\r
4358 "Gives an immunity to fire, cold, electricity or acid for a while.");
\r
4363 if (info) return info_duration(base, base);
\r
4367 if (!choose_ele_immune(base + randint1(base))) return NULL;
\r
4377 * @brief 悪魔領域魔法の各処理を行う
\r
4378 * @param spell 魔法ID
\r
4379 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
4380 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
4382 static cptr do_daemon_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
4384 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
4385 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
4386 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
4387 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
4388 static const char s_dam[] = _("損傷:", "dam ");
\r
4391 int plev = p_ptr->lev;
\r
4396 if (name) return _("マジック・ミサイル", "Magic Missile");
\r
4397 if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");
\r
4400 int dice = 3 + (plev - 1) / 5;
\r
4403 if (info) return info_damage(dice, sides, 0);
\r
4407 if (!get_aim_dir(&dir)) return NULL;
\r
4409 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));
\r
4415 if (name) return _("無生命感知", "Detect Unlife");
\r
4416 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
\r
4419 int rad = DETECT_RAD_DEFAULT;
\r
4421 if (info) return info_radius(rad);
\r
4425 detect_monsters_nonliving(rad);
\r
4431 if (name) return _("邪なる祝福", "Evil Bless");
\r
4432 if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
\r
4437 if (info) return info_duration(base, base);
\r
4441 set_blessed(randint1(base) + base, FALSE);
\r
4447 if (name) return _("耐火炎", "Resist Fire");
\r
4448 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
\r
4449 "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");
\r
4454 if (info) return info_duration(base, base);
\r
4458 set_oppose_fire(randint1(base) + base, FALSE);
\r
4464 if (name) return _("恐慌", "Horrify");
\r
4465 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
\r
4470 if (info) return info_power(power);
\r
4474 if (!get_aim_dir(&dir)) return NULL;
\r
4476 fear_monster(dir, power);
\r
4477 stun_monster(dir, power);
\r
4483 if (name) return _("地獄の矢", "Nether Bolt");
\r
4484 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
\r
4487 int dice = 6 + (plev - 5) / 4;
\r
4490 if (info) return info_damage(dice, sides, 0);
\r
4494 if (!get_aim_dir(&dir)) return NULL;
\r
4496 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
\r
4502 if (name) return _("古代の死霊召喚", "Summon Manes");
\r
4503 if (desc) return _("古代の死霊を召喚する。", "Summons a manes.");
\r
4508 if (!summon_specific(-1, p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET)))
\r
4510 msg_print(_("古代の死霊は現れなかった。", "No Manes arrive."));
\r
4517 if (name) return _("地獄の焔", "Hellish Flame");
\r
4518 if (desc) return _("邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",
\r
4519 "Fires a ball of evil power. Hurts good monsters greatly.");
\r
4524 int rad = (plev < 30) ? 2 : 3;
\r
4527 if (p_ptr->pclass == CLASS_MAGE ||
\r
4528 p_ptr->pclass == CLASS_HIGH_MAGE ||
\r
4529 p_ptr->pclass == CLASS_SORCERER)
\r
4530 base = plev + plev / 2;
\r
4532 base = plev + plev / 4;
\r
4535 if (info) return info_damage(dice, sides, base);
\r
4539 if (!get_aim_dir(&dir)) return NULL;
\r
4541 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides) + base, rad);
\r
4547 if (name) return _("デーモン支配", "Dominate Demon");
\r
4548 if (desc) return _("悪魔1体を魅了する。抵抗されると無効", "Attempts to charm a demon.");
\r
4553 if (info) return info_power(power);
\r
4557 if (!get_aim_dir(&dir)) return NULL;
\r
4559 control_one_demon(dir, power);
\r
4565 if (name) return _("ビジョン", "Vision");
\r
4566 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
\r
4569 int rad = DETECT_RAD_MAP;
\r
4571 if (info) return info_radius(rad);
\r
4581 if (name) return _("耐地獄", "Resist Nether");
\r
4582 if (desc) return _("一定時間、地獄への耐性を得る。", "Gives resistance to nether for a while.");
\r
4587 if (info) return info_duration(base, base);
\r
4591 set_tim_res_nether(randint1(base) + base, FALSE);
\r
4597 if (name) return _("プラズマ・ボルト", "Plasma bolt");
\r
4598 if (desc) return _("プラズマのボルトもしくはビームを放つ。", "Fires a bolt or beam of plasma.");
\r
4601 int dice = 11 + (plev - 5) / 4;
\r
4604 if (info) return info_damage(dice, sides, 0);
\r
4608 if (!get_aim_dir(&dir)) return NULL;
\r
4610 fire_bolt_or_beam(beam_chance(), GF_PLASMA, dir, damroll(dice, sides));
\r
4616 if (name) return _("ファイア・ボール", "Fire Ball");
\r
4617 if (desc) return _("炎の球を放つ。", "Fires a ball of fire.");
\r
4620 HIT_POINT dam = plev + 55;
\r
4623 if (info) return info_damage(0, 0, dam);
\r
4627 if (!get_aim_dir(&dir)) return NULL;
\r
4629 fire_ball(GF_FIRE, dir, dam, rad);
\r
4635 if (name) return _("炎の刃", "Fire Branding");
\r
4636 if (desc) return _("武器に炎の属性をつける。", "Makes current weapon fire branded.");
\r
4647 if (name) return _("地獄球", "Nether Ball");
\r
4648 if (desc) return _("大きな地獄の球を放つ。", "Fires a huge ball of nether.");
\r
4651 HIT_POINT dam = plev * 3 / 2 + 100;
\r
4652 int rad = plev / 20 + 2;
\r
4654 if (info) return info_damage(0, 0, dam);
\r
4658 if (!get_aim_dir(&dir)) return NULL;
\r
4660 fire_ball(GF_NETHER, dir, dam, rad);
\r
4666 if (name) return _("デーモン召喚", "Summon Demon");
\r
4667 if (desc) return _("悪魔1体を召喚する。", "Summons a demon.");
\r
4672 bool pet = !one_in_(3);
\r
4675 if (pet) flg |= PM_FORCE_PET;
\r
4676 else flg |= PM_NO_PET;
\r
4677 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
\r
4679 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, plev*2/3+randint1(plev/2), SUMMON_DEMON, flg))
\r
4681 msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));
\r
4685 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
\r
4689 msg_print(_("「卑しき者よ、我は汝の下僕にあらず! お前の魂を頂くぞ!」",
\r
4690 "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));
\r
4695 msg_print(_("悪魔は現れなかった。", "No demons arrive."));
\r
4703 if (name) return _("悪魔の目", "Devilish Eye");
\r
4704 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
\r
4710 if (info) return info_duration(base, sides);
\r
4714 set_tim_esp(randint1(sides) + base, FALSE);
\r
4720 if (name) return _("悪魔のクローク", "Devil Cloak");
\r
4721 if (desc) return _("恐怖を取り除き、一定時間、炎と冷気の耐性、炎のオーラを得る。耐性は装備による耐性に累積する。",
\r
4722 "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
4725 TIME_EFFECT base = 20;
\r
4727 if (info) return info_duration(base, base);
\r
4731 TIME_EFFECT dur = randint1(base) + base;
\r
4733 set_oppose_fire(dur, FALSE);
\r
4734 set_oppose_cold(dur, FALSE);
\r
4735 set_tim_sh_fire(dur, FALSE);
\r
4743 if (name) return _("溶岩流", "The Flow of Lava");
\r
4744 if (desc) return _("自分を中心とした炎の球を作り出し、床を溶岩に変える。",
\r
4745 "Generates a ball of fire centered on you which transforms floors to magma.");
\r
4748 HIT_POINT dam = (55 + plev) * 2;
\r
4751 if (info) return info_damage(0, 0, dam/2);
\r
4755 fire_ball(GF_FIRE, 0, dam, rad);
\r
4756 fire_ball_hide(GF_LAVA_FLOW, 0, 2 + randint1(2), rad);
\r
4762 if (name) return _("プラズマ球", "Plasma Ball");
\r
4763 if (desc) return _("プラズマの球を放つ。", "Fires a ball of plasma.");
\r
4766 HIT_POINT dam = plev * 3 / 2 + 80;
\r
4767 int rad = 2 + plev / 40;
\r
4769 if (info) return info_damage(0, 0, dam);
\r
4773 if (!get_aim_dir(&dir)) return NULL;
\r
4775 fire_ball(GF_PLASMA, dir, dam, rad);
\r
4781 if (name) return _("悪魔変化", "Polymorph Demon");
\r
4782 if (desc) return _("一定時間、悪魔に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔としての能力を得る。",
\r
4783 "Mimic a demon for a while. Loses abilities of original race and gets abilities as a demon.");
\r
4786 int base = 10 + plev / 2;
\r
4788 if (info) return info_duration(base, base);
\r
4792 set_mimic(base + randint1(base), MIMIC_DEMON, FALSE);
\r
4798 if (name) return _("地獄の波動", "Nather Wave");
\r
4799 if (desc) return _("視界内の全てのモンスターにダメージを与える。善良なモンスターに特に大きなダメージを与える。",
\r
4800 "Damages all monsters in sight. Hurts good monsters greatly.");
\r
4803 int sides1 = plev * 2;
\r
4804 int sides2 = plev * 2;
\r
4806 if (info) return format("%sd%d+d%d", s_dam, sides1, sides2);
\r
4810 dispel_monsters(randint1(sides1));
\r
4811 dispel_good(randint1(sides2));
\r
4817 if (name) return _("サキュバスの接吻", "Kiss of Succubus");
\r
4818 if (desc) return _("因果混乱の球を放つ。", "Fires a ball of nexus.");
\r
4821 HIT_POINT dam = 100 + plev * 2;
\r
4824 if (info) return info_damage(0, 0, dam);
\r
4828 if (!get_aim_dir(&dir)) return NULL;
\r
4829 fire_ball(GF_NEXUS, dir, dam, rad);
\r
4835 if (name) return _("破滅の手", "Doom Hand");
\r
4836 if (desc) return _("破滅の手を放つ。食らったモンスターはそのときのHPの半分前後のダメージを受ける。", "Attempts to make a monster's HP almost half.");
\r
4841 if (!get_aim_dir(&dir))
\r
4844 msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));
\r
4846 fire_ball_hide(GF_HAND_DOOM, dir, plev * 2, 0);
\r
4852 if (name) return _("士気高揚", "Raise the Morale");
\r
4853 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
4858 if (info) return info_duration(base, base);
\r
4862 set_hero(randint1(base) + base, FALSE);
\r
4870 if (name) return _("不滅の肉体", "Immortal Body");
\r
4871 if (desc) return _("一定時間、時間逆転への耐性を得る。", "Gives resistance to time for a while.");
\r
4876 if (info) return info_duration(base, base);
\r
4880 set_tim_res_time(randint1(base)+base, FALSE);
\r
4886 if (name) return _("狂気の円環", "Insanity Circle");
\r
4887 if (desc) return _("自分を中心としたカオスの球、混乱の球を発生させ、近くのモンスターを魅了する。",
\r
4888 "Generate balls of chaos, confusion and charm centered on you.");
\r
4891 HIT_POINT dam = 50 + plev;
\r
4892 int power = 20 + plev;
\r
4893 int rad = 3 + plev / 20;
\r
4895 if (info) return format("%s%d+%d", s_dam, dam/2, dam/2);
\r
4899 fire_ball(GF_CHAOS, 0, dam, rad);
\r
4900 fire_ball(GF_CONFUSION, 0, dam, rad);
\r
4901 fire_ball(GF_CHARM, 0, power, rad);
\r
4907 if (name) return _("ペット爆破", "Explode Pets");
\r
4908 if (desc) return _("全てのペットを強制的に爆破させる。", "Makes all pets explode.");
\r
4913 discharge_minion();
\r
4919 if (name) return _("グレーターデーモン召喚", "Summon Greater Demon");
\r
4920 if (desc) return _("上級デーモンを召喚する。召喚するには人間('p','h','t'で表されるモンスター)の死体を捧げなければならない。",
\r
4921 "Summons greater demon. It need to sacrifice a corpse of human ('p','h' or 't').");
\r
4926 if (!cast_summon_greater_demon()) return NULL;
\r
4932 if (name) return _("地獄嵐", "Nether Storm");
\r
4933 if (desc) return _("超巨大な地獄の球を放つ。", "Generate a huge ball of nether.");
\r
4936 HIT_POINT dam = plev * 15;
\r
4937 int rad = plev / 5;
\r
4939 if (info) return info_damage(0, 0, dam);
\r
4943 if (!get_aim_dir(&dir)) return NULL;
\r
4945 fire_ball(GF_NETHER, dir, dam, rad);
\r
4951 if (name) return _("血の呪い", "Bloody Curse");
\r
4952 if (desc) return _("自分がダメージを受けることによって対象に呪いをかけ、ダメージを与え様々な効果を引き起こす。",
\r
4953 "Puts blood curse which damages and causes various effects on a monster. You also take damage.");
\r
4956 HIT_POINT dam = 600;
\r
4959 if (info) return info_damage(0, 0, dam);
\r
4963 if (!get_aim_dir(&dir)) return NULL;
\r
4965 fire_ball_hide(GF_BLOOD_CURSE, dir, dam, rad);
\r
4966 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("血の呪い", "Blood curse"), -1);
\r
4972 if (name) return _("魔王変化", "Polymorph Demonlord");
\r
4973 if (desc) return _("悪魔の王に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔の王としての能力を得、壁を破壊しながら歩く。",
\r
4974 "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
4979 if (info) return info_duration(base, base);
\r
4983 set_mimic(base + randint1(base), MIMIC_DEMON_LORD, FALSE);
\r
4993 * @brief 破邪領域魔法の各処理を行う
\r
4994 * @param spell 魔法ID
\r
4995 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
4996 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
4998 static cptr do_crusade_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
5000 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
5001 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
5002 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
5003 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
5006 int plev = p_ptr->lev;
\r
5011 if (name) return _("懲罰", "Punishment");
\r
5012 if (desc) return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");
\r
5015 int dice = 3 + (plev - 1) / 5;
\r
5018 if (info) return info_damage(dice, sides, 0);
\r
5022 if (!get_aim_dir(&dir)) return NULL;
\r
5024 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));
\r
5030 if (name) return _("邪悪存在感知", "Detect Evil");
\r
5031 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
\r
5034 int rad = DETECT_RAD_DEFAULT;
\r
5036 if (info) return info_radius(rad);
\r
5040 detect_monsters_evil(rad);
\r
5046 if (name) return _("恐怖除去", "Remove Fear");
\r
5047 if (desc) return _("恐怖を取り除く。", "Removes fear.");
\r
5058 if (name) return _("威圧", "Scare Monster");
\r
5059 if (desc) return _("モンスター1体を恐怖させる。抵抗されると無効。", "Attempts to scare a monster.");
\r
5064 if (info) return info_power(power);
\r
5068 if (!get_aim_dir(&dir)) return NULL;
\r
5070 fear_monster(dir, power);
\r
5076 if (name) return _("聖域", "Sanctuary");
\r
5077 if (desc) return _("隣接した全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep monsters in the adjacent squares.");
\r
5082 if (info) return info_power(power);
\r
5086 sleep_monsters_touch();
\r
5092 if (name) return _("入口", "Portal");
\r
5093 if (desc) return _("中距離のテレポートをする。", "Teleport medium distance.");
\r
5096 POSITION range = 25 + plev / 2;
\r
5098 if (info) return info_range(range);
\r
5102 teleport_player(range, 0L);
\r
5108 if (name) return _("スターダスト", "Star Dust");
\r
5109 if (desc) return _("ターゲット付近に閃光のボルトを連射する。", "Fires many bolts of light near the target.");
\r
5112 int dice = 3 + (plev - 1) / 9;
\r
5115 if (info) return info_multi_damage_dice(dice, sides);
\r
5119 if (!get_aim_dir(&dir)) return NULL;
\r
5120 fire_blast(GF_LITE, dir, dice, sides, 10, 3);
\r
5126 if (name) return _("身体浄化", "Purify");
\r
5127 if (desc) return _("傷、毒、朦朧から全快する。", "Heals all cut, stun and poison status.");
\r
5140 if (name) return _("邪悪飛ばし", "Scatter Evil");
\r
5141 if (desc) return _("邪悪なモンスター1体をテレポートさせる。抵抗されると無効。", "Attempts to teleport an evil monster away.");
\r
5144 int power = MAX_SIGHT * 5;
\r
5146 if (info) return info_power(power);
\r
5150 if (!get_aim_dir(&dir)) return NULL;
\r
5151 fire_ball(GF_AWAY_EVIL, dir, power, 0);
\r
5157 if (name) return _("聖なる光球", "Holy Orb");
\r
5158 if (desc) return _("聖なる力をもつ宝珠を放つ。邪悪なモンスターに対して大きなダメージを与えるが、善良なモンスターには効果がない。",
\r
5159 "Fires a ball with holy power. Hurts evil monsters greatly, but don't effect good monsters.");
\r
5164 int rad = (plev < 30) ? 2 : 3;
\r
5167 if (p_ptr->pclass == CLASS_PRIEST ||
\r
5168 p_ptr->pclass == CLASS_HIGH_MAGE ||
\r
5169 p_ptr->pclass == CLASS_SORCERER)
\r
5170 base = plev + plev / 2;
\r
5172 base = plev + plev / 4;
\r
5175 if (info) return info_damage(dice, sides, base);
\r
5179 if (!get_aim_dir(&dir)) return NULL;
\r
5181 fire_ball(GF_HOLY_FIRE, dir, damroll(dice, sides) + base, rad);
\r
5187 if (name) return _("悪魔払い", "Exorcism");
\r
5188 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与え、邪悪なモンスターを恐怖させる。",
\r
5189 "Damages all undead and demons in sight, and scares all evil monsters in sight.");
\r
5195 if (info) return info_damage(1, sides, 0);
\r
5199 dispel_undead(randint1(sides));
\r
5200 dispel_demons(randint1(sides));
\r
5207 if (name) return _("解呪", "Remove Curse");
\r
5208 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
\r
5213 if (remove_curse())
\r
5215 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
5222 if (name) return _("透明視認", "Sense Unseen");
\r
5223 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
\r
5228 if (info) return info_duration(base, base);
\r
5232 set_tim_invis(randint1(base) + base, FALSE);
\r
5238 if (name) return _("対邪悪結界", "Protection from Evil");
\r
5239 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");
\r
5243 int sides = 3 * plev;
\r
5245 if (info) return info_duration(base, sides);
\r
5249 set_protevil(randint1(sides) + base, FALSE);
\r
5255 if (name) return _("裁きの雷", "Judgment Thunder");
\r
5256 if (desc) return _("強力な電撃のボルトを放つ。", "Fires a powerful bolt of lightning.");
\r
5259 HIT_POINT dam = plev * 5;
\r
5261 if (info) return info_damage(0, 0, dam);
\r
5265 if (!get_aim_dir(&dir)) return NULL;
\r
5266 fire_bolt(GF_ELEC, dir, dam);
\r
5272 if (name) return _("聖なる御言葉", "Holy Word");
\r
5273 if (desc) return _("視界内の邪悪な存在に大きなダメージを与え、体力を回復し、毒、恐怖、朦朧状態、負傷から全快する。",
\r
5274 "Damages all evil monsters in sight, heals HP somewhat, and completely heals poison, fear, stun and cut status.");
\r
5277 int dam_sides = plev * 6;
\r
5280 if (info) return format(_("損:1d%d/回%d", "dam:d%d/h%d"), dam_sides, heal);
\r
5283 dispel_evil(randint1(dam_sides));
\r
5294 if (name) return _("開かれた道", "Unbarring Ways");
\r
5295 if (desc) return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");
\r
5300 if (!get_aim_dir(&dir)) return NULL;
\r
5302 destroy_door(dir);
\r
5308 if (name) return _("封魔", "Arrest");
\r
5309 if (desc) return _("邪悪なモンスターの動きを止める。", "Attempts to paralyze an evil monster.");
\r
5312 int power = plev * 2;
\r
5314 if (info) return info_power(power);
\r
5318 if (!get_aim_dir(&dir)) return NULL;
\r
5325 if (name) return _("聖なるオーラ", "Holy Aura");
\r
5326 if (desc) return _("一定時間、邪悪なモンスターを傷つける聖なるオーラを得る。",
\r
5327 "Gives aura of holy power which injures evil monsters which attacked you for a while.");
\r
5332 if (info) return info_duration(base, base);
\r
5336 set_tim_sh_holy(randint1(base) + base, FALSE);
\r
5342 if (name) return _("アンデッド&悪魔退散", "Dispel Undead & Demons");
\r
5343 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与える。", "Damages all undead and demons in sight.");
\r
5346 int sides = plev * 4;
\r
5348 if (info) return info_damage(1, sides, 0);
\r
5352 dispel_undead(randint1(sides));
\r
5353 dispel_demons(randint1(sides));
\r
5359 if (name) return _("邪悪退散", "Dispel Evil");
\r
5360 if (desc) return _("視界内の全ての邪悪なモンスターにダメージを与える。", "Damages all evil monsters in sight.");
\r
5363 int sides = plev * 4;
\r
5365 if (info) return info_damage(1, sides, 0);
\r
5369 dispel_evil(randint1(sides));
\r
5375 if (name) return _("聖なる刃", "Holy Blade");
\r
5376 if (desc) return _("通常の武器に滅邪の属性をつける。", "Makes current weapon especially deadly against evil monsters.");
\r
5387 if (name) return _("スターバースト", "Star Burst");
\r
5388 if (desc) return _("巨大な閃光の球を放つ。", "Fires a huge ball of powerful light.");
\r
5391 HIT_POINT dam = 100 + plev * 2;
\r
5394 if (info) return info_damage(0, 0, dam);
\r
5398 if (!get_aim_dir(&dir)) return NULL;
\r
5400 fire_ball(GF_LITE, dir, dam, rad);
\r
5406 if (name) return _("天使召喚", "Summon Angel");
\r
5407 if (desc) return _("天使を1体召喚する。", "Summons an angel.");
\r
5412 bool pet = !one_in_(3);
\r
5415 if (pet) flg |= PM_FORCE_PET;
\r
5416 else flg |= PM_NO_PET;
\r
5417 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
\r
5419 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_ANGEL, flg))
\r
5423 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
\r
5427 msg_print(_("「我は汝の下僕にあらず! 悪行者よ、悔い改めよ!」", "Mortal! Repent of thy impiousness."));
\r
5435 if (name) return _("士気高揚", "Heroism");
\r
5436 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
5441 if (info) return info_duration(base, base);
\r
5445 set_hero(randint1(base) + base, FALSE);
\r
5453 if (name) return _("呪い退散", "Dispel Curse");
\r
5454 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
\r
5459 if (remove_all_curse())
\r
5461 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
5468 if (name) return _("邪悪追放", "Banish Evil");
\r
5469 if (desc) return _("視界内の全ての邪悪なモンスターをテレポートさせる。抵抗されると無効。",
\r
5470 "Teleports all evil monsters in sight away unless resisted.");
\r
5475 if (info) return info_power(power);
\r
5479 if (banish_evil(power))
\r
5481 msg_print(_("神聖な力が邪悪を打ち払った!", "The holy power banishes evil!"));
\r
5488 if (name) return _("ハルマゲドン", "Armageddon");
\r
5489 if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroy everything in nearby area.");
\r
5497 destroy_area(p_ptr->y, p_ptr->x, base + randint1(sides), FALSE);
\r
5503 if (name) return _("目には目を", "An Eye for an Eye");
\r
5504 if (desc) return _("一定時間、自分がダメージを受けたときに攻撃を行ったモンスターに対して同等のダメージを与える。",
\r
5505 "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
5510 if (info) return info_duration(base, base);
\r
5514 set_tim_eyeeye(randint1(base) + base, FALSE);
\r
5520 if (name) return _("神の怒り", "Wrath of the God");
\r
5521 if (desc) return _("ターゲットの周囲に分解の球を多数落とす。", "Drops many balls of disintegration near the target.");
\r
5524 HIT_POINT dam = plev * 3 + 25;
\r
5527 if (info) return info_multi_damage(dam);
\r
5531 if (!cast_wrath_of_the_god(dam, rad)) return NULL;
\r
5537 if (name) return _("神威", "Divine Intervention");
\r
5538 if (desc) return _("隣接するモンスターに聖なるダメージを与え、視界内のモンスターにダメージ、減速、朦朧、混乱、恐怖、眠りを与える。さらに体力を回復する。",
\r
5539 "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
5542 int b_dam = plev * 11;
\r
5543 int d_dam = plev * 4;
\r
5545 int power = plev * 4;
\r
5547 if (info) return format(_("回%d/損%d+%d", "h%d/dm%d+%d"), heal, d_dam, b_dam/2);
\r
5550 project(0, 1, p_ptr->y, p_ptr->x, b_dam, GF_HOLY_FIRE, PROJECT_KILL, -1);
\r
5551 dispel_monsters(d_dam);
\r
5552 slow_monsters(plev);
\r
5553 stun_monsters(power);
\r
5554 confuse_monsters(power);
\r
5555 turn_monsters(power);
\r
5556 stasis_monsters(power);
\r
5563 if (name) return _("聖戦", "Crusade");
\r
5564 if (desc) return _("視界内の善良なモンスターをペットにしようとし、ならなかった場合及び善良でないモンスターを恐怖させる。さらに多数の加速された騎士を召喚し、ヒーロー、祝福、加速、対邪悪結界を得る。",
\r
5565 "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
5571 int sp_sides = 20 + plev;
\r
5572 int sp_base = plev;
\r
5576 for (i = 0; i < 12; i++)
\r
5579 POSITION my = 0, mx = 0;
\r
5583 scatter(&my, &mx, p_ptr->y, p_ptr->x, 4, 0);
\r
5585 /* Require empty grids */
\r
5586 if (cave_empty_bold2(my, mx)) break;
\r
5588 if (attempt < 0) continue;
\r
5589 summon_specific(-1, my, mx, plev, SUMMON_KNIGHTS, (PM_ALLOW_GROUP | PM_FORCE_PET | PM_HASTE));
\r
5591 set_hero(randint1(base) + base, FALSE);
\r
5592 set_blessed(randint1(base) + base, FALSE);
\r
5593 set_fast(randint1(sp_sides) + sp_base, FALSE);
\r
5594 set_protevil(randint1(base) + base, FALSE);
\r
5607 * @param spell 歌ID
\r
5608 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP)
\r
5609 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
\r
5611 static cptr do_music_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
5613 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
5614 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
5615 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
5616 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
5617 bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
\r
5618 bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
\r
5619 bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
\r
5620 static const char s_dam[] = _("損傷:", "dam ");
\r
5623 int plev = p_ptr->lev;
\r
5628 if (name) return _("遅鈍の歌", "Song of Holding");
\r
5629 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
\r
5631 /* Stop singing before start another */
\r
5632 if (cast || fail) stop_singing();
\r
5636 msg_print(_("ゆっくりとしたメロディを口ずさみ始めた...", "You start humming a slow, steady melody..."));
\r
5637 start_singing(spell, MUSIC_SLOW);
\r
5643 if (info) return info_power(power);
\r
5647 slow_monsters(plev);
\r
5653 if (name) return _("祝福の歌", "Song of Blessing");
\r
5654 if (desc) return _("命中率とACのボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
\r
5656 /* Stop singing before start another */
\r
5657 if (cast || fail) stop_singing();
\r
5661 msg_print(_("厳かなメロディを奏で始めた...", "The holy power of the Music of the Ainur enters you..."));
\r
5662 start_singing(spell, MUSIC_BLESS);
\r
5667 if (!p_ptr->blessed)
\r
5669 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
\r
5676 if (name) return _("崩壊の音色", "Wrecking Note");
\r
5677 if (desc) return _("轟音のボルトを放つ。", "Fires a bolt of sound.");
\r
5679 /* Stop singing before start another */
\r
5680 if (cast || fail) stop_singing();
\r
5683 int dice = 4 + (plev - 1) / 5;
\r
5686 if (info) return info_damage(dice, sides, 0);
\r
5690 if (!get_aim_dir(&dir)) return NULL;
\r
5692 fire_bolt(GF_SOUND, dir, damroll(dice, sides));
\r
5698 if (name) return _("朦朧の旋律", "Stun Pattern");
\r
5699 if (desc) return _("視界内の全てのモンスターを朦朧させる。抵抗されると無効。", "Attempts to stun all monsters in sight.");
\r
5701 /* Stop singing before start another */
\r
5702 if (cast || fail) stop_singing();
\r
5706 msg_print(_("眩惑させるメロディを奏で始めた...", "You weave a pattern of sounds to bewilder and daze..."));
\r
5707 start_singing(spell, MUSIC_STUN);
\r
5711 int dice = plev / 10;
\r
5714 if (info) return info_power_dice(dice, sides);
\r
5718 stun_monsters(damroll(dice, sides));
\r
5725 if (name) return _("生命の流れ", "Flow of Life");
\r
5726 if (desc) return _("体力を少し回復させる。", "Heals HP a little.");
\r
5728 /* Stop singing before start another */
\r
5729 if (cast || fail) stop_singing();
\r
5733 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing a song of healing..."));
\r
5734 start_singing(spell, MUSIC_L_LIFE);
\r
5741 if (info) return info_heal(dice, sides, 0);
\r
5745 hp_player(damroll(dice, sides));
\r
5752 if (name) return _("太陽の歌", "Song of the Sun");
\r
5753 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
\r
5755 /* Stop singing before start another */
\r
5756 if (cast || fail) stop_singing();
\r
5760 int sides = plev / 2;
\r
5761 int rad = plev / 10 + 1;
\r
5763 if (info) return info_damage(dice, sides, 0);
\r
5767 msg_print(_("光り輝く歌が辺りを照らした。", "Your uplifting song brings brightness to dark places..."));
\r
5768 lite_area(damroll(dice, sides), rad);
\r
5774 if (name) return _("恐怖の歌", "Song of Fear");
\r
5775 if (desc) return _("視界内の全てのモンスターを恐怖させる。抵抗されると無効。", "Attempts to scare all monsters in sight.");
\r
5777 /* Stop singing before start another */
\r
5778 if (cast || fail) stop_singing();
\r
5782 msg_print(_("おどろおどろしいメロディを奏で始めた...", "You start weaving a fearful pattern..."));
\r
5783 start_singing(spell, MUSIC_FEAR);
\r
5789 if (info) return info_power(power);
\r
5793 project_hack(GF_TURN_ALL, power);
\r
5800 if (name) return _("戦いの歌", "Heroic Ballad");
\r
5801 if (desc) return _("ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
5803 /* Stop singing before start another */
\r
5804 if (cast || fail) stop_singing();
\r
5808 msg_print(_("激しい戦いの歌を歌った...", "You start singing a song of intense fighting..."));
\r
5810 (void)hp_player(10);
\r
5811 (void)set_afraid(0);
\r
5813 /* Recalculate hitpoints */
\r
5814 p_ptr->update |= (PU_HP);
\r
5816 start_singing(spell, MUSIC_HERO);
\r
5823 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
\r
5824 /* Recalculate hitpoints */
\r
5825 p_ptr->update |= (PU_HP);
\r
5832 if (name) return _("霊的知覚", "Clairaudience");
\r
5833 if (desc) return _("近くの罠/扉/階段を感知する。レベル15で全てのモンスター、20で財宝とアイテムを感知できるようになる。レベル25で周辺の地形を感知し、40でその階全体を永久に照らし、ダンジョン内のすべてのアイテムを感知する。この効果は歌い続けることで順に起こる。",
\r
5834 "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
5836 /* Stop singing before start another */
\r
5837 if (cast || fail) stop_singing();
\r
5841 msg_print(_("静かな音楽が感覚を研ぎ澄まさせた...", "Your quiet music sharpens your sense of hearing..."));
\r
5842 /* Hack -- Initialize the turn count */
\r
5843 SINGING_COUNT(p_ptr) = 0;
\r
5844 start_singing(spell, MUSIC_DETECT);
\r
5848 int rad = DETECT_RAD_DEFAULT;
\r
5850 if (info) return info_radius(rad);
\r
5854 int count = SINGING_COUNT(p_ptr);
\r
5856 if (count >= 19) wiz_lite(FALSE);
\r
5860 if (plev > 39 && count < 19)
\r
5861 SINGING_COUNT(p_ptr) = count + 1;
\r
5865 /* There are too many hidden treasure. So... */
\r
5866 /* detect_treasure(rad); */
\r
5867 detect_objects_gold(rad);
\r
5868 detect_objects_normal(rad);
\r
5870 if (plev > 24 && count < 11)
\r
5871 SINGING_COUNT(p_ptr) = count + 1;
\r
5875 detect_monsters_invis(rad);
\r
5876 detect_monsters_normal(rad);
\r
5878 if (plev > 19 && count < 6)
\r
5879 SINGING_COUNT(p_ptr) = count + 1;
\r
5881 detect_traps(rad, TRUE);
\r
5882 detect_doors(rad);
\r
5883 detect_stairs(rad);
\r
5885 if (plev > 14 && count < 3)
\r
5886 SINGING_COUNT(p_ptr) = count + 1;
\r
5893 if (name) return _("魂の歌", "Soul Shriek");
\r
5894 if (desc) return _("視界内の全てのモンスターに対して精神攻撃を行う。", "Damages all monsters in sight with PSI damages.");
\r
5896 /* Stop singing before start another */
\r
5897 if (cast || fail) stop_singing();
\r
5901 msg_print(_("精神を捻じ曲げる歌を歌った...", "You start singing a song of soul in pain..."));
\r
5902 start_singing(spell, MUSIC_PSI);
\r
5907 int sides = plev * 3 / 2;
\r
5909 if (info) return info_damage(dice, sides, 0);
\r
5913 project_hack(GF_PSI, damroll(dice, sides));
\r
5920 if (name) return _("知識の歌", "Song of Lore");
\r
5921 if (desc) return _("自分のいるマスと隣りのマスに落ちているアイテムを鑑定する。", "Identifies all items which are in the adjacent squares.");
\r
5923 /* Stop singing before start another */
\r
5924 if (cast || fail) stop_singing();
\r
5928 msg_print(_("この世界の知識が流れ込んできた...", "You recall the rich lore of the world..."));
\r
5929 start_singing(spell, MUSIC_ID);
\r
5935 if (info) return info_radius(rad);
\r
5939 * MP不足で鑑定が発動される前に歌が中断してしまうのを防止。
\r
5943 project(0, rad, p_ptr->y, p_ptr->x, 0, GF_IDENTIFY, PROJECT_ITEM, -1);
\r
5950 if (name) return _("隠遁の歌", "Hiding Tune");
\r
5951 if (desc) return _("隠密行動能力を上昇させる。", "Gives improved stealth.");
\r
5953 /* Stop singing before start another */
\r
5954 if (cast || fail) stop_singing();
\r
5958 msg_print(_("あなたの姿が景色にとけこんでいった...", "Your song carries you beyond the sight of mortal eyes..."));
\r
5959 start_singing(spell, MUSIC_STEALTH);
\r
5964 if (!p_ptr->tim_stealth)
\r
5966 msg_print(_("姿がはっきりと見えるようになった。", "You are no longer hided."));
\r
5973 if (name) return _("幻影の旋律", "Illusion Pattern");
\r
5974 if (desc) return _("視界内の全てのモンスターを混乱させる。抵抗されると無効。", "Attempts to confuse all monsters in sight.");
\r
5976 /* Stop singing before start another */
\r
5977 if (cast || fail) stop_singing();
\r
5981 msg_print(_("辺り一面に幻影が現れた...", "You weave a pattern of sounds to beguile and confuse..."));
\r
5982 start_singing(spell, MUSIC_CONF);
\r
5986 int power = plev * 2;
\r
5988 if (info) return info_power(power);
\r
5992 confuse_monsters(power);
\r
5999 if (name) return _("破滅の叫び", "Doomcall");
\r
6000 if (desc) return _("視界内の全てのモンスターに対して轟音攻撃を行う。", "Damages all monsters in sight with booming sound.");
\r
6002 /* Stop singing before start another */
\r
6003 if (cast || fail) stop_singing();
\r
6007 msg_print(_("轟音が響いた...", "The fury of the Downfall of Numenor lashes out..."));
\r
6008 start_singing(spell, MUSIC_SOUND);
\r
6012 int dice = 10 + plev / 5;
\r
6015 if (info) return info_damage(dice, sides, 0);
\r
6019 project_hack(GF_SOUND, damroll(dice, sides));
\r
6026 if (name) return _("フィリエルの歌", "Firiel's Song");
\r
6027 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
\r
6030 /* Stop singing before start another */
\r
6031 if (cast || fail) stop_singing();
\r
6035 msg_print(_("生命と復活のテーマを奏で始めた...", "The themes of life and revival are woven into your song..."));
\r
6036 animate_dead(0, p_ptr->y, p_ptr->x);
\r
6042 if (name) return _("旅の仲間", "Fellowship Chant");
\r
6043 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
\r
6045 /* Stop singing before start another */
\r
6046 if (cast || fail) stop_singing();
\r
6050 msg_print(_("安らかなメロディを奏で始めた...", "You weave a slow, soothing melody of imploration..."));
\r
6051 start_singing(spell, MUSIC_CHARM);
\r
6055 int dice = 10 + plev / 15;
\r
6058 if (info) return info_power_dice(dice, sides);
\r
6062 charm_monsters(damroll(dice, sides));
\r
6069 if (name) return _("分解音波", "Sound of disintegration");
\r
6070 if (desc) return _("壁を掘り進む。自分の足元のアイテムは蒸発する。", "Makes you be able to burrow into walls. Objects under your feet evaporate.");
\r
6072 /* Stop singing before start another */
\r
6073 if (cast || fail) stop_singing();
\r
6077 msg_print(_("粉砕するメロディを奏で始めた...", "You weave a violent pattern of sounds to break wall."));
\r
6078 start_singing(spell, MUSIC_WALL);
\r
6084 * MP不足で効果が発動される前に歌が中断してしまうのを防止。
\r
6088 project(0, 0, p_ptr->y, p_ptr->x,
\r
6089 0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1);
\r
6095 if (name) return _("元素耐性", "Finrod's Resistance");
\r
6096 if (desc) return _("酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
\r
6097 "Gives resistance to fire, cold, electricity, acid and poison. These resistances can be added to which from equipment for more powerful resistances.");
\r
6099 /* Stop singing before start another */
\r
6100 if (cast || fail) stop_singing();
\r
6104 msg_print(_("元素の力に対する忍耐の歌を歌った。", "You sing a song of perseverance against powers..."));
\r
6105 start_singing(spell, MUSIC_RESIST);
\r
6110 if (!p_ptr->oppose_acid)
\r
6112 msg_print(_("酸への耐性が薄れた気がする。", "You feel less resistant to acid."));
\r
6115 if (!p_ptr->oppose_elec)
\r
6117 msg_print(_("電撃への耐性が薄れた気がする。", "You feel less resistant to elec."));
\r
6120 if (!p_ptr->oppose_fire)
\r
6122 msg_print(_("火への耐性が薄れた気がする。", "You feel less resistant to fire."));
\r
6125 if (!p_ptr->oppose_cold)
\r
6127 msg_print(_("冷気への耐性が薄れた気がする。", "You feel less resistant to cold."));
\r
6130 if (!p_ptr->oppose_pois)
\r
6132 msg_print(_("毒への耐性が薄れた気がする。", "You feel less resistant to pois."));
\r
6139 if (name) return _("ホビットのメロディ", "Hobbit Melodies");
\r
6140 if (desc) return _("加速する。", "Hastes you.");
\r
6142 /* Stop singing before start another */
\r
6143 if (cast || fail) stop_singing();
\r
6147 msg_print(_("軽快な歌を口ずさみ始めた...", "You start singing joyful pop song..."));
\r
6148 start_singing(spell, MUSIC_SPEED);
\r
6155 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
\r
6162 if (name) return _("歪んだ世界", "World Contortion");
\r
6163 if (desc) return _("近くのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all nearby monsters away unless resisted.");
\r
6166 int rad = plev / 15 + 1;
\r
6167 int power = plev * 3 + 1;
\r
6169 if (info) return info_radius(rad);
\r
6171 /* Stop singing before start another */
\r
6172 if (cast || fail) stop_singing();
\r
6176 msg_print(_("歌が空間を歪めた...", "Reality whirls wildly as you sing a dizzying melody..."));
\r
6177 project(0, rad, p_ptr->y, p_ptr->x, power, GF_AWAY_ALL, PROJECT_KILL, -1);
\r
6183 if (name) return _("退散の歌", "Dispelling chant");
\r
6184 if (desc) return _("視界内の全てのモンスターにダメージを与える。邪悪なモンスターに特に大きなダメージを与える。",
\r
6185 "Damages all monsters in sight. Hurts evil monsters greatly.");
\r
6187 /* Stop singing before start another */
\r
6188 if (cast || fail) stop_singing();
\r
6192 msg_print(_("耐えられない不協和音が敵を責め立てた...", "You cry out in an ear-wracking voice..."));
\r
6193 start_singing(spell, MUSIC_DISPEL);
\r
6197 int m_sides = plev * 3;
\r
6198 int e_sides = plev * 3;
\r
6200 if (info) return format("%s1d%d+1d%d", s_dam, m_sides, e_sides);
\r
6204 dispel_monsters(randint1(m_sides));
\r
6205 dispel_evil(randint1(e_sides));
\r
6211 if (name) return _("サルマンの甘言", "The Voice of Saruman");
\r
6212 if (desc) return _("視界内の全てのモンスターを減速させ、眠らせようとする。抵抗されると無効。", "Attempts to slow and sleep all monsters in sight.");
\r
6214 /* Stop singing before start another */
\r
6215 if (cast || fail) stop_singing();
\r
6219 msg_print(_("優しく、魅力的な歌を口ずさみ始めた...", "You start humming a gentle and attractive song..."));
\r
6220 start_singing(spell, MUSIC_SARUMAN);
\r
6226 if (info) return info_power(power);
\r
6230 slow_monsters(plev);
\r
6231 sleep_monsters(plev);
\r
6238 if (name) return _("嵐の音色", "Song of the Tempest");
\r
6239 if (desc) return _("轟音のビームを放つ。", "Fires a beam of sound.");
\r
6242 int dice = 15 + (plev - 1) / 2;
\r
6245 if (info) return info_damage(dice, sides, 0);
\r
6247 /* Stop singing before start another */
\r
6248 if (cast || fail) stop_singing();
\r
6252 if (!get_aim_dir(&dir)) return NULL;
\r
6254 fire_beam(GF_SOUND, dir, damroll(dice, sides));
\r
6260 if (name) return _("もう一つの世界", "Ambarkanta");
\r
6261 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
\r
6267 if (info) return info_delay(base, sides);
\r
6269 /* Stop singing before start another */
\r
6270 if (cast || fail) stop_singing();
\r
6274 msg_print(_("周囲が変化し始めた...", "You sing of the primeval shaping of Middle-earth..."));
\r
6281 if (name) return _("破壊の旋律", "Wrecking Pattern");
\r
6282 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
\r
6283 "Shakes dungeon structure, and results in random swapping of floors and walls.");
\r
6285 /* Stop singing before start another */
\r
6286 if (cast || fail) stop_singing();
\r
6290 msg_print(_("破壊的な歌が響きわたった...", "You weave a pattern of sounds to contort and shatter..."));
\r
6291 start_singing(spell, MUSIC_QUAKE);
\r
6297 if (info) return info_radius(rad);
\r
6301 earthquake(p_ptr->y, p_ptr->x, 10);
\r
6309 if (name) return _("停滞の歌", "Stationary Shriek");
\r
6310 if (desc) return _("視界内の全てのモンスターを麻痺させようとする。抵抗されると無効。", "Attempts to freeze all monsters in sight.");
\r
6312 /* Stop singing before start another */
\r
6313 if (cast || fail) stop_singing();
\r
6317 msg_print(_("ゆっくりとしたメロディを奏で始めた...", "You weave a very slow pattern which is almost likely to stop..."));
\r
6318 start_singing(spell, MUSIC_STASIS);
\r
6322 int power = plev * 4;
\r
6324 if (info) return info_power(power);
\r
6328 stasis_monsters(power);
\r
6335 if (name) return _("守りの歌", "Endurance");
\r
6336 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。",
\r
6337 "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
6340 /* Stop singing before start another */
\r
6341 if (cast || fail) stop_singing();
\r
6345 msg_print(_("歌が神聖な場を作り出した...", "The holy power of the Music is creating sacred field..."));
\r
6352 if (name) return _("英雄の詩", "The Hero's Poem");
\r
6353 if (desc) return _("加速し、ヒーロー気分になり、視界内の全てのモンスターにダメージを与える。",
\r
6354 "Hastes you. Gives heroism. Damages all monsters in sight.");
\r
6356 /* Stop singing before start another */
\r
6357 if (cast || fail) stop_singing();
\r
6361 msg_print(_("英雄の歌を口ずさんだ...", "You chant a powerful, heroic call to arms..."));
\r
6362 (void)hp_player(10);
\r
6363 (void)set_afraid(0);
\r
6365 /* Recalculate hitpoints */
\r
6366 p_ptr->update |= (PU_HP);
\r
6368 start_singing(spell, MUSIC_SHERO);
\r
6375 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
\r
6376 /* Recalculate hitpoints */
\r
6377 p_ptr->update |= (PU_HP);
\r
6382 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
\r
6388 int sides = plev * 3;
\r
6390 if (info) return info_damage(dice, sides, 0);
\r
6394 dispel_monsters(damroll(dice, sides));
\r
6400 if (name) return _("ヤヴァンナの助け", "Relief of Yavanna");
\r
6401 if (desc) return _("強力な回復の歌で、負傷と朦朧状態も全快する。", "Powerful healing song. Also heals cut and stun completely.");
\r
6403 /* Stop singing before start another */
\r
6404 if (cast || fail) stop_singing();
\r
6408 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing the song..."));
\r
6409 start_singing(spell, MUSIC_H_LIFE);
\r
6416 if (info) return info_heal(dice, sides, 0);
\r
6420 hp_player(damroll(dice, sides));
\r
6429 if (name) return _("再生の歌", "Goddess' rebirth");
\r
6430 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
\r
6433 /* Stop singing before start another */
\r
6434 if (cast || fail) stop_singing();
\r
6438 msg_print(_("暗黒の中に光と美をふりまいた。体が元の活力を取り戻した。",
\r
6439 "You strewed light and beauty in the dark as you sing. You feel refreshed."));
\r
6440 (void)do_res_stat(A_STR);
\r
6441 (void)do_res_stat(A_INT);
\r
6442 (void)do_res_stat(A_WIS);
\r
6443 (void)do_res_stat(A_DEX);
\r
6444 (void)do_res_stat(A_CON);
\r
6445 (void)do_res_stat(A_CHR);
\r
6446 (void)restore_level();
\r
6452 if (name) return _("サウロンの魔術", "Wizardry of Sauron");
\r
6453 if (desc) return _("非常に強力でごく小さい轟音の球を放つ。", "Fires an extremely powerful tiny ball of sound.");
\r
6456 int dice = 50 + plev;
\r
6460 if (info) return info_damage(dice, sides, 0);
\r
6462 /* Stop singing before start another */
\r
6463 if (cast || fail) stop_singing();
\r
6467 if (!get_aim_dir(&dir)) return NULL;
\r
6469 fire_ball(GF_SOUND, dir, damroll(dice, sides), rad);
\r
6475 if (name) return _("フィンゴルフィンの挑戦", "Fingolfin's Challenge");
\r
6476 if (desc) return _("ダメージを受けなくなるバリアを張る。",
\r
6477 "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks.");
\r
6479 /* Stop singing before start another */
\r
6480 if (cast || fail) stop_singing();
\r
6484 msg_print(_("フィンゴルフィンの冥王への挑戦を歌った...",
\r
6485 "You recall the valor of Fingolfin's challenge to the Dark Lord..."));
\r
6488 p_ptr->redraw |= (PR_MAP);
\r
6490 /* Update monsters */
\r
6491 p_ptr->update |= (PU_MONSTERS);
\r
6493 /* Window stuff */
\r
6494 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
\r
6496 start_singing(spell, MUSIC_INVULN);
\r
6501 if (!p_ptr->invuln)
\r
6503 msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));
\r
6505 p_ptr->redraw |= (PR_MAP);
\r
6507 /* Update monsters */
\r
6508 p_ptr->update |= (PU_MONSTERS);
\r
6510 /* Window stuff */
\r
6511 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
\r
6522 * @brief 剣術の各処理を行う
\r
6523 * @param spell 剣術ID
\r
6524 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_CAST)
\r
6525 * @return SPELL_NAME / SPELL_DESC 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
6527 static cptr do_hissatsu_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
6529 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
6530 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
6531 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
6534 int plev = p_ptr->lev;
\r
6539 if (name) return _("飛飯綱", "Tobi-Izuna");
\r
6540 if (desc) return _("2マス離れたところにいるモンスターを攻撃する。", "Attacks a two squares distant monster.");
\r
6544 project_length = 2;
\r
6545 if (!get_aim_dir(&dir)) return NULL;
\r
6547 project_hook(GF_ATTACK, dir, HISSATSU_2, PROJECT_STOP | PROJECT_KILL);
\r
6552 if (name) return _("五月雨斬り", "3-Way Attack");
\r
6553 if (desc) return _("3方向に対して攻撃する。", "Attacks in 3 directions in one time.");
\r
6560 if (!get_rep_dir2(&dir)) return NULL;
\r
6561 if (dir == 5) return NULL;
\r
6563 for (cdir = 0;cdir < 8; cdir++)
\r
6565 if (cdd[cdir] == dir) break;
\r
6568 if (cdir == 8) return NULL;
\r
6570 y = p_ptr->y + ddy_cdd[cdir];
\r
6571 x = p_ptr->x + ddx_cdd[cdir];
\r
6572 if (cave[y][x].m_idx)
\r
6573 py_attack(y, x, 0);
\r
6575 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
\r
6577 y = p_ptr->y + ddy_cdd[(cdir + 7) % 8];
\r
6578 x = p_ptr->x + ddx_cdd[(cdir + 7) % 8];
\r
6579 if (cave[y][x].m_idx)
\r
6580 py_attack(y, x, 0);
\r
6582 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
\r
6584 y = p_ptr->y + ddy_cdd[(cdir + 1) % 8];
\r
6585 x = p_ptr->x + ddx_cdd[(cdir + 1) % 8];
\r
6586 if (cave[y][x].m_idx)
\r
6587 py_attack(y, x, 0);
\r
6589 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
\r
6594 if (name) return _("ブーメラン", "Boomerang");
\r
6595 if (desc) return _("武器を手元に戻ってくるように投げる。戻ってこないこともある。",
\r
6596 "Throws current weapon. And it'll return to your hand unless failed.");
\r
6600 if (!do_cmd_throw(1, TRUE, -1)) return NULL;
\r
6605 if (name) return _("焔霊", "Burning Strike");
\r
6606 if (desc) return _("火炎耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to fire.");
\r
6612 if (!get_rep_dir2(&dir)) return NULL;
\r
6613 if (dir == 5) return NULL;
\r
6615 y = p_ptr->y + ddy[dir];
\r
6616 x = p_ptr->x + ddx[dir];
\r
6618 if (cave[y][x].m_idx)
\r
6619 py_attack(y, x, HISSATSU_FIRE);
\r
6622 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
6629 if (name) return _("殺気感知", "Detect Ferocity");
\r
6630 if (desc) return _("近くの思考することができるモンスターを感知する。", "Detects all monsters except mindless in your vicinity.");
\r
6634 detect_monsters_mind(DETECT_RAD_DEFAULT);
\r
6639 if (name) return _("みね打ち", "Strike to Stun");
\r
6640 if (desc) return _("相手にダメージを与えないが、朦朧とさせる。", "Attempts to stun a monster in the adjacent.");
\r
6646 if (!get_rep_dir2(&dir)) return NULL;
\r
6647 if (dir == 5) return NULL;
\r
6649 y = p_ptr->y + ddy[dir];
\r
6650 x = p_ptr->x + ddx[dir];
\r
6652 if (cave[y][x].m_idx)
\r
6653 py_attack(y, x, HISSATSU_MINEUCHI);
\r
6656 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
6663 if (name) return _("カウンター", "Counter");
\r
6664 if (desc) return _("相手に攻撃されたときに反撃する。反撃するたびにMPを消費。",
\r
6665 "Prepares to counterattack. When attack by a monster, strikes back using SP each time.");
\r
6669 if (p_ptr->riding)
\r
6671 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
\r
6674 msg_print(_("相手の攻撃に対して身構えた。", "You prepare to counter blow."));
\r
6675 p_ptr->counter = TRUE;
\r
6680 if (name) return _("払い抜け", "Harainuke");
\r
6681 if (desc) return _("攻撃した後、反対側に抜ける。",
\r
6682 "Attacks monster with your weapons normally, then move through counter side of the monster.");
\r
6688 if (p_ptr->riding)
\r
6690 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
\r
6694 if (!get_rep_dir2(&dir)) return NULL;
\r
6696 if (dir == 5) return NULL;
\r
6697 y = p_ptr->y + ddy[dir];
\r
6698 x = p_ptr->x + ddx[dir];
\r
6700 if (!cave[y][x].m_idx)
\r
6702 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
6706 py_attack(y, x, 0);
\r
6708 if (!player_can_enter(cave[y][x].feat, 0) || is_trap(cave[y][x].feat))
\r
6714 if (player_can_enter(cave[y][x].feat, 0) && !is_trap(cave[y][x].feat) && !cave[y][x].m_idx)
\r
6718 /* Move the player */
\r
6719 (void)move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);
\r
6725 if (name) return _("サーペンツタン", "Serpent's Tongue");
\r
6726 if (desc) return _("毒耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to poison.");
\r
6732 if (!get_rep_dir2(&dir)) return NULL;
\r
6733 if (dir == 5) return NULL;
\r
6735 y = p_ptr->y + ddy[dir];
\r
6736 x = p_ptr->x + ddx[dir];
\r
6738 if (cave[y][x].m_idx)
\r
6739 py_attack(y, x, HISSATSU_POISON);
\r
6742 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
6749 if (name) return _("斬魔剣弐の太刀", "Zammaken");
\r
6750 if (desc) return _("生命のない邪悪なモンスターに大ダメージを与えるが、他のモンスターには全く効果がない。",
\r
6751 "Attacks an evil unliving monster with great damage. No effect to other monsters.");
\r
6757 if (!get_rep_dir2(&dir)) return NULL;
\r
6758 if (dir == 5) return NULL;
\r
6760 y = p_ptr->y + ddy[dir];
\r
6761 x = p_ptr->x + ddx[dir];
\r
6763 if (cave[y][x].m_idx)
\r
6764 py_attack(y, x, HISSATSU_ZANMA);
\r
6767 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
6774 if (name) return _("裂風剣", "Wind Blast");
\r
6775 if (desc) return _("攻撃した相手を後方へ吹き飛ばす。", "Attacks an adjacent monster, and blow it away.");
\r
6781 if (!get_rep_dir2(&dir)) return NULL;
\r
6782 if (dir == 5) return NULL;
\r
6784 y = p_ptr->y + ddy[dir];
\r
6785 x = p_ptr->x + ddx[dir];
\r
6787 if (cave[y][x].m_idx)
\r
6788 py_attack(y, x, 0);
\r
6791 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
6794 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
\r
6798 if (cave[y][x].m_idx)
\r
6801 POSITION ty = y, tx = x;
\r
6802 POSITION oy = y, ox = x;
\r
6803 MONSTER_IDX m_idx = cave[y][x].m_idx;
\r
6804 monster_type *m_ptr = &m_list[m_idx];
\r
6807 monster_desc(m_name, m_ptr, 0);
\r
6809 for (i = 0; i < 5; i++)
\r
6813 if (cave_empty_bold(y, x))
\r
6820 if ((ty != oy) || (tx != ox))
\r
6822 msg_format(_("%sを吹き飛ばした!", "You blow %s away!"), m_name);
\r
6823 cave[oy][ox].m_idx = 0;
\r
6824 cave[ty][tx].m_idx = m_idx;
\r
6828 update_mon(m_idx, TRUE);
\r
6829 lite_spot(oy, ox);
\r
6830 lite_spot(ty, tx);
\r
6832 if (r_info[m_ptr->r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))
\r
6833 p_ptr->update |= (PU_MON_LITE);
\r
6840 if (name) return _("刀匠の目利き", "Judge");
\r
6841 if (desc) return _("武器・防具を1つ識別する。レベル45以上で武器・防具の能力を完全に知ることができる。",
\r
6842 "Identifies a weapon or armor. Or *identifies* these at level 45.");
\r
6848 if (!identify_fully(TRUE)) return NULL;
\r
6852 if (!ident_spell(TRUE)) return NULL;
\r
6858 if (name) return _("破岩斬", "Rock Smash");
\r
6859 if (desc) return _("岩を壊し、岩石系のモンスターに大ダメージを与える。", "Breaks rock. Or greatly damage a monster made by rocks.");
\r
6865 if (!get_rep_dir2(&dir)) return NULL;
\r
6866 if (dir == 5) return NULL;
\r
6868 y = p_ptr->y + ddy[dir];
\r
6869 x = p_ptr->x + ddx[dir];
\r
6871 if (cave[y][x].m_idx)
\r
6872 py_attack(y, x, HISSATSU_HAGAN);
\r
6874 if (!cave_have_flag_bold(y, x, FF_HURT_ROCK)) break;
\r
6876 /* Destroy the feature */
\r
6877 cave_alter_feat(y, x, FF_HURT_ROCK);
\r
6879 /* Update some things */
\r
6880 p_ptr->update |= (PU_FLOW);
\r
6885 if (name) return _("乱れ雪月花", "Midare-Setsugekka");
\r
6886 if (desc) return _("攻撃回数が増え、冷気耐性のないモンスターに大ダメージを与える。",
\r
6887 "Attacks a monster with increased number of attacks and more damage unless it has resistance to cold.");
\r
6893 if (!get_rep_dir2(&dir)) return NULL;
\r
6894 if (dir == 5) return NULL;
\r
6896 y = p_ptr->y + ddy[dir];
\r
6897 x = p_ptr->x + ddx[dir];
\r
6899 if (cave[y][x].m_idx)
\r
6900 py_attack(y, x, HISSATSU_COLD);
\r
6903 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
6910 if (name) return _("急所突き", "Spot Aiming");
\r
6911 if (desc) return _("モンスターを一撃で倒す攻撃を繰り出す。失敗すると1点しかダメージを与えられない。",
\r
6912 "Attempts to kill a monster instantly. If failed cause only 1HP of damage.");
\r
6918 if (!get_rep_dir2(&dir)) return NULL;
\r
6919 if (dir == 5) return NULL;
\r
6921 y = p_ptr->y + ddy[dir];
\r
6922 x = p_ptr->x + ddx[dir];
\r
6924 if (cave[y][x].m_idx)
\r
6925 py_attack(y, x, HISSATSU_KYUSHO);
\r
6928 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
6935 if (name) return _("魔神斬り", "Majingiri");
\r
6936 if (desc) return _("会心の一撃で攻撃する。攻撃がかわされやすい。",
\r
6937 "Attempts to attack with critical hit. But this attack is easy to evade for a monster.");
\r
6943 if (!get_rep_dir2(&dir)) return NULL;
\r
6944 if (dir == 5) return NULL;
\r
6946 y = p_ptr->y + ddy[dir];
\r
6947 x = p_ptr->x + ddx[dir];
\r
6949 if (cave[y][x].m_idx)
\r
6950 py_attack(y, x, HISSATSU_MAJIN);
\r
6953 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
6960 if (name) return _("捨て身", "Desperate Attack");
\r
6961 if (desc) return _("強力な攻撃を繰り出す。次のターンまでの間、食らうダメージが増える。",
\r
6962 "Attacks with all of your power. But all damages you take will be doubled for one turn.");
\r
6968 if (!get_rep_dir2(&dir)) return NULL;
\r
6969 if (dir == 5) return NULL;
\r
6971 y = p_ptr->y + ddy[dir];
\r
6972 x = p_ptr->x + ddx[dir];
\r
6974 if (cave[y][x].m_idx)
\r
6975 py_attack(y, x, HISSATSU_SUTEMI);
\r
6978 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
6981 p_ptr->sutemi = TRUE;
\r
6986 if (name) return _("雷撃鷲爪斬", "Lightning Eagle");
\r
6987 if (desc) return _("電撃耐性のないモンスターに非常に大きいダメージを与える。",
\r
6988 "Attacks a monster with more damage unless it has resistance to electricity.");
\r
6994 if (!get_rep_dir2(&dir)) return NULL;
\r
6995 if (dir == 5) return NULL;
\r
6997 y = p_ptr->y + ddy[dir];
\r
6998 x = p_ptr->x + ddx[dir];
\r
7000 if (cave[y][x].m_idx)
\r
7001 py_attack(y, x, HISSATSU_ELEC);
\r
7004 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7011 if (name) return _("入身", "Rush Attack");
\r
7012 if (desc) return _("素早く相手に近寄り攻撃する。", "Steps close to a monster and attacks at a time.");
\r
7016 if (!rush_attack(NULL)) return NULL;
\r
7021 if (name) return _("赤流渦", "Bloody Maelstrom");
\r
7022 if (desc) return _("自分自身も傷を作りつつ、その傷が深いほど大きい威力で全方向の敵を攻撃できる。生きていないモンスターには効果がない。",
\r
7023 "Attacks all adjacent monsters with power corresponding to your cut status. Then increases your cut status. No effect to unliving monsters.");
\r
7030 monster_type *m_ptr;
\r
7032 if (p_ptr->cut < 300)
\r
7033 set_cut(p_ptr->cut + 300);
\r
7035 set_cut(p_ptr->cut * 2);
\r
7037 for (dir = 0; dir < 8; dir++)
\r
7039 y = p_ptr->y + ddy_ddd[dir];
\r
7040 x = p_ptr->x + ddx_ddd[dir];
\r
7041 c_ptr = &cave[y][x];
\r
7043 /* Get the monster */
\r
7044 m_ptr = &m_list[c_ptr->m_idx];
\r
7046 /* Hack -- attack monsters */
\r
7047 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
\r
7049 if (!monster_living(&r_info[m_ptr->r_idx]))
\r
7053 monster_desc(m_name, m_ptr, 0);
\r
7054 msg_format(_("%sには効果がない!", "%s is unharmed!"), m_name);
\r
7056 else py_attack(y, x, HISSATSU_SEKIRYUKA);
\r
7063 if (name) return _("激震撃", "Earthquake Blow");
\r
7064 if (desc) return _("地震を起こす。", "Shakes dungeon structure, and results in random swapping of floors and walls.");
\r
7070 if (!get_rep_dir2(&dir)) return NULL;
\r
7071 if (dir == 5) return NULL;
\r
7073 y = p_ptr->y + ddy[dir];
\r
7074 x = p_ptr->x + ddx[dir];
\r
7076 if (cave[y][x].m_idx)
\r
7077 py_attack(y, x, HISSATSU_QUAKE);
\r
7079 earthquake(p_ptr->y, p_ptr->x, 10);
\r
7084 if (name) return _("地走り", "Crack");
\r
7085 if (desc) return _("衝撃波のビームを放つ。", "Fires a beam of shock wave.");
\r
7089 int total_damage = 0, basedam, i;
\r
7090 u32b flgs[TR_FLAG_SIZE];
\r
7091 object_type *o_ptr;
\r
7092 if (!get_aim_dir(&dir)) return NULL;
\r
7093 msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
\r
7094 for (i = 0; i < 2; i++)
\r
7098 if (!buki_motteruka(INVEN_RARM+i)) break;
\r
7099 o_ptr = &inventory[INVEN_RARM+i];
\r
7100 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
\r
7101 damage = o_ptr->to_d * 100;
\r
7102 object_flags(o_ptr, flgs);
\r
7103 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
\r
7105 /* vorpal blade */
\r
7109 else if (have_flag(flgs, TR_VORPAL))
\r
7111 /* vorpal flag only */
\r
7115 damage += basedam;
\r
7116 damage *= p_ptr->num_blow[i];
\r
7117 total_damage += damage / 200;
\r
7118 if (i) total_damage = total_damage*7/10;
\r
7120 fire_beam(GF_FORCE, dir, total_damage);
\r
7125 if (name) return _("気迫の雄叫び", "War Cry");
\r
7126 if (desc) return _("視界内の全モンスターに対して轟音の攻撃を行う。さらに、近くにいるモンスターを怒らせる。",
\r
7127 "Damages all monsters in sight with sound. Aggravate nearby monsters.");
\r
7131 msg_print(_("雄叫びをあげた!", "You roar out!"));
\r
7132 project_hack(GF_SOUND, randint1(plev * 3));
\r
7133 aggravate_monsters(0);
\r
7138 if (name) return _("無双三段", "Musou-Sandan");
\r
7139 if (desc) return _("強力な3段攻撃を繰り出す。", "Attacks with powerful 3 strikes.");
\r
7145 if (!get_rep_dir2(&dir)) return NULL;
\r
7146 if (dir == 5) return NULL;
\r
7148 for (i = 0; i < 3; i++)
\r
7152 MONSTER_IDX m_idx;
\r
7154 monster_type *m_ptr;
\r
7156 y = p_ptr->y + ddy[dir];
\r
7157 x = p_ptr->x + ddx[dir];
\r
7158 c_ptr = &cave[y][x];
\r
7161 py_attack(y, x, HISSATSU_3DAN);
\r
7164 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7168 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
\r
7173 /* Monster is dead? */
\r
7174 if (!c_ptr->m_idx) break;
\r
7176 ny = y + ddy[dir];
\r
7177 nx = x + ddx[dir];
\r
7178 m_idx = c_ptr->m_idx;
\r
7179 m_ptr = &m_list[m_idx];
\r
7181 /* Monster cannot move back? */
\r
7182 if (!monster_can_enter(ny, nx, &r_info[m_ptr->r_idx], 0))
\r
7185 if (i < 2) msg_print(NULL);
\r
7190 cave[ny][nx].m_idx = m_idx;
\r
7194 update_mon(m_idx, TRUE);
\r
7196 /* Redraw the old spot */
\r
7199 /* Redraw the new spot */
\r
7200 lite_spot(ny, nx);
\r
7202 /* Player can move forward? */
\r
7203 if (player_can_enter(c_ptr->feat, 0))
\r
7205 /* Move the player */
\r
7206 if (!move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP)) break;
\r
7214 if (i < 2) msg_print(NULL);
\r
7220 if (name) return _("吸血鬼の牙", "Vampire's Fang");
\r
7221 if (desc) return _("攻撃した相手の体力を吸いとり、自分の体力を回復させる。生命を持たないモンスターには通じない。",
\r
7222 "Attacks with vampiric strikes which absorbs HP from a monster and gives them to you. No effect to unliving monsters.");
\r
7228 if (!get_rep_dir2(&dir)) return NULL;
\r
7229 if (dir == 5) return NULL;
\r
7231 y = p_ptr->y + ddy[dir];
\r
7232 x = p_ptr->x + ddx[dir];
\r
7234 if (cave[y][x].m_idx)
\r
7235 py_attack(y, x, HISSATSU_DRAIN);
\r
7238 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7245 if (name) return _("幻惑", "Moon Dazzling");
\r
7246 if (desc) return _("視界内の起きている全モンスターに朦朧、混乱、眠りを与えようとする。", "Attempts to stun, confuse and sleep all waking monsters.");
\r
7250 msg_print(_("武器を不規則に揺らした...", "You irregularly wave your weapon..."));
\r
7251 project_hack(GF_ENGETSU, plev * 4);
\r
7252 project_hack(GF_ENGETSU, plev * 4);
\r
7253 project_hack(GF_ENGETSU, plev * 4);
\r
7258 if (name) return _("百人斬り", "Hundred Slaughter");
\r
7259 if (desc) return _("連続して入身でモンスターを攻撃する。攻撃するたびにMPを消費。MPがなくなるか、モンスターを倒せなかったら百人斬りは終了する。",
\r
7260 "Performs a series of rush attacks. The series continues while killing each monster in a time and SP remains.");
\r
7264 const int mana_cost_per_monster = 8;
\r
7265 bool is_new = TRUE;
\r
7270 if (!rush_attack(&mdeath)) break;
\r
7273 /* Reserve needed mana point */
\r
7274 p_ptr->csp -= technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
\r
7278 p_ptr->csp -= mana_cost_per_monster;
\r
7280 if (!mdeath) break;
\r
7283 p_ptr->redraw |= PR_MANA;
\r
7286 while (p_ptr->csp > mana_cost_per_monster);
\r
7288 if (is_new) return NULL;
\r
7290 /* Restore reserved mana */
\r
7291 p_ptr->csp += technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
\r
7296 if (name) return _("天翔龍閃", "Dragonic Flash");
\r
7297 if (desc) return _("視界内の場所を指定して、その場所と自分の間にいる全モンスターを攻撃し、その場所に移動する。",
\r
7298 "Runs toward given location while attacking all monsters on the path.");
\r
7304 if (!tgt_pt(&x, &y)) return NULL;
\r
7306 if (!cave_player_teleportable_bold(y, x, 0L) ||
\r
7307 (distance(y, x, p_ptr->y, p_ptr->x) > MAX_SIGHT / 2) ||
\r
7308 !projectable(p_ptr->y, p_ptr->x, y, x))
\r
7310 msg_print(_("失敗!", "You cannot move to that place!"));
\r
7313 if (p_ptr->anti_tele)
\r
7315 msg_print(_("不思議な力がテレポートを防いだ!", "A mysterious force prevents you from teleporting!"));
\r
7318 project(0, 0, y, x, HISSATSU_ISSEN, GF_ATTACK, PROJECT_BEAM | PROJECT_KILL, -1);
\r
7319 teleport_player_to(y, x, 0L);
\r
7324 if (name) return _("二重の剣撃", "Twin Slash");
\r
7325 if (desc) return _("1ターンで2度攻撃を行う。", "double attacks at a time.");
\r
7331 if (!get_rep_dir(&dir, FALSE)) return NULL;
\r
7333 y = p_ptr->y + ddy[dir];
\r
7334 x = p_ptr->x + ddx[dir];
\r
7336 if (cave[y][x].m_idx)
\r
7338 py_attack(y, x, 0);
\r
7339 if (cave[y][x].m_idx)
\r
7342 py_attack(y, x, 0);
\r
7347 msg_print(_("その方向にはモンスターはいません。", "You don't see any monster in this direction"));
\r
7354 if (name) return _("虎伏絶刀勢", "Kofuku-Zettousei");
\r
7355 if (desc) return _("強力な攻撃を行い、近くの場所にも効果が及ぶ。", "Performs a powerful attack which even effect nearby monsters.");
\r
7359 int total_damage = 0, basedam, i;
\r
7361 u32b flgs[TR_FLAG_SIZE];
\r
7362 object_type *o_ptr;
\r
7364 if (!get_rep_dir2(&dir)) return NULL;
\r
7365 if (dir == 5) return NULL;
\r
7367 y = p_ptr->y + ddy[dir];
\r
7368 x = p_ptr->x + ddx[dir];
\r
7370 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
\r
7372 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));
\r
7375 msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
\r
7376 for (i = 0; i < 2; i++)
\r
7379 if (!buki_motteruka(INVEN_RARM+i)) break;
\r
7380 o_ptr = &inventory[INVEN_RARM+i];
\r
7381 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
\r
7382 damage = o_ptr->to_d * 100;
\r
7383 object_flags(o_ptr, flgs);
\r
7384 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
\r
7386 /* vorpal blade */
\r
7390 else if (have_flag(flgs, TR_VORPAL))
\r
7392 /* vorpal flag only */
\r
7396 damage += basedam;
\r
7397 damage += p_ptr->to_d[i] * 100;
\r
7398 damage *= p_ptr->num_blow[i];
\r
7399 total_damage += (damage / 100);
\r
7401 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
7406 if (name) return _("慶雲鬼忍剣", "Keiun-Kininken");
\r
7407 if (desc) return _("自分もダメージをくらうが、相手に非常に大きなダメージを与える。アンデッドには特に効果がある。",
\r
7408 "Attacks a monster with extremely powerful damage. But you also takes some damages. Hurts a undead monster greatly.");
\r
7414 if (!get_rep_dir2(&dir)) return NULL;
\r
7415 if (dir == 5) return NULL;
\r
7417 y = p_ptr->y + ddy[dir];
\r
7418 x = p_ptr->x + ddx[dir];
\r
7420 if (cave[y][x].m_idx)
\r
7421 py_attack(y, x, HISSATSU_UNDEAD);
\r
7424 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7427 take_hit(DAMAGE_NOESCAPE, 100 + randint1(100), _("慶雲鬼忍剣を使った衝撃", "exhaustion on using Keiun-Kininken"), -1);
\r
7432 if (name) return _("切腹", "Harakiri");
\r
7433 if (desc) return _("「武士道とは、死ぬことと見つけたり。」", "'Busido is found in death'");
\r
7438 if (!get_check(_("本当に自殺しますか?", "Do you really want to commit suicide? "))) return NULL;
\r
7439 /* Special Verification for suicide */
\r
7440 prt(_("確認のため '@' を押して下さい。", "Please verify SUICIDE by typing the '@' sign: "), 0, 0);
\r
7445 if (i != '@') return NULL;
\r
7446 if (p_ptr->total_winner)
\r
7448 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
\r
7449 p_ptr->total_winner = TRUE;
\r
7453 msg_print(_("武士道とは、死ぬことと見つけたり。", "Meaning of Bushi-do is found in the death."));
\r
7454 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
\r
7464 * @brief 呪術領域の武器呪縛の対象にできる武器かどうかを返す。 / An "item_tester_hook" for offer
\r
7465 * @param o_ptr オブジェクト構造体の参照ポインタ
\r
7466 * @return 呪縛可能な武器ならばTRUEを返す
\r
7468 static bool item_tester_hook_weapon_except_bow(object_type *o_ptr)
\r
7470 switch (o_ptr->tval)
\r
7485 * @brief 呪術領域の各処理に使える呪われた装備かどうかを返す。 / An "item_tester_hook" for offer
\r
7486 * @param o_ptr オブジェクト構造体の参照ポインタ
\r
7487 * @return 使える装備ならばTRUEを返す
\r
7489 static bool item_tester_hook_cursed(object_type *o_ptr)
\r
7491 return (bool)(object_is_cursed(o_ptr));
\r
7495 * @brief 呪術領域魔法の各処理を行う
\r
7496 * @param spell 魔法ID
\r
7497 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_CONT / SPELL_STOP)
\r
7498 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
\r
7500 static cptr do_hex_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
7502 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
7503 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
7504 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
7505 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
7506 bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
\r
7507 bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
\r
7511 PLAYER_LEVEL plev = p_ptr->lev;
\r
7516 /*** 1st book (0-7) ***/
\r
7518 if (name) return _("邪なる祝福", "Evily blessing");
\r
7519 if (desc) return _("祝福により攻撃精度と防御力が上がる。", "Attempts to increase +to_hit of a weapon and AC");
\r
7522 if (!p_ptr->blessed)
\r
7524 msg_print(_("高潔な気分になった!", "You feel righteous!"));
\r
7529 if (!p_ptr->blessed)
\r
7531 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
\r
7537 if (name) return _("軽傷の治癒", "Cure light wounds");
\r
7538 if (desc) return _("HPや傷を少し回復させる。", "Heals cut and HP a little.");
\r
7539 if (info) return info_heal(1, 10, 0);
\r
7542 msg_print(_("気分が良くなってくる。", "You feel better and better."));
\r
7546 hp_player(damroll(1, 10));
\r
7547 set_cut(p_ptr->cut - 10);
\r
7552 if (name) return _("悪魔のオーラ", "Demonic aura");
\r
7553 if (desc) return _("炎のオーラを身にまとい、回復速度が速くなる。", "Gives fire aura and regeneration.");
\r
7556 msg_print(_("体が炎のオーラで覆われた。", "You have enveloped by fiery aura!"));
\r
7560 msg_print(_("炎のオーラが消え去った。", "Fiery aura disappeared."));
\r
7565 if (name) return _("悪臭霧", "Stinking mist");
\r
7566 if (desc) return _("視界内のモンスターに微弱量の毒のダメージを与える。", "Deals few damages of poison to all monsters in your sight.");
\r
7567 power = plev / 2 + 5;
\r
7568 if (info) return info_damage(1, power, 0);
\r
7571 project_hack(GF_POIS, randint1(power));
\r
7576 if (name) return _("腕力強化", "Extra might");
\r
7577 if (desc) return _("術者の腕力を上昇させる。", "Attempts to increase your strength.");
\r
7580 msg_print(_("何だか力が湧いて来る。", "You feel you get stronger."));
\r
7585 if (name) return _("武器呪縛", "Curse weapon");
\r
7586 if (desc) return _("装備している武器を呪う。", "Curses your weapon.");
\r
7591 char o_name[MAX_NLEN];
\r
7592 object_type *o_ptr;
\r
7593 u32b f[TR_FLAG_SIZE];
\r
7595 item_tester_hook = item_tester_hook_weapon_except_bow;
\r
7596 q = _("どれを呪いますか?", "Which weapon do you curse?");
\r
7597 s = _("武器を装備していない。", "You wield no weapons.");
\r
7599 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
\r
7601 o_ptr = &inventory[item];
\r
7602 object_desc(o_name, o_ptr, OD_NAME_ONLY);
\r
7603 object_flags(o_ptr, f);
\r
7605 if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
\r
7607 if (!one_in_(3) &&
\r
7608 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
\r
7610 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
\r
7613 if (o_ptr->to_d > 0)
\r
7615 o_ptr->to_d -= randint1(3) % 2;
\r
7616 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
\r
7618 if (o_ptr->to_h > 0)
\r
7620 o_ptr->to_h -= randint1(3) % 2;
\r
7621 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
\r
7623 if (o_ptr->to_a > 0)
\r
7625 o_ptr->to_a -= randint1(3) % 2;
\r
7626 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
\r
7628 msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
\r
7633 int curse_rank = 0;
\r
7634 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
\r
7635 o_ptr->curse_flags |= (TRC_CURSED);
\r
7637 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
\r
7640 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
\r
7643 o_ptr->curse_flags |= (TRC_TY_CURSE);
\r
7644 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
\r
7646 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
\r
7647 add_flag(o_ptr->art_flags, TR_VORPAL);
\r
7648 add_flag(o_ptr->art_flags, TR_VAMPIRIC);
\r
7649 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
\r
7654 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);
\r
7657 p_ptr->update |= (PU_BONUS);
\r
7663 if (name) return _("邪悪感知", "Evil detection");
\r
7664 if (desc) return _("周囲の邪悪なモンスターを感知する。", "Detects evil monsters.");
\r
7665 if (info) return info_range(MAX_SIGHT);
\r
7668 msg_print(_("邪悪な生物の存在を感じ取ろうとした。", "You attend to the presence of evil creatures."));
\r
7673 if (name) return _("我慢", "Patience");
\r
7674 if (desc) return _("数ターン攻撃を耐えた後、受けたダメージを地獄の業火として周囲に放出する。",
\r
7675 "Bursts hell fire strongly after patients any damage while few turns.");
\r
7676 power = MIN(200, (HEX_REVENGE_POWER(p_ptr) * 2));
\r
7677 if (info) return info_damage(0, 0, power);
\r
7680 int a = 3 - (p_ptr->pspeed - 100) / 10;
\r
7681 MAGIC_NUM2 r = 3 + randint1(3) + MAX(0, MIN(3, a));
\r
7683 if (HEX_REVENGE_TURN(p_ptr) > 0)
\r
7685 msg_print(_("すでに我慢をしている。", "You are already patienting."));
\r
7689 HEX_REVENGE_TYPE(p_ptr) = 1;
\r
7690 HEX_REVENGE_TURN(p_ptr) = r;
\r
7691 HEX_REVENGE_POWER(p_ptr) = 0;
\r
7692 msg_print(_("じっと耐えることにした。", "You decide to patient all damages."));
\r
7697 int rad = 2 + (power / 50);
\r
7699 HEX_REVENGE_TURN(p_ptr)--;
\r
7701 if ((HEX_REVENGE_TURN(p_ptr) <= 0) || (power >= 200))
\r
7703 msg_print(_("我慢が解かれた!", "Time for end of patioence!"));
\r
7706 project(0, rad, p_ptr->y, p_ptr->x, power, GF_HELL_FIRE,
\r
7707 (PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);
\r
7709 if (p_ptr->wizard)
\r
7711 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
\r
7715 HEX_REVENGE_TYPE(p_ptr) = 0;
\r
7716 HEX_REVENGE_TURN(p_ptr) = 0;
\r
7717 HEX_REVENGE_POWER(p_ptr) = 0;
\r
7722 /*** 2nd book (8-15) ***/
\r
7724 if (name) return _("氷の鎧", "Ice armor");
\r
7725 if (desc) return _("氷のオーラを身にまとい、防御力が上昇する。", "Gives fire aura and bonus to AC.");
\r
7728 msg_print(_("体が氷の鎧で覆われた。", "You have enveloped by ice armor!"));
\r
7732 msg_print(_("氷の鎧が消え去った。", "Ice armor disappeared."));
\r
7737 if (name) return _("重傷の治癒", "Cure serious wounds");
\r
7738 if (desc) return _("体力や傷を多少回復させる。", "Heals cut and HP more.");
\r
7739 if (info) return info_heal(2, 10, 0);
\r
7742 msg_print(_("気分が良くなってくる。", "You feel better and better."));
\r
7746 hp_player(damroll(2, 10));
\r
7747 set_cut((p_ptr->cut / 2) - 10);
\r
7752 if (name) return _("薬品吸入", "Inhail potion");
\r
7753 if (desc) return _("呪文詠唱を中止することなく、薬の効果を得ることができる。", "Quaffs a potion without canceling of casting a spell.");
\r
7756 CASTING_HEX_FLAGS(p_ptr) |= (1L << HEX_INHAIL);
\r
7757 do_cmd_quaff_potion();
\r
7758 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_INHAIL);
\r
7764 if (name) return _("衰弱の霧", "Hypodynamic mist");
\r
7765 if (desc) return _("視界内のモンスターに微弱量の衰弱属性のダメージを与える。",
\r
7766 "Deals few damages of hypodynamia to all monsters in your sight.");
\r
7767 power = (plev / 2) + 5;
\r
7768 if (info) return info_damage(1, power, 0);
\r
7771 project_hack(GF_HYPODYNAMIA, randint1(power));
\r
7776 if (name) return _("魔剣化", "Swords to runeswords");
\r
7777 if (desc) return _("武器の攻撃力を上げる。切れ味を得、呪いに応じて与えるダメージが上昇し、善良なモンスターに対するダメージが2倍になる。",
\r
7778 "Gives vorpal ability to your weapon. Increases damages by your weapon acccording to curse of your weapon.");
\r
7782 msg_print("あなたの武器が黒く輝いた。");
\r
7784 if (!empty_hands(FALSE))
\r
7785 msg_print("Your weapons glow bright black.");
\r
7787 msg_print("Your weapon glows bright black.");
\r
7793 msg_print("武器の輝きが消え去った。");
\r
7795 msg_format("Brightness of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
\r
7801 if (name) return _("混乱の手", "Touch of confusion");
\r
7802 if (desc) return _("攻撃した際モンスターを混乱させる。", "Confuses a monster when you attack.");
\r
7805 msg_print(_("あなたの手が赤く輝き始めた。", "Your hands glow bright red."));
\r
7809 msg_print(_("手の輝きがなくなった。", "Brightness on your hands disappeard."));
\r
7814 if (name) return _("肉体強化", "Building up");
\r
7815 if (desc) return _("術者の腕力、器用さ、耐久力を上昇させる。攻撃回数の上限を 1 増加させる。",
\r
7816 "Attempts to increases your strength, dexterity and constitusion.");
\r
7819 msg_print(_("身体が強くなった気がした。", "You feel your body is developed more now."));
\r
7824 if (name) return _("反テレポート結界", "Anti teleport barrier");
\r
7825 if (desc) return _("視界内のモンスターのテレポートを阻害するバリアを張る。", "Obstructs all teleportations by monsters in your sight.");
\r
7826 power = plev * 3 / 2;
\r
7827 if (info) return info_power(power);
\r
7830 msg_print(_("テレポートを防ぐ呪いをかけた。", "You feel anyone can not teleport except you."));
\r
7834 /*** 3rd book (16-23) ***/
\r
7836 if (name) return _("衝撃のクローク", "Cloak of shock");
\r
7837 if (desc) return _("電気のオーラを身にまとい、動きが速くなる。", "Gives lightning aura and a bonus to speed.");
\r
7840 msg_print(_("体が稲妻のオーラで覆われた。", "You have enveloped by electrical aura!"));
\r
7844 msg_print(_("稲妻のオーラが消え去った。", "Electrical aura disappeared."));
\r
7849 if (name) return _("致命傷の治癒", "Cure critical wounds");
\r
7850 if (desc) return _("体力や傷を回復させる。", "Heals cut and HP greatry.");
\r
7851 if (info) return info_heal(4, 10, 0);
\r
7854 msg_print(_("気分が良くなってくる。", "You feel better and better."));
\r
7858 hp_player(damroll(4, 10));
\r
7866 if (name) return _("呪力封入", "Recharging");
\r
7867 if (desc) return _("魔法の道具に魔力を再充填する。", "Recharges a magic device.");
\r
7869 if (info) return info_power(power);
\r
7872 if (!recharge(power)) return NULL;
\r
7878 if (name) return _("死者復活", "Animate Dead");
\r
7879 if (desc) return _("死体を蘇らせてペットにする。", "Raises corpses and skeletons from dead.");
\r
7882 msg_print(_("死者への呼びかけを始めた。", "You start to call deads.!"));
\r
7886 animate_dead(0, p_ptr->y, p_ptr->x);
\r
7891 if (name) return _("防具呪縛", "Curse armor");
\r
7892 if (desc) return _("装備している防具に呪いをかける。", "Curse a piece of armour that you wielding.");
\r
7897 char o_name[MAX_NLEN];
\r
7898 object_type *o_ptr;
\r
7899 u32b f[TR_FLAG_SIZE];
\r
7901 item_tester_hook = object_is_armour;
\r
7902 q = _("どれを呪いますか?", "Which piece of armour do you curse?");
\r
7903 s = _("防具を装備していない。", "You wield no piece of armours.");
\r
7905 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
\r
7907 o_ptr = &inventory[item];
\r
7908 object_desc(o_name, o_ptr, OD_NAME_ONLY);
\r
7909 object_flags(o_ptr, f);
\r
7911 if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
\r
7913 if (!one_in_(3) &&
\r
7914 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
\r
7916 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
\r
7919 if (o_ptr->to_d > 0)
\r
7921 o_ptr->to_d -= randint1(3) % 2;
\r
7922 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
\r
7924 if (o_ptr->to_h > 0)
\r
7926 o_ptr->to_h -= randint1(3) % 2;
\r
7927 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
\r
7929 if (o_ptr->to_a > 0)
\r
7931 o_ptr->to_a -= randint1(3) % 2;
\r
7932 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
\r
7934 msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
\r
7939 int curse_rank = 0;
\r
7940 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
\r
7941 o_ptr->curse_flags |= (TRC_CURSED);
\r
7943 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
\r
7946 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
\r
7949 o_ptr->curse_flags |= (TRC_TY_CURSE);
\r
7950 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
\r
7952 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
\r
7953 add_flag(o_ptr->art_flags, TR_RES_POIS);
\r
7954 add_flag(o_ptr->art_flags, TR_RES_DARK);
\r
7955 add_flag(o_ptr->art_flags, TR_RES_NETHER);
\r
7956 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
\r
7961 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);
\r
7964 p_ptr->update |= (PU_BONUS);
\r
7970 if (name) return _("影のクローク", "Cloak of shadow");
\r
7971 if (desc) return _("影のオーラを身にまとい、敵に影のダメージを与える。", "Gives aura of shadow.");
\r
7974 object_type *o_ptr = &inventory[INVEN_OUTER];
\r
7976 if (!o_ptr->k_idx)
\r
7978 msg_print(_("クロークを身につけていない!", "You don't ware any cloak."));
\r
7981 else if (!object_is_cursed(o_ptr))
\r
7983 msg_print(_("クロークは呪われていない!", "Your cloak is not cursed."));
\r
7988 msg_print(_("影のオーラを身にまとった。", "You have enveloped by shadow aura!"));
\r
7993 object_type *o_ptr = &inventory[INVEN_OUTER];
\r
7995 if ((!o_ptr->k_idx) || (!object_is_cursed(o_ptr)))
\r
7997 do_spell(REALM_HEX, spell, SPELL_STOP);
\r
7998 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << spell);
\r
7999 CASTING_HEX_NUM(p_ptr)--;
\r
8000 if (!SINGING_SONG_ID(p_ptr)) set_action(ACTION_NONE);
\r
8005 msg_print(_("影のオーラが消え去った。", "Shadow aura disappeared."));
\r
8010 if (name) return _("苦痛を魔力に", "Pains to mana");
\r
8011 if (desc) return _("視界内のモンスターに精神ダメージ与え、魔力を吸い取る。", "Deals psychic damages to all monsters in sight, and drains some mana.");
\r
8012 power = plev * 3 / 2;
\r
8013 if (info) return info_damage(1, power, 0);
\r
8016 project_hack(GF_PSI_DRAIN, randint1(power));
\r
8021 if (name) return _("目には目を", "Eye for an eye");
\r
8022 if (desc) return _("打撃や魔法で受けたダメージを、攻撃元のモンスターにも与える。", "Returns same damage which you got to the monster which damaged you.");
\r
8025 msg_print(_("復讐したい欲望にかられた。", "You wish strongly you want to revenge anything."));
\r
8029 /*** 4th book (24-31) ***/
\r
8031 if (name) return _("反増殖結界", "Anti multiply barrier");
\r
8032 if (desc) return _("その階の増殖するモンスターの増殖を阻止する。", "Obstructs all multiplying by monsters in entire floor.");
\r
8035 msg_print(_("増殖を阻止する呪いをかけた。", "You feel anyone can not already multiply."));
\r
8040 if (name) return _("全復活", "Restoration");
\r
8041 if (desc) return _("経験値を徐々に復活し、減少した能力値を回復させる。", "Restores experience and status.");
\r
8044 msg_print(_("体が元の活力を取り戻し始めた。", "You feel your lost status starting to return."));
\r
8048 bool flag = FALSE;
\r
8049 int d = (p_ptr->max_exp - p_ptr->exp);
\r
8050 int r = (p_ptr->exp / 20);
\r
8056 p_ptr->exp = p_ptr->max_exp;
\r
8060 /* Check the experience */
\r
8061 check_experience();
\r
8065 for (i = A_STR; i < 6; i ++)
\r
8067 if (p_ptr->stat_cur[i] < p_ptr->stat_max[i])
\r
8069 if (p_ptr->stat_cur[i] < 18)
\r
8070 p_ptr->stat_cur[i]++;
\r
8072 p_ptr->stat_cur[i] += 10;
\r
8074 if (p_ptr->stat_cur[i] > p_ptr->stat_max[i])
\r
8075 p_ptr->stat_cur[i] = p_ptr->stat_max[i];
\r
8077 /* Recalculate bonuses */
\r
8078 p_ptr->update |= (PU_BONUS);
\r
8086 msg_format(_("%sの呪文の詠唱をやめた。", "Finish casting '%^s'."), do_spell(REALM_HEX, HEX_RESTORE, SPELL_NAME));
\r
8087 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_RESTORE);
\r
8088 if (cont) CASTING_HEX_NUM(p_ptr)--;
\r
8089 if (CASTING_HEX_NUM(p_ptr)) p_ptr->action = ACTION_NONE;
\r
8091 /* Redraw status */
\r
8092 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
\r
8093 p_ptr->redraw |= (PR_EXTRA);
\r
8101 if (name) return _("呪力吸収", "Drain curse power");
\r
8102 if (desc) return _("呪われた武器の呪いを吸収して魔力を回復する。", "Drains curse on your weapon and heals SP a little.");
\r
8107 u32b f[TR_FLAG_SIZE];
\r
8108 object_type *o_ptr;
\r
8110 item_tester_hook = item_tester_hook_cursed;
\r
8111 q = _("どの装備品から吸収しますか?", "Which cursed equipment do you drain mana from?");
\r
8112 s = _("呪われたアイテムを装備していない。", "You have no cursed equipment.");
\r
8114 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
\r
8116 o_ptr = &inventory[item];
\r
8117 object_flags(o_ptr, f);
\r
8119 p_ptr->csp += (p_ptr->lev / 5) + randint1(p_ptr->lev / 5);
\r
8120 if (have_flag(f, TR_TY_CURSE) || (o_ptr->curse_flags & TRC_TY_CURSE)) p_ptr->csp += randint1(5);
\r
8121 if (p_ptr->csp > p_ptr->msp) p_ptr->csp = p_ptr->msp;
\r
8123 if (o_ptr->curse_flags & TRC_PERMA_CURSE)
\r
8127 else if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
\r
8131 msg_print(_("呪いを全て吸い取った。", "Heavy curse vanished away."));
\r
8132 o_ptr->curse_flags = 0L;
\r
8135 else if ((o_ptr->curse_flags & (TRC_CURSED)) && one_in_(3))
\r
8137 msg_print(_("呪いを全て吸い取った。", "Curse vanished away."));
\r
8138 o_ptr->curse_flags = 0L;
\r
8146 if (name) return _("吸血の刃", "Swords to vampires");
\r
8147 if (desc) return _("吸血属性で攻撃する。", "Gives vampiric ability to your weapon.");
\r
8151 msg_print("あなたの武器が血を欲している。");
\r
8153 if (!empty_hands(FALSE))
\r
8154 msg_print("Your weapons want more blood now.");
\r
8156 msg_print("Your weapon wants more blood now.");
\r
8162 msg_print("武器の渇望が消え去った。");
\r
8164 msg_format("Thirsty of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
\r
8170 if (name) return _("朦朧の言葉", "Word of stun");
\r
8171 if (desc) return _("視界内のモンスターを朦朧とさせる。", "Stuns all monsters in your sight.");
\r
8173 if (info) return info_power(power);
\r
8176 stun_monsters(power);
\r
8181 if (name) return _("影移動", "Moving into shadow");
\r
8182 if (desc) return _("モンスターの隣のマスに瞬間移動する。", "Teleports you close to a monster.");
\r
8189 for (i = 0; i < 3; i++)
\r
8191 if (!tgt_pt(&x, &y)) return FALSE;
\r
8195 for (dir = 0; dir < 8; dir++)
\r
8197 int dy = y + ddy_ddd[dir];
\r
8198 int dx = x + ddx_ddd[dir];
\r
8199 if (dir == 5) continue;
\r
8200 if(cave[dy][dx].m_idx) flag = TRUE;
\r
8203 if (!cave_empty_bold(y, x) || (cave[y][x].info & CAVE_ICKY) ||
\r
8204 (distance(y, x, p_ptr->y, p_ptr->x) > plev + 2))
\r
8206 msg_print(_("そこには移動できない。", "Can not teleport to there."));
\r
8212 if (flag && randint0(plev * plev / 2))
\r
8214 teleport_player_to(y, x, 0L);
\r
8218 msg_print(_("おっと!", "Oops!"));
\r
8219 teleport_player(30, 0L);
\r
8227 if (name) return _("反魔法結界", "Anti magic barrier");
\r
8228 if (desc) return _("視界内のモンスターの魔法を阻害するバリアを張る。", "Obstructs all magic spell of monsters in your sight.");
\r
8229 power = plev * 3 / 2;
\r
8230 if (info) return info_power(power);
\r
8233 msg_print(_("魔法を防ぐ呪いをかけた。", "You feel anyone can not cast spells except you."));
\r
8238 if (name) return _("復讐の宣告", "Revenge sentence");
\r
8239 if (desc) return _("数ターン後にそれまで受けたダメージに応じた威力の地獄の劫火の弾を放つ。",
\r
8240 "Fires a ball of hell fire to try revenging after few turns.");
\r
8241 power = HEX_REVENGE_POWER(p_ptr);
\r
8242 if (info) return info_damage(0, 0, power);
\r
8246 int a = 3 - (p_ptr->pspeed - 100) / 10;
\r
8247 r = 1 + randint1(2) + MAX(0, MIN(3, a));
\r
8249 if (HEX_REVENGE_TURN(p_ptr) > 0)
\r
8251 msg_print(_("すでに復讐は宣告済みだ。", "You already pronounced your revenge."));
\r
8255 HEX_REVENGE_TYPE(p_ptr) = 2;
\r
8256 HEX_REVENGE_TURN(p_ptr) = r;
\r
8257 msg_format(_("あなたは復讐を宣告した。あと %d ターン。", "You pronounce your revenge. %d turns left."), r);
\r
8262 HEX_REVENGE_TURN(p_ptr)--;
\r
8264 if (HEX_REVENGE_TURN(p_ptr) <= 0)
\r
8274 msg_print(_("復讐の時だ!", "Time to revenge!"));
\r
8276 while (!get_aim_dir(&dir));
\r
8278 fire_ball(GF_HELL_FIRE, dir, power, 1);
\r
8280 if (p_ptr->wizard)
\r
8282 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
\r
8287 msg_print(_("復讐する気が失せた。", "You are not a mood to revenge."));
\r
8289 HEX_REVENGE_POWER(p_ptr) = 0;
\r
8295 /* start casting */
\r
8296 if ((cast) && (add))
\r
8299 CASTING_HEX_FLAGS(p_ptr) |= 1L << (spell);
\r
8300 CASTING_HEX_NUM(p_ptr)++;
\r
8302 if (p_ptr->action != ACTION_SPELL) set_action(ACTION_SPELL);
\r
8305 /* Redraw status */
\r
8308 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
\r
8309 p_ptr->redraw |= (PR_EXTRA | PR_HP | PR_MANA);
\r
8317 * @brief 魔法処理のメインルーチン
\r
8318 * @param realm 魔法領域のID
\r
8319 * @param spell 各領域の魔法ID
\r
8320 * @param mode 求める処理
\r
8321 * @return 各領域魔法に各種テキストを求めた場合は文字列参照ポインタ、そうでない場合はNULLポインタを返す。
\r
8323 cptr do_spell(REALM_IDX realm, SPELL_IDX spell, BIT_FLAGS mode)
\r
8327 case REALM_LIFE: return do_life_spell(spell, mode);
\r
8328 case REALM_SORCERY: return do_sorcery_spell(spell, mode);
\r
8329 case REALM_NATURE: return do_nature_spell(spell, mode);
\r
8330 case REALM_CHAOS: return do_chaos_spell(spell, mode);
\r
8331 case REALM_DEATH: return do_death_spell(spell, mode);
\r
8332 case REALM_TRUMP: return do_trump_spell(spell, mode);
\r
8333 case REALM_ARCANE: return do_arcane_spell(spell, mode);
\r
8334 case REALM_CRAFT: return do_craft_spell(spell, mode);
\r
8335 case REALM_DAEMON: return do_daemon_spell(spell, mode);
\r
8336 case REALM_CRUSADE: return do_crusade_spell(spell, mode);
\r
8337 case REALM_MUSIC: return do_music_spell(spell, mode);
\r
8338 case REALM_HISSATSU: return do_hissatsu_spell(spell, mode);
\r
8339 case REALM_HEX: return do_hex_spell(spell, mode);
\r