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
16 * 魔法の効果を「キャプション:ダイス+定数値」のフォーマットで出力する / Generate dice info string such as "foo 2d10"
\r
21 * @return フォーマットに従い整形された文字列
\r
23 static cptr info_string_dice(cptr str, int dice, int sides, int base)
\r
27 return format("%s%d", str, base);
\r
31 return format("%s%dd%d", str, dice, sides);
\r
33 /* Dice plus base value */
\r
35 return format("%s%dd%d%+d", str, dice, sides, base);
\r
40 * @brief 魔法によるダメージを出力する / Generate damage-dice info string such as "dam 2d10"
\r
44 * @return フォーマットに従い整形された文字列
\r
46 static cptr info_damage(int dice, int sides, int base)
\r
48 return info_string_dice(_("損傷:", "dam "), dice, sides, base);
\r
52 * @brief 魔法の効果時間を出力する / Generate duration info string such as "dur 20+1d20"
\r
55 * @return フォーマットに従い整形された文字列
\r
57 static cptr info_duration(int base, int sides)
\r
59 return format(_("期間:%d+1d%d", "dur %d+1d%d"), base, sides);
\r
63 * @brief 魔法の効果範囲を出力する / Generate range info string such as "range 5"
\r
65 * @return フォーマットに従い整形された文字列
\r
67 static cptr info_range(POSITION range)
\r
69 return format(_("範囲:%d", "range %d"), range);
\r
73 * @brief 魔法による回復量を出力する / Generate heal info string such as "heal 2d8"
\r
77 * @return フォーマットに従い整形された文字列
\r
79 static cptr info_heal(int dice, int sides, int base)
\r
81 return info_string_dice(_("回復:", "heal "), dice, sides, base);
\r
85 * @brief 魔法効果発動までの遅延ターンを出力する / Generate delay info string such as "delay 15+1d15"
\r
88 * @return フォーマットに従い整形された文字列
\r
90 static cptr info_delay(int base, int sides)
\r
92 return format(_("遅延:%d+1d%d", "delay %d+1d%d"), base, sides);
\r
97 * @brief 魔法によるダメージを出力する(固定値&複数回処理) / Generate multiple-damage info string such as "dam 25 each"
\r
99 * @return フォーマットに従い整形された文字列
\r
101 static cptr info_multi_damage(HIT_POINT dam)
\r
103 return format(_("損傷:各%d", "dam %d each"), dam);
\r
108 * @brief 魔法によるダメージを出力する(ダイスのみ&複数回処理) / Generate multiple-damage-dice info string such as "dam 5d2 each"
\r
110 * @param sides ダイス目
\r
111 * @return フォーマットに従い整形された文字列
\r
113 static cptr info_multi_damage_dice(int dice, int sides)
\r
115 return format(_("損傷:各%dd%d", "dam %dd%d each"), dice, sides);
\r
119 * @brief 魔法による一般的な効力値を出力する(固定値) / Generate power info string such as "power 100"
\r
121 * @return フォーマットに従い整形された文字列
\r
123 static cptr info_power(int power)
\r
125 return format(_("効力:%d", "power %d"), power);
\r
130 * @brief 魔法による一般的な効力値を出力する(ダイス値) / Generate power info string such as "power 100"
\r
132 * @param sides ダイス目
\r
133 * @return フォーマットに従い整形された文字列
\r
136 * Generate power info string such as "power 1d100"
\r
138 static cptr info_power_dice(int dice, int sides)
\r
140 return format(_("効力:%dd%d", "power %dd%d"), dice, sides);
\r
145 * @brief 魔法の効果半径を出力する / Generate radius info string such as "rad 100"
\r
147 * @return フォーマットに従い整形された文字列
\r
149 static cptr info_radius(int rad)
\r
151 return format(_("半径:%d", "rad %d"), rad);
\r
156 * @brief 魔法効果の限界重量を出力する / Generate weight info string such as "max wgt 15"
\r
157 * @param weight 最大重量
\r
158 * @return フォーマットに従い整形された文字列
\r
160 static cptr info_weight(int weight)
\r
163 return format("最大重量:%d.%dkg", lbtokg1(weight), lbtokg2(weight));
\r
165 return format("max wgt %d", weight/10);
\r
171 * @brief 一部ボルト魔法のビーム化確率を算出する / Prepare standard probability to become beam for fire_bolt_or_beam()
\r
172 * @return ビーム化確率(%)
\r
174 * ハードコーティングによる実装が行われている。
\r
175 * メイジは(レベル)%、ハイメイジ、スペルマスターは(レベル)%、それ以外の職業は(レベル/2)%
\r
177 int beam_chance(void)
\r
179 if (p_ptr->pclass == CLASS_MAGE)
\r
181 if (p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER)
\r
182 return p_ptr->lev + 10;
\r
184 return p_ptr->lev / 2;
\r
188 * @brief トランプ魔法独自の召喚処理を行う / Handle summoning and failure of trump spells
\r
189 * @param num summon_specific()関数を呼び出す回数
\r
190 * @param pet ペット化として召喚されるか否か
\r
191 * @param y 召喚位置のy座標
\r
192 * @param x 召喚位置のx座標
\r
194 * @param type 召喚条件ID
\r
195 * @param mode モンスター生成条件フラグ
\r
196 * @return モンスターが(敵対も含めて)召還されたならばTRUEを返す。
\r
198 bool trump_summoning(int num, bool pet, POSITION y, POSITION x, DEPTH lev, int type, BIT_FLAGS mode)
\r
200 PLAYER_LEVEL plev = p_ptr->lev;
\r
204 bool success = FALSE;
\r
206 /* Default level */
\r
207 if (!lev) lev = plev * 2 / 3 + randint1(plev / 2);
\r
212 mode |= PM_FORCE_PET;
\r
214 /* Only sometimes allow unique monster */
\r
215 if (mode & PM_ALLOW_UNIQUE)
\r
218 if (randint1(50 + plev) >= plev / 10)
\r
219 mode &= ~PM_ALLOW_UNIQUE;
\r
222 /* Player is who summons */
\r
227 /* Prevent taming, allow unique monster */
\r
230 /* Behave as if they appear by themselfs */
\r
234 for (i = 0; i < num; i++)
\r
236 if (summon_specific(who, y, x, lev, type, mode))
\r
242 msg_print(_("誰もあなたのカードの呼び声に答えない。", "Nobody answers to your Trump call."));
\r
251 * @brief 悪魔領域のグレーターデーモン召喚に利用可能な死体かどうかを返す。 / An "item_tester_hook" for offer
\r
252 * @param o_ptr オブジェクト構造体の参照ポインタ
\r
253 * @return 生贄に使用可能な死体ならばTRUEを返す。
\r
255 static bool item_tester_offer(object_type *o_ptr)
\r
257 /* Flasks of oil are okay */
\r
258 if (o_ptr->tval != TV_CORPSE) return (FALSE);
\r
260 if (o_ptr->sval != SV_CORPSE) return (FALSE);
\r
262 if (my_strchr("pht", r_info[o_ptr->pval].d_char)) return (TRUE);
\r
264 /* Assume not okay */
\r
269 * @brief 悪魔領域のグレーターデーモン召喚を処理する / Daemon spell Summon Greater Demon
\r
270 * @return 処理を実行したならばTRUEを返す。
\r
272 static bool cast_summon_greater_demon(void)
\r
274 PLAYER_LEVEL plev = p_ptr->lev;
\r
278 object_type *o_ptr;
\r
280 item_tester_hook = item_tester_offer;
\r
281 q = _("どの死体を捧げますか? ", "Sacrifice which corpse? ");
\r
282 s = _("捧げられる死体を持っていない。", "You have nothing to scrifice.");
\r
283 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return FALSE;
\r
285 /* Get the item (in the pack) */
\r
288 o_ptr = &inventory[item];
\r
291 /* Get the item (on the floor) */
\r
294 o_ptr = &o_list[0 - item];
\r
297 summon_lev = plev * 2 / 3 + r_info[o_ptr->pval].level;
\r
299 if (summon_specific(-1, p_ptr->y, p_ptr->x, summon_lev, SUMMON_HI_DEMON, (PM_ALLOW_GROUP | PM_FORCE_PET)))
\r
301 msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));
\r
302 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
\r
304 /* Decrease the item (from the pack) */
\r
307 inven_item_increase(item, -1);
\r
308 inven_item_describe(item);
\r
309 inven_item_optimize(item);
\r
312 /* Decrease the item (from the floor) */
\r
315 floor_item_increase(0 - item, -1);
\r
316 floor_item_describe(0 - item);
\r
317 floor_item_optimize(0 - item);
\r
322 msg_print(_("悪魔は現れなかった。", "No Greater Demon arrive."));
\r
329 * @brief 歌の開始を処理する / Start singing if the player is a Bard
\r
330 * @param spell 領域魔法としてのID
\r
331 * @param song 魔法効果のID
\r
334 static void start_singing(SPELL_IDX spell, MAGIC_NUM1 song)
\r
336 /* Remember the song index */
\r
337 SINGING_SONG_EFFECT(p_ptr) = (MAGIC_NUM1)song;
\r
339 /* Remember the index of the spell which activated the song */
\r
340 SINGING_SONG_ID(p_ptr) = (MAGIC_NUM2)spell;
\r
343 /* Now the player is singing */
\r
344 set_action(ACTION_SING);
\r
347 /* Recalculate bonuses */
\r
348 p_ptr->update |= (PU_BONUS);
\r
350 /* Redraw status bar */
\r
351 p_ptr->redraw |= (PR_STATUS);
\r
355 * @brief 歌の停止を処理する / Stop singing if the player is a Bard
\r
358 void stop_singing(void)
\r
360 if (p_ptr->pclass != CLASS_BARD) return;
\r
362 /* Are there interupted song? */
\r
363 if (INTERUPTING_SONG_EFFECT(p_ptr))
\r
365 /* Forget interupted song */
\r
366 INTERUPTING_SONG_EFFECT(p_ptr) = MUSIC_NONE;
\r
370 /* The player is singing? */
\r
371 if (!SINGING_SONG_EFFECT(p_ptr)) return;
\r
373 /* Hack -- if called from set_action(), avoid recursive loop */
\r
374 if (p_ptr->action == ACTION_SING) set_action(ACTION_NONE);
\r
376 /* Message text of each song or etc. */
\r
377 do_spell(REALM_MUSIC, SINGING_SONG_ID(p_ptr), SPELL_STOP);
\r
379 SINGING_SONG_EFFECT(p_ptr) = MUSIC_NONE;
\r
380 SINGING_SONG_ID(p_ptr) = 0;
\r
382 /* Recalculate bonuses */
\r
383 p_ptr->update |= (PU_BONUS);
\r
385 /* Redraw status bar */
\r
386 p_ptr->redraw |= (PR_STATUS);
\r
391 * @brief 生命領域魔法の各処理を行う
\r
392 * @param spell 魔法ID
\r
393 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
394 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
396 static cptr do_life_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
398 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
399 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
400 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
401 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
404 int plev = p_ptr->lev;
\r
409 if (name) return _("軽傷の治癒", "Cure Light Wounds");
\r
410 if (desc) return _("怪我と体力を少し回復させる。", "Heals cut and HP a little.");
\r
415 if (info) return info_heal(dice, sides, 0);
\r
419 hp_player(damroll(dice, sides));
\r
420 set_cut(p_ptr->cut - 10);
\r
426 if (name) return _("祝福", "Bless");
\r
427 if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
\r
431 if (info) return info_duration(base, base);
\r
435 set_blessed(randint1(base) + base, FALSE);
\r
441 if (name) return _("軽傷", "Cause Light Wounds");
\r
442 if (desc) return _("1体のモンスターに小ダメージを与える。抵抗されると無効。", "Wounds a monster a little unless resisted.");
\r
444 int dice = 3 + (plev - 1) / 5;
\r
447 if (info) return info_damage(dice, sides, 0);
\r
451 if (!get_aim_dir(&dir)) return NULL;
\r
452 fire_ball_hide(GF_WOUNDS, dir, damroll(dice, sides), 0);
\r
458 if (name) return _("光の召喚", "Call Light");
\r
459 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
\r
462 int sides = plev / 2;
\r
463 int rad = plev / 10 + 1;
\r
465 if (info) return info_damage(dice, sides, 0);
\r
469 lite_area(damroll(dice, sides), rad);
\r
475 if (name) return _("罠 & 隠し扉感知", "Detect Doors & Traps");
\r
476 if (desc) return _("近くの全ての罠と扉と階段を感知する。", "Detects traps, doors, and stairs in your vicinity.");
\r
478 int rad = DETECT_RAD_DEFAULT;
\r
480 if (info) return info_radius(rad);
\r
484 detect_traps(rad, TRUE);
\r
486 detect_stairs(rad);
\r
492 if (name) return _("重傷の治癒", "Cure Medium Wounds");
\r
493 if (desc) return _("怪我と体力を中程度回復させる。", "Heals cut and HP more.");
\r
498 if (info) return info_heal(dice, sides, 0);
\r
502 hp_player(damroll(dice, sides));
\r
503 set_cut((p_ptr->cut / 2) - 20);
\r
509 if (name) return _("解毒", "Cure Poison");
\r
510 if (desc) return _("体内の毒を取り除く。", "Cure poison status.");
\r
520 if (name) return _("空腹充足", "Satisfy Hunger");
\r
521 if (desc) return _("満腹にする。", "Satisfies hunger.");
\r
525 set_food(PY_FOOD_MAX - 1);
\r
531 if (name) return _("解呪", "Remove Curse");
\r
532 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
\r
536 if (remove_curse())
\r
538 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
545 if (name) return _("重傷", "Cause Medium Wounds");
\r
546 if (desc) return _("1体のモンスターに中ダメージを与える。抵抗されると無効。", "Wounds a monster unless resisted.");
\r
548 int sides = 8 + (plev - 5) / 4;
\r
551 if (info) return info_damage(dice, sides, 0);
\r
555 if (!get_aim_dir(&dir)) return NULL;
\r
556 fire_ball_hide(GF_WOUNDS, dir, damroll(dice, sides), 0);
\r
562 if (name) return _("致命傷の治癒", "Cure Critical Wounds");
\r
563 if (desc) return _("体力を大幅に回復させ、負傷と朦朧状態も全快する。", "Heals cut, stun and HP greatly.");
\r
568 if (info) return info_heal(dice, sides, 0);
\r
572 hp_player(damroll(dice, sides));
\r
580 if (name) return _("耐熱耐寒", "Resist Heat and Cold");
\r
581 if (desc) return _("一定時間、火炎と冷気に対する耐性を得る。装備による耐性に累積する。",
\r
582 "Gives resistance to fire and cold. These resistances can be added to which from equipment for more powerful resistances.");
\r
587 if (info) return info_duration(base, base);
\r
591 set_oppose_cold(randint1(base) + base, FALSE);
\r
592 set_oppose_fire(randint1(base) + base, FALSE);
\r
598 if (name) return _("周辺感知", "Sense Surroundings");
\r
599 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
\r
602 int rad = DETECT_RAD_MAP;
\r
604 if (info) return info_radius(rad);
\r
614 if (name) return _("パニック・アンデッド", "Turn Undead");
\r
615 if (desc) return _("視界内のアンデッドを恐怖させる。抵抗されると無効。", "Attempts to scare undead monsters in sight.");
\r
626 if (name) return _("体力回復", "Healing");
\r
627 if (desc) return _("極めて強力な回復呪文で、負傷と朦朧状態も全快する。", "Much powerful healing magic, and heals cut and stun completely.");
\r
632 if (info) return info_heal(0, 0, heal);
\r
644 if (name) return _("結界の紋章", "Glyph of Warding");
\r
645 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。",
\r
646 "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
657 if (name) return _("*解呪*", "Dispel Curse");
\r
658 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
\r
663 if (remove_all_curse())
\r
665 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
672 if (name) return _("鑑識", "Perception");
\r
673 if (desc) return _("アイテムを識別する。", "Identifies an item.");
\r
678 if (!ident_spell(FALSE)) return NULL;
\r
684 if (name) return _("アンデッド退散", "Dispel Undead");
\r
685 if (desc) return _("視界内の全てのアンデッドにダメージを与える。", "Damages all undead monsters in sight.");
\r
689 int sides = plev * 5;
\r
691 if (info) return info_damage(dice, sides, 0);
\r
695 dispel_undead(damroll(dice, sides));
\r
701 if (name) return _("凪の刻", "Day of the Dove");
\r
702 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
\r
705 int power = plev * 2;
\r
707 if (info) return info_power(power);
\r
711 charm_monsters(power);
\r
717 if (name) return _("致命傷", "Cause Critical Wounds");
\r
718 if (desc) return _("1体のモンスターに大ダメージを与える。抵抗されると無効。", "Wounds a monster critically unless resisted.");
\r
721 int dice = 5 + (plev - 5) / 3;
\r
724 if (info) return info_damage(dice, sides, 0);
\r
728 if (!get_aim_dir(&dir)) return NULL;
\r
729 fire_ball_hide(GF_WOUNDS, dir, damroll(dice, sides), 0);
\r
735 if (name) return _("帰還の詔", "Word of Recall");
\r
736 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。", "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
\r
742 if (info) return info_delay(base, sides);
\r
746 if (!word_of_recall()) return NULL;
\r
752 if (name) return _("真実の祭壇", "Alter Reality");
\r
753 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
\r
759 if (info) return info_delay(base, sides);
\r
769 if (name) return _("真・結界", "Warding True");
\r
770 if (desc) return _("自分のいる床と周囲8マスの床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。", "Creates glyphs in all adjacent squares and under you.");
\r
775 if (info) return info_radius(rad);
\r
786 if (name) return _("不毛化", "Sterilization");
\r
787 if (desc) return _("この階の増殖するモンスターが増殖できなくなる。", "Prevents any breeders on current level from breeding.");
\r
792 num_repro += MAX_REPRO;
\r
798 if (name) return _("全感知", "Detection");
\r
799 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。", "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
\r
802 int rad = DETECT_RAD_DEFAULT;
\r
804 if (info) return info_radius(rad);
\r
814 if (name) return _("アンデッド消滅", "Annihilate Undead");
\r
815 if (desc) return _("自分の周囲にいるアンデッドを現在の階から消し去る。抵抗されると無効。",
\r
816 "Eliminates all nearby undead monsters, exhausting you. Powerful or unique monsters may be able to resist.");
\r
819 int power = plev + 50;
\r
821 if (info) return info_power(power);
\r
825 mass_genocide_undead(power, TRUE);
\r
831 if (name) return _("千里眼", "Clairvoyance");
\r
832 if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。", "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");
\r
843 if (name) return _("全復活", "Restoration");
\r
844 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
\r
849 do_res_stat(A_STR);
\r
850 do_res_stat(A_INT);
\r
851 do_res_stat(A_WIS);
\r
852 do_res_stat(A_DEX);
\r
853 do_res_stat(A_CON);
\r
854 do_res_stat(A_CHR);
\r
861 if (name) return _("*体力回復*", "Healing True");
\r
862 if (desc) return _("最強の治癒の魔法で、負傷と朦朧状態も全快する。", "The greatest healing magic. Heals all HP, cut and stun.");
\r
867 if (info) return info_heal(0, 0, heal);
\r
879 if (name) return _("聖なるビジョン", "Holy Vision");
\r
880 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
\r
885 if (!identify_fully(FALSE)) return NULL;
\r
891 if (name) return _("究極の耐性", "Ultimate Resistance");
\r
892 if (desc) return _("一定時間、あらゆる耐性を付け、ACと魔法防御能力を上昇させる。", "Gives ultimate resistance, bonus to AC and speed.");
\r
895 TIME_EFFECT base = (TIME_EFFECT)plev / 2;
\r
897 if (info) return info_duration(base, base);
\r
901 TIME_EFFECT v = randint1(base) + base;
\r
902 set_fast(v, FALSE);
\r
903 set_oppose_acid(v, FALSE);
\r
904 set_oppose_elec(v, FALSE);
\r
905 set_oppose_fire(v, FALSE);
\r
906 set_oppose_cold(v, FALSE);
\r
907 set_oppose_pois(v, FALSE);
\r
908 set_ultimate_res(v, FALSE);
\r
918 * @brief 仙術領域魔法の各処理を行う
\r
919 * @param spell 魔法ID
\r
920 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
921 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
923 static cptr do_sorcery_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
925 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
926 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
927 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
928 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
931 int plev = p_ptr->lev;
\r
936 if (name) return _("モンスター感知", "Detect Monsters");
\r
937 if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
\r
940 int rad = DETECT_RAD_DEFAULT;
\r
942 if (info) return info_radius(rad);
\r
946 detect_monsters_normal(rad);
\r
952 if (name) return _("ショート・テレポート", "Phase Door");
\r
953 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");
\r
956 POSITION range = 10;
\r
958 if (info) return info_range(range);
\r
962 teleport_player(range, 0L);
\r
968 if (name) return _("罠と扉感知", "Detect Doors and Traps");
\r
969 if (desc) return _("近くの全ての扉と罠を感知する。", "Detects traps, doors, and stairs in your vicinity.");
\r
972 int rad = DETECT_RAD_DEFAULT;
\r
974 if (info) return info_radius(rad);
\r
978 detect_traps(rad, TRUE);
\r
980 detect_stairs(rad);
\r
986 if (name) return _("ライト・エリア", "Light Area");
\r
987 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
\r
991 int sides = plev / 2;
\r
992 int rad = plev / 10 + 1;
\r
994 if (info) return info_damage(dice, sides, 0);
\r
998 lite_area(damroll(dice, sides), rad);
\r
1004 if (name) return _("パニック・モンスター", "Confuse Monster");
\r
1005 if (desc) return _("モンスター1体を混乱させる。抵抗されると無効。", "Attempts to confuse a monster.");
\r
1008 int power = (plev * 3) / 2;
\r
1010 if (info) return info_power(power);
\r
1014 if (!get_aim_dir(&dir)) return NULL;
\r
1016 confuse_monster(dir, power);
\r
1022 if (name) return _("テレポート", "Teleport");
\r
1023 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
\r
1026 POSITION range = plev * 5;
\r
1028 if (info) return info_range(range);
\r
1032 teleport_player(range, 0L);
\r
1038 if (name) return _("スリープ・モンスター", "Sleep Monster");
\r
1039 if (desc) return _("モンスター1体を眠らせる。抵抗されると無効。", "Attempts to sleep a monster.");
\r
1044 if (info) return info_power(power);
\r
1048 if (!get_aim_dir(&dir)) return NULL;
\r
1050 sleep_monster(dir, plev);
\r
1056 if (name) return _("魔力充填", "Recharging");
\r
1057 if (desc) return _("杖/魔法棒の充填回数を増やすか、充填中のロッドの充填時間を減らす。", "Recharges staffs, wands or rods.");
\r
1060 int power = plev * 4;
\r
1062 if (info) return info_power(power);
\r
1066 if (!recharge(power)) return NULL;
\r
1072 if (name) return _("魔法の地図", "Magic Mapping");
\r
1073 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
\r
1076 int rad = DETECT_RAD_MAP;
\r
1078 if (info) return info_radius(rad);
\r
1088 if (name) return _("鑑定", "Identify");
\r
1089 if (desc) return _("アイテムを識別する。", "Identifies an item.");
\r
1094 if (!ident_spell(FALSE)) return NULL;
\r
1100 if (name) return _("スロウ・モンスター", "Slow Monster");
\r
1101 if (desc) return _("モンスター1体を減速さる。抵抗されると無効。", "Attempts to slow a monster.");
\r
1106 if (info) return info_power(power);
\r
1110 if (!get_aim_dir(&dir)) return NULL;
\r
1112 slow_monster(dir, plev);
\r
1118 if (name) return _("周辺スリープ", "Mass Sleep");
\r
1119 if (desc) return _("視界内の全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep all monsters in sight.");
\r
1124 if (info) return info_power(power);
\r
1128 sleep_monsters(plev);
\r
1134 if (name) return _("テレポート・モンスター", "Teleport Away");
\r
1135 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
\r
1140 if (info) return info_power(power);
\r
1144 if (!get_aim_dir(&dir)) return NULL;
\r
1146 fire_beam(GF_AWAY_ALL, dir, power);
\r
1152 if (name) return _("スピード", "Haste Self");
\r
1153 if (desc) return _("一定時間、加速する。", "Hastes you for a while.");
\r
1157 int sides = 20 + plev;
\r
1159 if (info) return info_duration(base, sides);
\r
1163 set_fast(randint1(sides) + base, FALSE);
\r
1169 if (name) return _("真・感知", "Detection True");
\r
1170 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
\r
1171 "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
\r
1174 int rad = DETECT_RAD_DEFAULT;
\r
1176 if (info) return info_radius(rad);
\r
1186 if (name) return _("真・鑑定", "Identify True");
\r
1187 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
\r
1192 if (!identify_fully(FALSE)) return NULL;
\r
1198 if (name) return _("物体と財宝感知", "Detect items and Treasure");
\r
1199 if (desc) return _("近くの全てのアイテムと財宝を感知する。", "Detects all treasures and items in your vicinity.");
\r
1202 int rad = DETECT_RAD_DEFAULT;
\r
1204 if (info) return info_radius(rad);
\r
1208 detect_objects_normal(rad);
\r
1209 detect_treasure(rad);
\r
1210 detect_objects_gold(rad);
\r
1216 if (name) return _("チャーム・モンスター", "Charm Monster");
\r
1217 if (desc) return _("モンスター1体を魅了する。抵抗されると無効。", "Attempts to charm a monster.");
\r
1222 if (info) return info_power(power);
\r
1226 if (!get_aim_dir(&dir)) return NULL;
\r
1228 charm_monster(dir, power);
\r
1234 if (name) return _("精神感知", "Sense Minds");
\r
1235 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
\r
1241 if (info) return info_duration(base, sides);
\r
1245 set_tim_esp(randint1(sides) + base, FALSE);
\r
1251 if (name) return _("街移動", "Teleport to town");
\r
1252 if (desc) return _("街へ移動する。地上にいるときしか使えない。", "Teleport to a town which you choose in a moment. Can only be used outdoors.");
\r
1257 if (!tele_town()) return NULL;
\r
1263 if (name) return _("自己分析", "Self Knowledge");
\r
1264 if (desc) return _("現在の自分の状態を完全に知る。",
\r
1265 "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");
\r
1276 if (name) return _("テレポート・レベル", "Teleport Level");
\r
1277 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");
\r
1282 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
\r
1283 teleport_level(0);
\r
1289 if (name) return _("帰還の呪文", "Word of Recall");
\r
1290 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
\r
1291 "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
\r
1297 if (info) return info_delay(base, sides);
\r
1301 if (!word_of_recall()) return NULL;
\r
1307 if (name) return _("次元の扉", "Dimension Door");
\r
1308 if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleport to given location.");
\r
1311 POSITION range = plev / 2 + 10;
\r
1313 if (info) return info_range(range);
\r
1317 msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));
\r
1318 if (!dimension_door()) return NULL;
\r
1324 if (name) return _("調査", "Probing");
\r
1325 if (desc) return _("モンスターの属性、残り体力、最大体力、スピード、正体を知る。",
\r
1326 "Proves all monsters' alignment, HP, speed and their true character.");
\r
1337 if (name) return _("爆発のルーン", "Explosive Rune");
\r
1338 if (desc) return _("自分のいる床の上に、モンスターが通ると爆発してダメージを与えるルーンを描く。",
\r
1339 "Sets a glyph under you. The glyph will explode when a monster moves on it.");
\r
1346 if (info) return info_damage(dice, sides, base);
\r
1356 if (name) return _("念動力", "Telekinesis");
\r
1357 if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");
\r
1360 int weight = plev * 15;
\r
1362 if (info) return info_weight(weight);
\r
1366 if (!get_aim_dir(&dir)) return NULL;
\r
1368 fetch(dir, weight, FALSE);
\r
1374 if (name) return _("千里眼", "Clairvoyance");
\r
1375 if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。さらに、一定時間テレパシー能力を得る。",
\r
1376 "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");
\r
1382 if (info) return info_duration(base, sides);
\r
1386 chg_virtue(V_KNOWLEDGE, 1);
\r
1387 chg_virtue(V_ENLIGHTEN, 1);
\r
1391 if (!p_ptr->telepathy)
\r
1393 set_tim_esp(randint1(sides) + base, FALSE);
\r
1400 if (name) return _("魅了の視線", "Charm monsters");
\r
1401 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
\r
1404 int power = plev * 2;
\r
1406 if (info) return info_power(power);
\r
1410 charm_monsters(power);
\r
1416 if (name) return _("錬金術", "Alchemy");
\r
1417 if (desc) return _("アイテム1つをお金に変える。", "Turns an item into 1/3 of its value in gold.");
\r
1422 if (!alchemy()) return NULL;
\r
1428 if (name) return _("怪物追放", "Banishment");
\r
1429 if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");
\r
1432 int power = plev * 4;
\r
1434 if (info) return info_power(power);
\r
1438 banish_monsters(power);
\r
1444 if (name) return _("無傷の球", "Globe of Invulnerability");
\r
1445 if (desc) return _("一定時間、ダメージを受けなくなるバリアを張る。切れた瞬間に少しターンを消費するので注意。",
\r
1446 "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
1451 if (info) return info_duration(base, base);
\r
1455 set_invuln(randint1(base) + base, FALSE);
\r
1466 * @brief 自然領域魔法の各処理を行う
\r
1467 * @param spell 魔法ID
\r
1468 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
1469 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
1471 static cptr do_nature_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
1473 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
1474 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
1475 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
1476 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
1478 static const char s_dam[] = _("損傷:", "dam ");
\r
1479 static const char s_rng[] = _("射程", "rng ");
\r
1482 int plev = p_ptr->lev;
\r
1487 if (name) return _("モンスター感知", "Detect Creatures");
\r
1488 if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
\r
1491 int rad = DETECT_RAD_DEFAULT;
\r
1493 if (info) return info_radius(rad);
\r
1497 detect_monsters_normal(rad);
\r
1503 if (name) return _("稲妻", "Lightning");
\r
1504 if (desc) return _("電撃の短いビームを放つ。", "Fires a short beam of lightning.");
\r
1507 int dice = 3 + (plev - 1) / 5;
\r
1509 POSITION range = plev / 6 + 2;
\r
1511 if (info) return format("%s%dd%d %s%d", s_dam, dice, sides, s_rng, range);
\r
1515 project_length = range;
\r
1517 if (!get_aim_dir(&dir)) return NULL;
\r
1519 fire_beam(GF_ELEC, dir, damroll(dice, sides));
\r
1525 if (name) return _("罠と扉感知", "Detect Doors and Traps");
\r
1526 if (desc) return _("近くの全ての罠と扉を感知する。", "Detects traps, doors, and stairs in your vicinity.");
\r
1529 int rad = DETECT_RAD_DEFAULT;
\r
1531 if (info) return info_radius(rad);
\r
1535 detect_traps(rad, TRUE);
\r
1536 detect_doors(rad);
\r
1537 detect_stairs(rad);
\r
1543 if (name) return _("食糧生成", "Produce Food");
\r
1544 if (desc) return _("食料を一つ作り出す。", "Produces a Ration of Food.");
\r
1549 object_type forge, *q_ptr = &forge;
\r
1550 msg_print(_("食料を生成した。", "A food ration is produced."));
\r
1552 /* Create the food ration */
\r
1553 object_prep(q_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION));
\r
1555 /* Drop the object from heaven */
\r
1556 drop_near(q_ptr, -1, p_ptr->y, p_ptr->x);
\r
1562 if (name) return _("日の光", "Daylight");
\r
1563 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
\r
1567 int sides = plev / 2;
\r
1568 int rad = (plev / 10) + 1;
\r
1570 if (info) return info_damage(dice, sides, 0);
\r
1574 lite_area(damroll(dice, sides), rad);
\r
1576 if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)
\r
1578 msg_print(_("日の光があなたの肉体を焦がした!", "The daylight scorches your flesh!"));
\r
1579 take_hit(DAMAGE_NOESCAPE, damroll(2, 2), _("日の光", "daylight"), -1);
\r
1586 if (name) return _("動物習し", "Animal Taming");
\r
1587 if (desc) return _("動物1体を魅了する。抵抗されると無効。", "Attempts to charm an animal.");
\r
1592 if (info) return info_power(power);
\r
1596 if (!get_aim_dir(&dir)) return NULL;
\r
1598 charm_animal(dir, power);
\r
1604 if (name) return _("環境への耐性", "Resist Environment");
\r
1605 if (desc) return _("一定時間、冷気、炎、電撃に対する耐性を得る。装備による耐性に累積する。",
\r
1606 "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");
\r
1611 if (info) return info_duration(base, base);
\r
1615 set_oppose_cold(randint1(base) + base, FALSE);
\r
1616 set_oppose_fire(randint1(base) + base, FALSE);
\r
1617 set_oppose_elec(randint1(base) + base, FALSE);
\r
1623 if (name) return _("傷と毒治療", "Cure Wounds & Poison");
\r
1624 if (desc) return _("怪我を全快させ、毒を体から完全に取り除き、体力を少し回復させる。", "Heals all cut and poison status. Heals HP a little.");
\r
1630 if (info) return info_heal(dice, sides, 0);
\r
1634 hp_player(damroll(dice, sides));
\r
1642 if (name) return _("岩石溶解", "Stone to Mud");
\r
1643 if (desc) return _("壁を溶かして床にする。", "Turns one rock square to mud.");
\r
1650 if (info) return info_damage(dice, sides, base);
\r
1654 if (!get_aim_dir(&dir)) return NULL;
\r
1656 wall_to_mud(dir, 20 + randint1(30));
\r
1662 if (name) return _("アイス・ボルト", "Frost Bolt");
\r
1663 if (desc) return _("冷気のボルトもしくはビームを放つ。", "Fires a bolt or beam of cold.");
\r
1666 int dice = 3 + (plev - 5) / 4;
\r
1669 if (info) return info_damage(dice, sides, 0);
\r
1673 if (!get_aim_dir(&dir)) return NULL;
\r
1674 fire_bolt_or_beam(beam_chance() - 10, GF_COLD, dir, damroll(dice, sides));
\r
1680 if (name) return _("自然の覚醒", "Nature Awareness");
\r
1681 if (desc) return _("周辺の地形を感知し、近くの罠、扉、階段、全てのモンスターを感知する。",
\r
1682 "Maps nearby area. Detects all monsters, traps, doors and stairs.");
\r
1685 int rad1 = DETECT_RAD_MAP;
\r
1686 int rad2 = DETECT_RAD_DEFAULT;
\r
1688 if (info) return info_radius(MAX(rad1, rad2));
\r
1693 detect_traps(rad2, TRUE);
\r
1694 detect_doors(rad2);
\r
1695 detect_stairs(rad2);
\r
1696 detect_monsters_normal(rad2);
\r
1702 if (name) return _("ファイア・ボルト", "Fire Bolt");
\r
1703 if (desc) return _("火炎のボルトもしくはビームを放つ。", "Fires a bolt or beam of fire.");
\r
1706 int dice = 5 + (plev - 5) / 4;
\r
1709 if (info) return info_damage(dice, sides, 0);
\r
1713 if (!get_aim_dir(&dir)) return NULL;
\r
1714 fire_bolt_or_beam(beam_chance() - 10, GF_FIRE, dir, damroll(dice, sides));
\r
1720 if (name) return _("太陽光線", "Ray of Sunlight");
\r
1721 if (desc) return _("光線を放つ。光りを嫌うモンスターに効果がある。", "Fires a beam of light which damages to light-sensitive monsters.");
\r
1727 if (info) return info_damage(dice, sides, 0);
\r
1731 if (!get_aim_dir(&dir)) return NULL;
\r
1732 msg_print(_("太陽光線が現れた。", "A line of sunlight appears."));
\r
1733 lite_line(dir, damroll(6, 8));
\r
1739 if (name) return _("足かせ", "Entangle");
\r
1740 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
\r
1745 if (info) return info_power(power);
\r
1749 slow_monsters(plev);
\r
1755 if (name) return _("動物召喚", "Summon Animal");
\r
1756 if (desc) return _("動物を1体召喚する。", "Summons an animal.");
\r
1761 if (!(summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_ANIMAL_RANGER, (PM_ALLOW_GROUP | PM_FORCE_PET))))
\r
1763 msg_print(_("動物は現れなかった。", "No animals arrive."));
\r
1771 if (name) return _("薬草治療", "Herbal Healing");
\r
1772 if (desc) return _("体力を大幅に回復させ、負傷、朦朧状態、毒から全快する。", "Heals HP greatly. And heals cut, stun and poison completely.");
\r
1777 if (info) return info_heal(0, 0, heal);
\r
1790 if (name) return _("階段生成", "Stair Building");
\r
1791 if (desc) return _("自分のいる位置に階段を作る。", "Creates a stair which goes down or up.");
\r
1802 if (name) return _("肌石化", "Stone Skin");
\r
1803 if (desc) return _("一定時間、ACを上昇させる。", "Gives bonus to AC for a while.");
\r
1809 if (info) return info_duration(base, sides);
\r
1813 set_shield(randint1(sides) + base, FALSE);
\r
1819 if (name) return _("真・耐性", "Resistance True");
\r
1820 if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
\r
1821 "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
1826 if (info) return info_duration(base, base);
\r
1830 set_oppose_acid(randint1(base) + base, FALSE);
\r
1831 set_oppose_elec(randint1(base) + base, FALSE);
\r
1832 set_oppose_fire(randint1(base) + base, FALSE);
\r
1833 set_oppose_cold(randint1(base) + base, FALSE);
\r
1834 set_oppose_pois(randint1(base) + base, FALSE);
\r
1840 if (name) return _("森林創造", "Forest Creation");
\r
1841 if (desc) return _("周囲に木を作り出す。", "Creates trees in all adjacent squares.");
\r
1852 if (name) return _("動物友和", "Animal Friendship");
\r
1853 if (desc) return _("視界内の全ての動物を魅了する。抵抗されると無効。", "Attempts to charm all animals in sight.");
\r
1856 int power = plev * 2;
\r
1858 if (info) return info_power(power);
\r
1862 charm_animals(power);
\r
1868 if (name) return _("試金石", "Stone Tell");
\r
1869 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
\r
1874 if (!identify_fully(FALSE)) return NULL;
\r
1880 if (name) return _("石の壁", "Wall of Stone");
\r
1881 if (desc) return _("自分の周囲に花崗岩の壁を作る。", "Creates granite walls in all adjacent squares.");
\r
1892 if (name) return _("腐食防止", "Protect from Corrosion");
\r
1893 if (desc) return _("アイテムを酸で傷つかないよう加工する。", "Makes an equipment acid-proof.");
\r
1898 if (!rustproof()) return NULL;
\r
1904 if (name) return _("地震", "Earthquake");
\r
1905 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
\r
1906 "Shakes dungeon structure, and results in random swapping of floors and walls.");
\r
1911 if (info) return info_radius(rad);
\r
1915 earthquake(p_ptr->y, p_ptr->x, rad);
\r
1921 if (name) return _("カマイタチ", "Cyclone");
\r
1922 if (desc) return _("全方向に向かって攻撃する。", "Attacks all adjacent monsters.");
\r
1929 monster_type *m_ptr;
\r
1931 for (dir = 0; dir < 8; dir++)
\r
1933 y = p_ptr->y + ddy_ddd[dir];
\r
1934 x = p_ptr->x + ddx_ddd[dir];
\r
1935 c_ptr = &cave[y][x];
\r
1937 /* Get the monster */
\r
1938 m_ptr = &m_list[c_ptr->m_idx];
\r
1940 /* Hack -- attack monsters */
\r
1941 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
\r
1942 py_attack(y, x, 0);
\r
1949 if (name) return _("ブリザード", "Blizzard");
\r
1950 if (desc) return _("巨大な冷気の球を放つ。", "Fires a huge ball of cold.");
\r
1953 HIT_POINT dam = 70 + plev * 3 / 2;
\r
1954 int rad = plev / 12 + 1;
\r
1956 if (info) return info_damage(0, 0, dam);
\r
1960 if (!get_aim_dir(&dir)) return NULL;
\r
1962 fire_ball(GF_COLD, dir, dam, rad);
\r
1968 if (name) return _("稲妻嵐", "Lightning Storm");
\r
1969 if (desc) return _("巨大な電撃の球を放つ。", "Fires a huge electric ball.");
\r
1972 HIT_POINT dam = 90 + plev * 3 / 2;
\r
1973 int rad = plev / 12 + 1;
\r
1975 if (info) return info_damage(0, 0, dam);
\r
1979 if (!get_aim_dir(&dir)) return NULL;
\r
1980 fire_ball(GF_ELEC, dir, dam, rad);
\r
1987 if (name) return _("渦潮", "Whirlpool");
\r
1988 if (desc) return _("巨大な水の球を放つ。", "Fires a huge ball of water.");
\r
1991 HIT_POINT dam = 100 + plev * 3 / 2;
\r
1992 int rad = plev / 12 + 1;
\r
1994 if (info) return info_damage(0, 0, dam);
\r
1998 if (!get_aim_dir(&dir)) return NULL;
\r
1999 fire_ball(GF_WATER, dir, dam, rad);
\r
2005 if (name) return _("陽光召喚", "Call Sunlight");
\r
2006 if (desc) return _("自分を中心とした光の球を発生させる。さらに、その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。",
\r
2007 "Generates ball of light centered on you. Maps and lights whole dungeon level. Knows all objects location.");
\r
2010 HIT_POINT dam = 150;
\r
2013 if (info) return info_damage(0, 0, dam/2);
\r
2017 fire_ball(GF_LITE, 0, dam, rad);
\r
2018 chg_virtue(V_KNOWLEDGE, 1);
\r
2019 chg_virtue(V_ENLIGHTEN, 1);
\r
2022 if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)
\r
2024 msg_print(_("日光があなたの肉体を焦がした!", "The sunlight scorches your flesh!"));
\r
2025 take_hit(DAMAGE_NOESCAPE, 50, _("日光", "sunlight"), -1);
\r
2032 if (name) return _("精霊の刃", "Elemental Branding");
\r
2033 if (desc) return _("武器に炎か冷気の属性をつける。", "Makes current weapon fire or frost branded.");
\r
2038 brand_weapon(randint0(2));
\r
2044 if (name) return _("自然の脅威", "Nature's Wrath");
\r
2045 if (desc) return _("近くの全てのモンスターにダメージを与え、地震を起こし、自分を中心とした分解の球を発生させる。",
\r
2046 "Damages all monsters in sight. Makes quake. Generates disintegration ball centered on you.");
\r
2049 int d_dam = 4 * plev;
\r
2050 int b_dam = (100 + plev) * 2;
\r
2051 int b_rad = 1 + plev / 12;
\r
2052 int q_rad = 20 + plev / 2;
\r
2054 if (info) return format("%s%d+%d", s_dam, d_dam, b_dam/2);
\r
2058 dispel_monsters(d_dam);
\r
2059 earthquake(p_ptr->y, p_ptr->x, q_rad);
\r
2060 project(0, b_rad, p_ptr->y, p_ptr->x, b_dam, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM, -1);
\r
2071 * @brief カオス領域魔法の各処理を行う
\r
2072 * @param spell 魔法ID
\r
2073 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
2074 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
2076 static cptr do_chaos_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
2078 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
2079 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
2080 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
2081 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
2083 static const char s_dam[] = _("損傷:", "dam ");
\r
2084 static const char s_random[] = _("ランダム", "random");
\r
2087 int plev = p_ptr->lev;
\r
2092 if (name) return _("マジック・ミサイル", "Magic Missile");
\r
2093 if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");
\r
2096 int dice = 3 + ((plev - 1) / 5);
\r
2099 if (info) return info_damage(dice, sides, 0);
\r
2103 if (!get_aim_dir(&dir)) return NULL;
\r
2105 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));
\r
2111 if (name) return _("トラップ/ドア破壊", "Trap / Door Destruction");
\r
2112 if (desc) return _("隣接する罠と扉を破壊する。", "Destroys all traps in adjacent squares.");
\r
2117 if (info) return info_radius(rad);
\r
2121 destroy_doors_touch();
\r
2127 if (name) return _("閃光", "Flash of Light");
\r
2128 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
\r
2132 int sides = plev / 2;
\r
2133 int rad = (plev / 10) + 1;
\r
2135 if (info) return info_damage(dice, sides, 0);
\r
2139 lite_area(damroll(dice, sides), rad);
\r
2145 if (name) return _("混乱の手", "Touch of Confusion");
\r
2146 if (desc) return _("相手を混乱させる攻撃をできるようにする。", "Attempts to confuse the next monster that you hit.");
\r
2151 if (!(p_ptr->special_attack & ATTACK_CONFUSE))
\r
2153 msg_print(_("あなたの手は光り始めた。", "Your hands start glowing."));
\r
2154 p_ptr->special_attack |= ATTACK_CONFUSE;
\r
2155 p_ptr->redraw |= (PR_STATUS);
\r
2162 if (name) return _("魔力炸裂", "Mana Burst");
\r
2163 if (desc) return _("魔法の球を放つ。", "Fires a ball of magic.");
\r
2168 int rad = (plev < 30) ? 2 : 3;
\r
2171 if (p_ptr->pclass == CLASS_MAGE ||
\r
2172 p_ptr->pclass == CLASS_HIGH_MAGE ||
\r
2173 p_ptr->pclass == CLASS_SORCERER)
\r
2174 base = plev + plev / 2;
\r
2176 base = plev + plev / 4;
\r
2179 if (info) return info_damage(dice, sides, base);
\r
2183 if (!get_aim_dir(&dir)) return NULL;
\r
2185 fire_ball(GF_MISSILE, dir, damroll(dice, sides) + base, rad);
\r
2188 * Shouldn't actually use GF_MANA, as
\r
2189 * it will destroy all items on the
\r
2197 if (name) return _("ファイア・ボルト", "Fire Bolt");
\r
2198 if (desc) return _("炎のボルトもしくはビームを放つ。", "Fires a bolt or beam of fire.");
\r
2201 int dice = 8 + (plev - 5) / 4;
\r
2204 if (info) return info_damage(dice, sides, 0);
\r
2208 if (!get_aim_dir(&dir)) return NULL;
\r
2210 fire_bolt_or_beam(beam_chance(), GF_FIRE, dir, damroll(dice, sides));
\r
2216 if (name) return _("力の拳", "Fist of Force");
\r
2217 if (desc) return _("ごく小さな分解の球を放つ。", "Fires a tiny ball of disintegration.");
\r
2220 int dice = 8 + ((plev - 5) / 4);
\r
2223 if (info) return info_damage(dice, sides, 0);
\r
2227 if (!get_aim_dir(&dir)) return NULL;
\r
2229 fire_ball(GF_DISINTEGRATE, dir,
\r
2230 damroll(dice, sides), 0);
\r
2236 if (name) return _("テレポート", "Teleport Self");
\r
2237 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
\r
2240 POSITION range = plev * 5;
\r
2242 if (info) return info_range(range);
\r
2246 teleport_player(range, 0L);
\r
2252 if (name) return _("ワンダー", "Wonder");
\r
2253 if (desc) return _("モンスターにランダムな効果を与える。", "Fires something with random effects.");
\r
2256 if (info) return s_random;
\r
2261 if (!get_aim_dir(&dir)) return NULL;
\r
2269 if (name) return _("カオス・ボルト", "Chaos Bolt");
\r
2270 if (desc) return _("カオスのボルトもしくはビームを放つ。", "Fires a bolt or ball of chaos.");
\r
2273 int dice = 10 + (plev - 5) / 4;
\r
2276 if (info) return info_damage(dice, sides, 0);
\r
2280 if (!get_aim_dir(&dir)) return NULL;
\r
2282 fire_bolt_or_beam(beam_chance(), GF_CHAOS, dir, damroll(dice, sides));
\r
2288 if (name) return _("ソニック・ブーム", "Sonic Boom");
\r
2289 if (desc) return _("自分を中心とした轟音の球を発生させる。", "Generates a ball of sound centered on you.");
\r
2292 HIT_POINT dam = 60 + plev;
\r
2293 int rad = plev / 10 + 2;
\r
2295 if (info) return info_damage(0, 0, dam/2);
\r
2299 msg_print(_("ドーン!部屋が揺れた!", "BOOM! Shake the room!"));
\r
2300 project(0, rad, p_ptr->y, p_ptr->x, dam, GF_SOUND, PROJECT_KILL | PROJECT_ITEM, -1);
\r
2306 if (name) return _("破滅の矢", "Doom Bolt");
\r
2307 if (desc) return _("純粋な魔力のビームを放つ。", "Fires a beam of pure mana.");
\r
2310 int dice = 11 + (plev - 5) / 4;
\r
2313 if (info) return info_damage(dice, sides, 0);
\r
2317 if (!get_aim_dir(&dir)) return NULL;
\r
2319 fire_beam(GF_MANA, dir, damroll(dice, sides));
\r
2325 if (name) return _("ファイア・ボール", "Fire Ball");
\r
2326 if (desc) return _("炎の球を放つ。", "Fires a ball of fire.");
\r
2329 HIT_POINT dam = plev + 55;
\r
2332 if (info) return info_damage(0, 0, dam);
\r
2336 if (!get_aim_dir(&dir)) return NULL;
\r
2338 fire_ball(GF_FIRE, dir, dam, rad);
\r
2344 if (name) return _("テレポート・アウェイ", "Teleport Other");
\r
2345 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
\r
2350 if (info) return info_power(power);
\r
2354 if (!get_aim_dir(&dir)) return NULL;
\r
2356 fire_beam(GF_AWAY_ALL, dir, power);
\r
2362 if (name) return _("破壊の言葉", "Word of Destruction");
\r
2363 if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroy everything in nearby area.");
\r
2371 destroy_area(p_ptr->y, p_ptr->x, base + randint1(sides), FALSE);
\r
2377 if (name) return _("ログルス発動", "Invoke Logrus");
\r
2378 if (desc) return _("巨大なカオスの球を放つ。", "Fires a huge ball of chaos.");
\r
2381 HIT_POINT dam = plev * 2 + 99;
\r
2382 int rad = plev / 5;
\r
2384 if (info) return info_damage(0, 0, dam);
\r
2388 if (!get_aim_dir(&dir)) return NULL;
\r
2390 fire_ball(GF_CHAOS, dir, dam, rad);
\r
2396 if (name) return _("他者変容", "Polymorph Other");
\r
2397 if (desc) return _("モンスター1体を変身させる。抵抗されると無効。", "Attempts to polymorph a monster.");
\r
2402 if (info) return info_power(power);
\r
2406 if (!get_aim_dir(&dir)) return NULL;
\r
2408 poly_monster(dir, plev);
\r
2414 if (name) return _("連鎖稲妻", "Chain Lightning");
\r
2415 if (desc) return _("全方向に対して電撃のビームを放つ。", "Fires lightning beams in all directions.");
\r
2418 int dice = 5 + plev / 10;
\r
2421 if (info) return info_damage(dice, sides, 0);
\r
2425 for (dir = 0; dir <= 9; dir++)
\r
2426 fire_beam(GF_ELEC, dir, damroll(dice, sides));
\r
2432 if (name) return _("魔力封入", "Arcane Binding");
\r
2433 if (desc) return _("杖/魔法棒の充填回数を増やすか、充填中のロッドの充填時間を減らす。", "Recharges staffs, wands or rods.");
\r
2438 if (info) return info_power(power);
\r
2442 if (!recharge(power)) return NULL;
\r
2448 if (name) return _("原子分解", "Disintegrate");
\r
2449 if (desc) return _("巨大な分解の球を放つ。", "Fires a huge ball of disintegration.");
\r
2452 HIT_POINT dam = plev + 70;
\r
2453 int rad = 3 + plev / 40;
\r
2455 if (info) return info_damage(0, 0, dam);
\r
2459 if (!get_aim_dir(&dir)) return NULL;
\r
2461 fire_ball(GF_DISINTEGRATE, dir, dam, rad);
\r
2467 if (name) return _("現実変容", "Alter Reality");
\r
2468 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
\r
2474 if (info) return info_delay(base, sides);
\r
2484 if (name) return _("マジック・ロケット", "Magic Rocket");
\r
2485 if (desc) return _("ロケットを発射する。", "Fires a magic rocket.");
\r
2488 HIT_POINT dam = 120 + plev * 2;
\r
2491 if (info) return info_damage(0, 0, dam);
\r
2495 if (!get_aim_dir(&dir)) return NULL;
\r
2497 msg_print(_("ロケット発射!", "You launch a rocket!"));
\r
2498 fire_rocket(GF_ROCKET, dir, dam, rad);
\r
2504 if (name) return _("混沌の刃", "Chaos Branding");
\r
2505 if (desc) return _("武器にカオスの属性をつける。", "Makes current weapon a Chaotic weapon.");
\r
2516 if (name) return _("悪魔召喚", "Summon Demon");
\r
2517 if (desc) return _("悪魔を1体召喚する。", "Summons a demon.");
\r
2523 bool pet = !one_in_(3);
\r
2525 if (pet) flg |= PM_FORCE_PET;
\r
2526 else flg |= PM_NO_PET;
\r
2527 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
\r
2529 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_DEMON, flg))
\r
2531 msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));
\r
2534 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
\r
2538 msg_print(_("「卑しき者よ、我は汝の下僕にあらず! お前の魂を頂くぞ!」",
\r
2539 "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));
\r
2547 if (name) return _("重力光線", "Beam of Gravity");
\r
2548 if (desc) return _("重力のビームを放つ。", "Fires a beam of gravity.");
\r
2551 int dice = 9 + (plev - 5) / 4;
\r
2554 if (info) return info_damage(dice, sides, 0);
\r
2558 if (!get_aim_dir(&dir)) return NULL;
\r
2560 fire_beam(GF_GRAVITY, dir, damroll(dice, sides));
\r
2566 if (name) return _("流星群", "Meteor Swarm");
\r
2567 if (desc) return _("自分の周辺に隕石を落とす。", "Makes meteor balls fall down to nearby random locations.");
\r
2570 HIT_POINT dam = plev * 2;
\r
2573 if (info) return info_multi_damage(dam);
\r
2577 cast_meteor(dam, rad);
\r
2583 if (name) return _("焔の一撃", "Flame Strike");
\r
2584 if (desc) return _("自分を中心とした超巨大な炎の球を発生させる。", "Generate a huge ball of fire centered on you.");
\r
2587 HIT_POINT dam = 300 + 3 * plev;
\r
2590 if (info) return info_damage(0, 0, dam/2);
\r
2594 fire_ball(GF_FIRE, 0, dam, rad);
\r
2600 if (name) return _("混沌召来", "Call Chaos");
\r
2601 if (desc) return _("ランダムな属性の球やビームを発生させる。", "Generate random kind of balls or beams.");
\r
2604 if (info) return format("%s150 / 250", s_dam);
\r
2614 if (name) return _("自己変容", "Polymorph Self");
\r
2615 if (desc) return _("自分を変身させようとする。", "Polymorphs yourself.");
\r
2620 if (!get_check(_("変身します。よろしいですか?", "You will polymorph yourself. Are you sure? "))) return NULL;
\r
2627 if (name) return _("魔力の嵐", "Mana Storm");
\r
2628 if (desc) return _("非常に強力で巨大な純粋な魔力の球を放つ。", "Fires an extremely powerful huge ball of pure mana.");
\r
2631 HIT_POINT dam = 300 + plev * 4;
\r
2634 if (info) return info_damage(0, 0, dam);
\r
2638 if (!get_aim_dir(&dir)) return NULL;
\r
2640 fire_ball(GF_MANA, dir, dam, rad);
\r
2646 if (name) return _("ログルスのブレス", "Breathe Logrus");
\r
2647 if (desc) return _("非常に強力なカオスの球を放つ。", "Fires an extremely powerful ball of chaos.");
\r
2650 HIT_POINT dam = p_ptr->chp;
\r
2653 if (info) return info_damage(0, 0, dam);
\r
2657 if (!get_aim_dir(&dir)) return NULL;
\r
2659 fire_ball(GF_CHAOS, dir, dam, rad);
\r
2665 if (name) return _("虚無召来", "Call the Void");
\r
2666 if (desc) return _("自分に周囲に向かって、ロケット、純粋な魔力の球、放射性廃棄物の球を放つ。ただし、壁に隣接して使用すると広範囲を破壊する。",
\r
2667 "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
2670 if (info) return format("%s3 * 175", s_dam);
\r
2684 * @brief 暗黒領域魔法の各処理を行う
\r
2685 * @param spell 魔法ID
\r
2686 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
2687 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
2689 static cptr do_death_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
2691 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
2692 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
2693 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
2694 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
2696 static const char s_dam[] = _("損傷:", "dam ");
\r
2697 static const char s_random[] = _("ランダム", "random");
\r
2700 int plev = p_ptr->lev;
\r
2705 if (name) return _("無生命感知", "Detect Unlife");
\r
2706 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
\r
2709 int rad = DETECT_RAD_DEFAULT;
\r
2711 if (info) return info_radius(rad);
\r
2715 detect_monsters_nonliving(rad);
\r
2721 if (name) return _("呪殺弾", "Malediction");
\r
2722 if (desc) return _("ごく小さな邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",
\r
2723 "Fires a tiny ball of evil power which hurts good monsters greatly.");
\r
2726 int dice = 3 + (plev - 1) / 5;
\r
2730 if (info) return info_damage(dice, sides, 0);
\r
2734 if (!get_aim_dir(&dir)) return NULL;
\r
2737 * A radius-0 ball may (1) be aimed at
\r
2738 * objects etc., and will affect them;
\r
2739 * (2) may be aimed at ANY visible
\r
2740 * monster, unlike a 'bolt' which must
\r
2741 * travel to the monster.
\r
2744 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides), rad);
\r
2748 /* Special effect first */
\r
2749 int effect = randint1(1000);
\r
2751 if (effect == 666)
\r
2752 fire_ball_hide(GF_DEATH_RAY, dir, plev * 200, 0);
\r
2753 else if (effect < 500)
\r
2754 fire_ball_hide(GF_TURN_ALL, dir, plev, 0);
\r
2755 else if (effect < 800)
\r
2756 fire_ball_hide(GF_OLD_CONF, dir, plev, 0);
\r
2758 fire_ball_hide(GF_STUN, dir, plev, 0);
\r
2765 if (name) return _("邪悪感知", "Detect Evil");
\r
2766 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
\r
2769 int rad = DETECT_RAD_DEFAULT;
\r
2771 if (info) return info_radius(rad);
\r
2775 detect_monsters_evil(rad);
\r
2781 if (name) return _("悪臭雲", "Stinking Cloud");
\r
2782 if (desc) return _("毒の球を放つ。", "Fires a ball of poison.");
\r
2785 HIT_POINT dam = 10 + plev / 2;
\r
2788 if (info) return info_damage(0, 0, dam);
\r
2792 if (!get_aim_dir(&dir)) return NULL;
\r
2794 fire_ball(GF_POIS, dir, dam, rad);
\r
2800 if (name) return _("黒い眠り", "Black Sleep");
\r
2801 if (desc) return _("1体のモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep a monster.");
\r
2806 if (info) return info_power(power);
\r
2810 if (!get_aim_dir(&dir)) return NULL;
\r
2812 sleep_monster(dir, plev);
\r
2818 if (name) return _("耐毒", "Resist Poison");
\r
2819 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",
\r
2820 "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");
\r
2825 if (info) return info_duration(base, base);
\r
2829 set_oppose_pois(randint1(base) + base, FALSE);
\r
2835 if (name) return _("恐慌", "Horrify");
\r
2836 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
\r
2841 if (info) return info_power(power);
\r
2845 if (!get_aim_dir(&dir)) return NULL;
\r
2847 fear_monster(dir, power);
\r
2848 stun_monster(dir, power);
\r
2854 if (name) return _("アンデッド従属", "Enslave Undead");
\r
2855 if (desc) return _("アンデッド1体を魅了する。抵抗されると無効。", "Attempts to charm an undead monster.");
\r
2860 if (info) return info_power(power);
\r
2864 if (!get_aim_dir(&dir)) return NULL;
\r
2866 control_one_undead(dir, power);
\r
2872 if (name) return _("エントロピーの球", "Orb of Entropy");
\r
2873 if (desc) return _("生命のある者のHPと最大HP双方にダメージを与える効果のある球を放つ。", "Fires a ball which damages to both HP and MaxHP of living monsters.");
\r
2878 int rad = (plev < 30) ? 2 : 3;
\r
2881 if (p_ptr->pclass == CLASS_MAGE ||
\r
2882 p_ptr->pclass == CLASS_HIGH_MAGE ||
\r
2883 p_ptr->pclass == CLASS_SORCERER)
\r
2884 base = plev + plev / 2;
\r
2886 base = plev + plev / 4;
\r
2889 if (info) return info_damage(dice, sides, base);
\r
2893 if (!get_aim_dir(&dir)) return NULL;
\r
2895 fire_ball(GF_HYPODYNAMIA, dir, damroll(dice, sides) + base, rad);
\r
2901 if (name) return _("地獄の矢", "Nether Bolt");
\r
2902 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
\r
2905 int dice = 8 + (plev - 5) / 4;
\r
2908 if (info) return info_damage(dice, sides, 0);
\r
2912 if (!get_aim_dir(&dir)) return NULL;
\r
2914 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
\r
2920 if (name) return _("殺戮雲", "Cloud kill");
\r
2921 if (desc) return _("自分を中心とした毒の球を発生させる。", "Generate a ball of poison centered on you.");
\r
2924 HIT_POINT dam = (30 + plev) * 2;
\r
2925 int rad = plev / 10 + 2;
\r
2927 if (info) return info_damage(0, 0, dam/2);
\r
2931 project(0, rad, p_ptr->y, p_ptr->x, dam, GF_POIS, PROJECT_KILL | PROJECT_ITEM, -1);
\r
2937 if (name) return _("モンスター消滅", "Genocide One");
\r
2938 if (desc) return _("モンスター1体を消し去る。経験値やアイテムは手に入らない。抵抗されると無効。", "Attempts to vanish a monster.");
\r
2941 int power = plev + 50;
\r
2943 if (info) return info_power(power);
\r
2947 if (!get_aim_dir(&dir)) return NULL;
\r
2949 fire_ball_hide(GF_GENOCIDE, dir, power, 0);
\r
2955 if (name) return _("毒の刃", "Poison Branding");
\r
2956 if (desc) return _("武器に毒の属性をつける。", "Makes current weapon poison branded.");
\r
2967 if (name) return _("吸血の矢", "Vampiric Bolt");
\r
2968 if (desc) return _("ボルトによりモンスター1体から生命力を吸いとる。吸いとった生命力によって満腹度が上がる。",
\r
2969 "Absorbs some HP from a monster and gives them to you by bolt. You will also gain nutritional sustenance from this.");
\r
2973 int sides = plev * 2;
\r
2974 int base = plev * 2;
\r
2976 if (info) return info_damage(dice, sides, base);
\r
2980 HIT_POINT dam = base + damroll(dice, sides);
\r
2982 if (!get_aim_dir(&dir)) return NULL;
\r
2984 if (hypodynamic_bolt(dir, dam))
\r
2986 chg_virtue(V_SACRIFICE, -1);
\r
2987 chg_virtue(V_VITALITY, -1);
\r
2992 * Gain nutritional sustenance:
\r
2995 * A Food ration gives 5000
\r
2996 * food points (by contrast)
\r
2997 * Don't ever get more than
\r
2998 * "Full" this way But if we
\r
2999 * ARE Gorged, it won't cure
\r
3002 dam = p_ptr->food + MIN(5000, 100 * dam);
\r
3004 /* Not gorged already */
\r
3005 if (p_ptr->food < PY_FOOD_MAX)
\r
3006 set_food(dam >= PY_FOOD_MAX ? PY_FOOD_MAX - 1 : dam);
\r
3013 if (name) return _("反魂の術", "Animate dead");
\r
3014 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
\r
3019 animate_dead(0, p_ptr->y, p_ptr->x);
\r
3025 if (name) return _("抹殺", "Genocide");
\r
3026 if (desc) return _("指定した文字のモンスターを現在の階から消し去る。抵抗されると無効。",
\r
3027 "Eliminates an entire class of monster, exhausting you. Powerful or unique monsters may resist.");
\r
3030 int power = plev+50;
\r
3032 if (info) return info_power(power);
\r
3036 symbol_genocide(power, TRUE);
\r
3042 if (name) return _("狂戦士化", "Berserk");
\r
3043 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");
\r
3048 if (info) return info_duration(base, base);
\r
3052 set_shero(randint1(base) + base, FALSE);
\r
3060 if (name) return _("悪霊召喚", "Invoke Spirits");
\r
3061 if (desc) return _("ランダムで様々な効果が起こる。", "Causes random effects.");
\r
3064 if (info) return s_random;
\r
3068 if (!get_aim_dir(&dir)) return NULL;
\r
3070 cast_invoke_spirits(dir);
\r
3076 if (name) return _("暗黒の矢", "Dark Bolt");
\r
3077 if (desc) return _("暗黒のボルトもしくはビームを放つ。", "Fires a bolt or beam of darkness.");
\r
3080 int dice = 4 + (plev - 5) / 4;
\r
3083 if (info) return info_damage(dice, sides, 0);
\r
3087 if (!get_aim_dir(&dir)) return NULL;
\r
3089 fire_bolt_or_beam(beam_chance(), GF_DARK, dir, damroll(dice, sides));
\r
3095 if (name) return _("狂乱戦士", "Battle Frenzy");
\r
3096 if (desc) return _("狂戦士化し、恐怖を除去し、加速する。",
\r
3097 "Gives another bonus to hit and HP, immunity to fear for a while. Hastes you. But decreases AC.");
\r
3101 int sp_base = plev / 2;
\r
3102 int sp_sides = 20 + plev / 2;
\r
3104 if (info) return info_duration(b_base, b_base);
\r
3108 set_shero(randint1(25) + 25, FALSE);
\r
3111 set_fast(randint1(sp_sides) + sp_base, FALSE);
\r
3117 if (name) return _("吸血の刃", "Vampiric Branding");
\r
3118 if (desc) return _("武器に吸血の属性をつける。", "Makes current weapon Vampiric.");
\r
3129 if (name) return _("吸血の連矢", "Vampiric Bolts");
\r
3130 if (desc) return _("3連射のボルトによりモンスター1体から生命力を吸いとる。吸いとった生命力によって体力が回復する。",
\r
3131 "Fires 3 bolts. Each of the bolts absorbs some HP from a monster and gives them to you.");
\r
3133 HIT_POINT dam = 100;
\r
3135 if (info) return format("%s3*%d", s_dam, dam);
\r
3141 if (!get_aim_dir(&dir)) return NULL;
\r
3143 chg_virtue(V_SACRIFICE, -1);
\r
3144 chg_virtue(V_VITALITY, -1);
\r
3146 for (i = 0; i < 3; i++)
\r
3148 if (hypodynamic_bolt(dir, dam))
\r
3156 if (name) return _("死の言魂", "Nether Wave");
\r
3157 if (desc) return _("視界内の生命のあるモンスターにダメージを与える。", "Damages all living monsters in sight.");
\r
3160 int sides = plev * 3;
\r
3162 if (info) return info_damage(1, sides, 0);
\r
3166 dispel_living(randint1(sides));
\r
3172 if (name) return _("暗黒の嵐", "Darkness Storm");
\r
3173 if (desc) return _("巨大な暗黒の球を放つ。", "Fires a huge ball of darkness.");
\r
3176 HIT_POINT dam = 100 + plev * 2;
\r
3179 if (info) return info_damage(0, 0, dam);
\r
3183 if (!get_aim_dir(&dir)) return NULL;
\r
3185 fire_ball(GF_DARK, dir, dam, rad);
\r
3191 if (name) return _("死の光線", "Death Ray");
\r
3192 if (desc) return _("死の光線を放つ。", "Fires a beam of death.");
\r
3197 if (!get_aim_dir(&dir)) return NULL;
\r
3199 death_ray(dir, plev);
\r
3205 if (name) return _("死者召喚", "Raise the Dead");
\r
3206 if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");
\r
3212 bool pet = one_in_(3);
\r
3215 type = (plev > 47 ? SUMMON_HI_UNDEAD : SUMMON_UNDEAD);
\r
3217 if (!pet || (pet && (plev > 24) && one_in_(3)))
\r
3218 flg |= PM_ALLOW_GROUP;
\r
3220 if (pet) flg |= PM_FORCE_PET;
\r
3221 else flg |= (PM_ALLOW_UNIQUE | PM_NO_PET);
\r
3223 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, type, flg))
\r
3225 msg_print(_("冷たい風があなたの周りに吹き始めた。それは腐敗臭を運んでいる...",
\r
3226 "Cold winds begin to blow around you, carrying with them the stench of decay..."));
\r
3231 msg_print(_("古えの死せる者共があなたに仕えるため土から甦った!",
\r
3232 "Ancient, long-dead forms arise from the ground to serve you!"));
\r
3236 msg_print(_("死者が甦った。眠りを妨げるあなたを罰するために!",
\r
3237 "'The dead arise... to punish you for disturbing them!'"));
\r
3240 chg_virtue(V_UNLIFE, 1);
\r
3247 if (name) return _("死者の秘伝", "Esoteria");
\r
3248 if (desc) return _("アイテムを1つ識別する。レベルが高いとアイテムの能力を完全に知ることができる。",
\r
3249 "Identifies an item. Or *identifies* an item at higher level.");
\r
3254 if (randint1(50) > plev)
\r
3256 if (!ident_spell(FALSE)) return NULL;
\r
3260 if (!identify_fully(FALSE)) return NULL;
\r
3267 if (name) return _("吸血鬼変化", "Polymorph Vampire");
\r
3268 if (desc) return _("一定時間、吸血鬼に変化する。変化している間は本来の種族の能力を失い、代わりに吸血鬼としての能力を得る。",
\r
3269 "Mimic a vampire for a while. Loses abilities of original race and gets abilities as a vampire.");
\r
3272 int base = 10 + plev / 2;
\r
3274 if (info) return info_duration(base, base);
\r
3278 set_mimic(base + randint1(base), MIMIC_VAMPIRE, FALSE);
\r
3284 if (name) return _("経験値復活", "Restore Life");
\r
3285 if (desc) return _("失った経験値を回復する。", "Restore lost experience.");
\r
3296 if (name) return _("周辺抹殺", "Mass Genocide");
\r
3297 if (desc) return _("自分の周囲にいるモンスターを現在の階から消し去る。抵抗されると無効。",
\r
3298 "Eliminates all nearby monsters, exhausting you. Powerful or unique monsters may be able to resist.");
\r
3301 int power = plev + 50;
\r
3303 if (info) return info_power(power);
\r
3307 mass_genocide(power, TRUE);
\r
3313 if (name) return _("地獄の劫火", "Hellfire");
\r
3314 if (desc) return _("邪悪な力を持つ宝珠を放つ。善良なモンスターには大きなダメージを与える。",
\r
3315 "Fires a powerful ball of evil power. Hurts good monsters greatly.");
\r
3318 HIT_POINT dam = 666;
\r
3321 if (info) return info_damage(0, 0, dam);
\r
3325 if (!get_aim_dir(&dir)) return NULL;
\r
3327 fire_ball(GF_HELL_FIRE, dir, dam, rad);
\r
3328 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("地獄の劫火の呪文を唱えた疲労", "the strain of casting Hellfire"), -1);
\r
3334 if (name) return _("幽体化", "Wraithform");
\r
3335 if (desc) return _("一定時間、壁を通り抜けることができ受けるダメージが軽減される幽体の状態に変身する。",
\r
3336 "Becomes wraith form which gives ability to pass walls and makes all damages half.");
\r
3339 int base = plev / 2;
\r
3341 if (info) return info_duration(base, base);
\r
3345 set_wraith_form(randint1(base) + base, FALSE);
\r
3356 * @brief トランプ領域魔法の各処理を行う
\r
3357 * @param spell 魔法ID
\r
3358 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
3359 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
3361 static cptr do_trump_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
3363 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
3364 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
3365 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
3366 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
3367 bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
\r
3368 static const char s_random[] = _("ランダム", "random");
\r
3371 int plev = p_ptr->lev;
\r
3376 if (name) return _("ショート・テレポート", "Phase Door");
\r
3377 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");
\r
3380 POSITION range = 10;
\r
3382 if (info) return info_range(range);
\r
3386 teleport_player(range, 0L);
\r
3392 if (name) return _("蜘蛛のカード", "Trump Spiders");
\r
3393 if (desc) return _("蜘蛛を召喚する。", "Summons spiders.");
\r
3398 msg_print(_("あなたは蜘蛛のカードに集中する...", "You concentrate on the trump of an spider..."));
\r
3399 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_SPIDER, PM_ALLOW_GROUP))
\r
3403 msg_print(_("召喚された蜘蛛は怒っている!", "The summoned spiders get angry!"));
\r
3411 if (name) return _("シャッフル", "Shuffle");
\r
3412 if (desc) return _("カードの占いをする。", "Causes random effects.");
\r
3415 if (info) return s_random;
\r
3425 if (name) return _("フロア・リセット", "Reset Recall");
\r
3426 if (desc) return _("最深階を変更する。", "Resets the 'deepest' level for recall spell.");
\r
3431 if (!reset_recall()) return NULL;
\r
3437 if (name) return _("テレポート", "Teleport");
\r
3438 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
\r
3441 POSITION range = plev * 4;
\r
3443 if (info) return info_range(range);
\r
3447 teleport_player(range, 0L);
\r
3453 if (name) return _("感知のカード", "Trump Spying");
\r
3454 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
\r
3460 if (info) return info_duration(base, sides);
\r
3464 set_tim_esp(randint1(sides) + base, FALSE);
\r
3470 if (name) return _("テレポート・モンスター", "Teleport Away");
\r
3471 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
\r
3476 if (info) return info_power(power);
\r
3480 if (!get_aim_dir(&dir)) return NULL;
\r
3482 fire_beam(GF_AWAY_ALL, dir, power);
\r
3488 if (name) return _("動物のカード", "Trump Animals");
\r
3489 if (desc) return _("1体の動物を召喚する。", "Summons an animal.");
\r
3494 int type = (!fail ? SUMMON_ANIMAL_RANGER : SUMMON_ANIMAL);
\r
3495 msg_print(_("あなたは動物のカードに集中する...", "You concentrate on the trump of an animal..."));
\r
3496 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, type, 0L))
\r
3500 msg_print(_("召喚された動物は怒っている!", "The summoned animal gets angry!"));
\r
3508 if (name) return _("移動のカード", "Trump Reach");
\r
3509 if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");
\r
3512 int weight = plev * 15;
\r
3514 if (info) return info_weight(weight);
\r
3518 if (!get_aim_dir(&dir)) return NULL;
\r
3520 fetch(dir, weight, FALSE);
\r
3526 if (name) return _("カミカゼのカード", "Trump Kamikaze");
\r
3527 if (desc) return _("複数の爆発するモンスターを召喚する。", "Summons monsters which explode by itself.");
\r
3537 if (!target_set(TARGET_KILL)) return NULL;
\r
3543 /* Summons near player when failed */
\r
3548 if (p_ptr->pclass == CLASS_BEASTMASTER)
\r
3549 type = SUMMON_KAMIKAZE_LIVING;
\r
3551 type = SUMMON_KAMIKAZE;
\r
3553 msg_print(_("あなたはカミカゼのカードに集中する...", "You concentrate on several trumps at once..."));
\r
3554 if (trump_summoning(2 + randint0(plev / 7), !fail, y, x, 0, type, 0L))
\r
3558 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
\r
3566 if (name) return _("幻霊召喚", "Phantasmal Servant");
\r
3567 if (desc) return _("1体の幽霊を召喚する。", "Summons a ghost.");
\r
3570 /* Phantasmal Servant is not summoned as enemy when failed */
\r
3573 int summon_lev = plev * 2 / 3 + randint1(plev / 2);
\r
3575 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, (summon_lev * 3 / 2), SUMMON_PHANTOM, 0L))
\r
3577 msg_print(_("御用でございますか、御主人様?", "'Your wish, master?'"));
\r
3584 if (name) return _("スピード・モンスター", "Haste Monster");
\r
3585 if (desc) return _("モンスター1体を加速させる。", "Hastes a monster.");
\r
3592 /* Temporary enable target_pet option */
\r
3593 bool old_target_pet = target_pet;
\r
3594 target_pet = TRUE;
\r
3596 result = get_aim_dir(&dir);
\r
3598 /* Restore target_pet option */
\r
3599 target_pet = old_target_pet;
\r
3601 if (!result) return NULL;
\r
3603 speed_monster(dir, plev);
\r
3609 if (name) return _("テレポート・レベル", "Teleport Level");
\r
3610 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");
\r
3615 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
\r
3616 teleport_level(0);
\r
3622 if (name) return _("次元の扉", "Dimension Door");
\r
3623 if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleport to given location.");
\r
3626 POSITION range = plev / 2 + 10;
\r
3628 if (info) return info_range(range);
\r
3632 msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));
\r
3633 if (!dimension_door()) return NULL;
\r
3639 if (name) return _("帰還の呪文", "Word of Recall");
\r
3640 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
\r
3641 "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
\r
3647 if (info) return info_delay(base, sides);
\r
3651 if (!word_of_recall()) return NULL;
\r
3657 if (name) return _("怪物追放", "Banish");
\r
3658 if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");
\r
3661 int power = plev * 4;
\r
3663 if (info) return info_power(power);
\r
3667 banish_monsters(power);
\r
3673 if (name) return _("位置交換のカード", "Swap Position");
\r
3674 if (desc) return _("1体のモンスターと位置を交換する。", "Swap positions of you and a monster.");
\r
3681 /* HACK -- No range limit */
\r
3682 project_length = -1;
\r
3684 result = get_aim_dir(&dir);
\r
3686 /* Restore range to default */
\r
3687 project_length = 0;
\r
3689 if (!result) return NULL;
\r
3691 teleport_swap(dir);
\r
3697 if (name) return _("アンデッドのカード", "Trump Undead");
\r
3698 if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");
\r
3703 msg_print(_("あなたはアンデッドのカードに集中する...", "You concentrate on the trump of an undead creature..."));
\r
3704 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_UNDEAD, 0L))
\r
3708 msg_print(_("召喚されたアンデッドは怒っている!", "The summoned undead creature gets angry!"));
\r
3716 if (name) return _("爬虫類のカード", "Trump Reptiles");
\r
3717 if (desc) return _("1体のヒドラを召喚する。", "Summons a hydra.");
\r
3722 msg_print(_("あなたは爬虫類のカードに集中する...", "You concentrate on the trump of a reptile..."));
\r
3723 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HYDRA, 0L))
\r
3727 msg_print(_("召喚された爬虫類は怒っている!", "The summoned reptile gets angry!"));
\r
3735 if (name) return _("モンスターのカード", "Trump Monsters");
\r
3736 if (desc) return _("複数のモンスターを召喚する。", "Summons some monsters.");
\r
3742 msg_print(_("あなたはモンスターのカードに集中する...", "You concentrate on several trumps at once..."));
\r
3743 if (p_ptr->pclass == CLASS_BEASTMASTER)
\r
3744 type = SUMMON_LIVING;
\r
3748 if (trump_summoning((1 + (plev - 15)/ 10), !fail, p_ptr->y, p_ptr->x, 0, type, 0L))
\r
3752 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
\r
3761 if (name) return _("ハウンドのカード", "Trump Hounds");
\r
3762 if (desc) return _("1グループのハウンドを召喚する。", "Summons a group of hounds.");
\r
3767 msg_print(_("あなたはハウンドのカードに集中する...", "You concentrate on the trump of a hound..."));
\r
3768 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HOUND, PM_ALLOW_GROUP))
\r
3772 msg_print(_("召喚されたハウンドは怒っている!", "The summoned hounds get angry!"));
\r
3780 if (name) return _("トランプの刃", "Trump Branding");
\r
3781 if (desc) return _("武器にトランプの属性をつける。", "Makes current weapon a Trump weapon.");
\r
3792 if (name) return _("人間トランプ", "Living Trump");
\r
3793 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",
\r
3794 "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");
\r
3802 /* Teleport control */
\r
3805 /* Random teleportation (uncontrolled) */
\r
3808 /* Gain the mutation */
\r
3809 if (gain_random_mutation(mutation))
\r
3811 msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));
\r
3818 if (name) return _("サイバーデーモンのカード", "Trump Cyberdemon");
\r
3819 if (desc) return _("1体のサイバーデーモンを召喚する。", "Summons a cyber demon.");
\r
3824 msg_print(_("あなたはサイバーデーモンのカードに集中する...", "You concentrate on the trump of a Cyberdemon..."));
\r
3825 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_CYBER, 0L))
\r
3829 msg_print(_("召喚されたサイバーデーモンは怒っている!", "The summoned Cyberdemon gets angry!"));
\r
3837 if (name) return _("予見のカード", "Trump Divination");
\r
3838 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
\r
3839 "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
\r
3842 int rad = DETECT_RAD_DEFAULT;
\r
3844 if (info) return info_radius(rad);
\r
3854 if (name) return _("知識のカード", "Trump Lore");
\r
3855 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
\r
3860 if (!identify_fully(FALSE)) return NULL;
\r
3866 if (name) return _("回復モンスター", "Heal Monster");
\r
3867 if (desc) return _("モンスター1体の体力を回復させる。", "Heal a monster.");
\r
3870 int heal = plev * 10 + 200;
\r
3872 if (info) return info_heal(0, 0, heal);
\r
3878 /* Temporary enable target_pet option */
\r
3879 bool old_target_pet = target_pet;
\r
3880 target_pet = TRUE;
\r
3882 result = get_aim_dir(&dir);
\r
3884 /* Restore target_pet option */
\r
3885 target_pet = old_target_pet;
\r
3887 if (!result) return NULL;
\r
3889 heal_monster(dir, heal);
\r
3895 if (name) return _("ドラゴンのカード", "Trump Dragon");
\r
3896 if (desc) return _("1体のドラゴンを召喚する。", "Summons a dragon.");
\r
3901 msg_print(_("あなたはドラゴンのカードに集中する...", "You concentrate on the trump of a dragon..."));
\r
3902 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_DRAGON, 0L))
\r
3906 msg_print(_("召喚されたドラゴンは怒っている!", "The summoned dragon gets angry!"));
\r
3914 if (name) return _("隕石のカード", "Trump Meteor");
\r
3915 if (desc) return _("自分の周辺に隕石を落とす。", "Makes meteor balls fall down to nearby random locations.");
\r
3918 HIT_POINT dam = plev * 2;
\r
3921 if (info) return info_multi_damage(dam);
\r
3925 cast_meteor(dam, rad);
\r
3931 if (name) return _("デーモンのカード", "Trump Demon");
\r
3932 if (desc) return _("1体の悪魔を召喚する。", "Summons a demon.");
\r
3937 msg_print(_("あなたはデーモンのカードに集中する...", "You concentrate on the trump of a demon..."));
\r
3938 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_DEMON, 0L))
\r
3942 msg_print(_("召喚されたデーモンは怒っている!", "The summoned demon gets angry!"));
\r
3950 if (name) return _("地獄のカード", "Trump Greater Undead");
\r
3951 if (desc) return _("1体の上級アンデッドを召喚する。", "Summons a greater undead.");
\r
3956 msg_print(_("あなたは強力なアンデッドのカードに集中する...", "You concentrate on the trump of a greater undead being..."));
\r
3957 /* May allow unique depend on level and dice roll */
\r
3958 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HI_UNDEAD, PM_ALLOW_UNIQUE))
\r
3962 msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead creature gets angry!"));
\r
3970 if (name) return _("古代ドラゴンのカード", "Trump Ancient Dragon");
\r
3971 if (desc) return _("1体の古代ドラゴンを召喚する。", "Summons an ancient dragon.");
\r
3978 if (p_ptr->pclass == CLASS_BEASTMASTER)
\r
3979 type = SUMMON_HI_DRAGON_LIVING;
\r
3981 type = SUMMON_HI_DRAGON;
\r
3983 msg_print(_("あなたは古代ドラゴンのカードに集中する...", "You concentrate on the trump of an ancient dragon..."));
\r
3984 /* May allow unique depend on level and dice roll */
\r
3985 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, type, PM_ALLOW_UNIQUE))
\r
3989 msg_print(_("召喚された古代ドラゴンは怒っている!", "The summoned ancient dragon gets angry!"));
\r
4002 * @brief 秘術領域魔法の各処理を行う
\r
4003 * @param spell 魔法ID
\r
4004 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
4005 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
4007 static cptr do_arcane_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
4009 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
4010 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
4011 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
4012 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
4015 int plev = p_ptr->lev;
\r
4020 if (name) return _("電撃", "Zap");
\r
4021 if (desc) return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");
\r
4024 int dice = 3 + (plev - 1) / 5;
\r
4027 if (info) return info_damage(dice, sides, 0);
\r
4031 if (!get_aim_dir(&dir)) return NULL;
\r
4033 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));
\r
4039 if (name) return _("魔法の施錠", "Wizard Lock");
\r
4040 if (desc) return _("扉に鍵をかける。", "Locks a door.");
\r
4045 if (!get_aim_dir(&dir)) return NULL;
\r
4053 if (name) return _("透明体感知", "Detect Invisibility");
\r
4054 if (desc) return _("近くの透明なモンスターを感知する。", "Detects all invisible monsters in your vicinity.");
\r
4057 int rad = DETECT_RAD_DEFAULT;
\r
4059 if (info) return info_radius(rad);
\r
4063 detect_monsters_invis(rad);
\r
4069 if (name) return _("モンスター感知", "Detect Monsters");
\r
4070 if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
\r
4073 int rad = DETECT_RAD_DEFAULT;
\r
4075 if (info) return info_radius(rad);
\r
4079 detect_monsters_normal(rad);
\r
4085 if (name) return _("ショート・テレポート", "Blink");
\r
4086 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");
\r
4089 POSITION range = 10;
\r
4091 if (info) return info_range(range);
\r
4095 teleport_player(range, 0L);
\r
4101 if (name) return _("ライト・エリア", "Light Area");
\r
4102 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
\r
4106 int sides = plev / 2;
\r
4107 int rad = plev / 10 + 1;
\r
4109 if (info) return info_damage(dice, sides, 0);
\r
4113 lite_area(damroll(dice, sides), rad);
\r
4119 if (name) return _("罠と扉 破壊", "Trap & Door Destruction");
\r
4120 if (desc) return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");
\r
4125 if (!get_aim_dir(&dir)) return NULL;
\r
4127 destroy_door(dir);
\r
4133 if (name) return _("軽傷の治癒", "Cure Light Wounds");
\r
4134 if (desc) return _("怪我と体力を少し回復させる。", "Heals cut and HP a little.");
\r
4140 if (info) return info_heal(dice, sides, 0);
\r
4144 hp_player(damroll(dice, sides));
\r
4145 set_cut(p_ptr->cut - 10);
\r
4151 if (name) return _("罠と扉 感知", "Detect Doors & Traps");
\r
4152 if (desc) return _("近くの全ての罠と扉と階段を感知する。", "Detects traps, doors, and stairs in your vicinity.");
\r
4155 int rad = DETECT_RAD_DEFAULT;
\r
4157 if (info) return info_radius(rad);
\r
4161 detect_traps(rad, TRUE);
\r
4162 detect_doors(rad);
\r
4163 detect_stairs(rad);
\r
4169 if (name) return _("燃素", "Phlogiston");
\r
4170 if (desc) return _("光源に燃料を補給する。", "Adds more turns of light to a lantern or torch.");
\r
4181 if (name) return _("財宝感知", "Detect Treasure");
\r
4182 if (desc) return _("近くの財宝を感知する。", "Detects all treasures in your vicinity.");
\r
4185 int rad = DETECT_RAD_DEFAULT;
\r
4187 if (info) return info_radius(rad);
\r
4191 detect_treasure(rad);
\r
4192 detect_objects_gold(rad);
\r
4198 if (name) return _("魔法 感知", "Detect Enchantment");
\r
4199 if (desc) return _("近くの魔法がかかったアイテムを感知する。", "Detects all magical items in your vicinity.");
\r
4202 int rad = DETECT_RAD_DEFAULT;
\r
4204 if (info) return info_radius(rad);
\r
4208 detect_objects_magic(rad);
\r
4214 if (name) return _("アイテム感知", "Detect Objects");
\r
4215 if (desc) return _("近くの全てのアイテムを感知する。", "Detects all items in your vicinity.");
\r
4218 int rad = DETECT_RAD_DEFAULT;
\r
4220 if (info) return info_radius(rad);
\r
4224 detect_objects_normal(rad);
\r
4230 if (name) return _("解毒", "Cure Poison");
\r
4231 if (desc) return _("毒を体内から完全に取り除く。", "Cures poison status.");
\r
4242 if (name) return _("耐冷", "Resist Cold");
\r
4243 if (desc) return _("一定時間、冷気への耐性を得る。装備による耐性に累積する。", "Gives resistance to cold. This resistance can be added to which from equipment for more powerful resistance.");
\r
4248 if (info) return info_duration(base, base);
\r
4252 set_oppose_cold(randint1(base) + base, FALSE);
\r
4258 if (name) return _("耐火", "Resist Fire");
\r
4259 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
\r
4260 "Gives resistance to fire. This resistance can be added to which from equipment for more powerful resistance.");
\r
4265 if (info) return info_duration(base, base);
\r
4269 set_oppose_fire(randint1(base) + base, FALSE);
\r
4275 if (name) return _("耐電", "Resist Lightning");
\r
4276 if (desc) return _("一定時間、電撃への耐性を得る。装備による耐性に累積する。",
\r
4277 "Gives resistance to electricity. This resistance can be added to which from equipment for more powerful resistance.");
\r
4282 if (info) return info_duration(base, base);
\r
4286 set_oppose_elec(randint1(base) + base, FALSE);
\r
4292 if (name) return _("耐酸", "Resist Acid");
\r
4293 if (desc) return _("一定時間、酸への耐性を得る。装備による耐性に累積する。",
\r
4294 "Gives resistance to acid. This resistance can be added to which from equipment for more powerful resistance.");
\r
4299 if (info) return info_duration(base, base);
\r
4303 set_oppose_acid(randint1(base) + base, FALSE);
\r
4309 if (name) return _("重傷の治癒", "Cure Medium Wounds");
\r
4310 if (desc) return _("怪我と体力を中程度回復させる。", "Heals cut and HP more.");
\r
4316 if (info) return info_heal(dice, sides, 0);
\r
4320 hp_player(damroll(dice, sides));
\r
4321 set_cut((p_ptr->cut / 2) - 50);
\r
4327 if (name) return _("テレポート", "Teleport");
\r
4328 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
\r
4331 POSITION range = plev * 5;
\r
4333 if (info) return info_range(range);
\r
4337 teleport_player(range, 0L);
\r
4343 if (name) return _("鑑定", "Identify");
\r
4344 if (desc) return _("アイテムを識別する。", "Identifies an item.");
\r
4349 if (!ident_spell(FALSE)) return NULL;
\r
4355 if (name) return _("岩石溶解", "Stone to Mud");
\r
4356 if (desc) return _("壁を溶かして床にする。", "Turns one rock square to mud.");
\r
4363 if (info) return info_damage(dice, sides, base);
\r
4367 if (!get_aim_dir(&dir)) return NULL;
\r
4369 wall_to_mud(dir, 20 + randint1(30));
\r
4375 if (name) return _("閃光", "Ray of Light");
\r
4376 if (desc) return _("光線を放つ。光りを嫌うモンスターに効果がある。", "Fires a beam of light which damages to light-sensitive monsters.");
\r
4382 if (info) return info_damage(dice, sides, 0);
\r
4386 if (!get_aim_dir(&dir)) return NULL;
\r
4388 msg_print(_("光線が放たれた。", "A line of light appears."));
\r
4389 lite_line(dir, damroll(6, 8));
\r
4395 if (name) return _("空腹充足", "Satisfy Hunger");
\r
4396 if (desc) return _("満腹にする。", "Satisfies hunger.");
\r
4401 set_food(PY_FOOD_MAX - 1);
\r
4407 if (name) return _("透明視認", "See Invisible");
\r
4408 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
\r
4413 if (info) return info_duration(base, base);
\r
4417 set_tim_invis(randint1(base) + base, FALSE);
\r
4423 if (name) return _("エレメンタル召喚", "Conjure Elemental");
\r
4424 if (desc) return _("1体のエレメンタルを召喚する。", "Summons an elemental.");
\r
4429 if (!summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_ELEMENTAL, (PM_ALLOW_GROUP | PM_FORCE_PET)))
\r
4431 msg_print(_("エレメンタルは現れなかった。", "No Elementals arrive."));
\r
4438 if (name) return _("テレポート・レベル", "Teleport Level");
\r
4439 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");
\r
4444 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
\r
4445 teleport_level(0);
\r
4451 if (name) return _("テレポート・モンスター", "Teleport Away");
\r
4452 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
\r
4457 if (info) return info_power(power);
\r
4461 if (!get_aim_dir(&dir)) return NULL;
\r
4463 fire_beam(GF_AWAY_ALL, dir, power);
\r
4469 if (name) return _("元素の球", "Elemental Ball");
\r
4470 if (desc) return _("炎、電撃、冷気、酸のどれかの球を放つ。", "Fires a ball of some elements.");
\r
4473 HIT_POINT dam = 75 + plev;
\r
4476 if (info) return info_damage(0, 0, dam);
\r
4482 if (!get_aim_dir(&dir)) return NULL;
\r
4484 switch (randint1(4))
\r
4486 case 1: type = GF_FIRE;break;
\r
4487 case 2: type = GF_ELEC;break;
\r
4488 case 3: type = GF_COLD;break;
\r
4489 default: type = GF_ACID;break;
\r
4492 fire_ball(type, dir, dam, rad);
\r
4498 if (name) return _("全感知", "Detection");
\r
4499 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
\r
4500 "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
\r
4503 int rad = DETECT_RAD_DEFAULT;
\r
4505 if (info) return info_radius(rad);
\r
4515 if (name) return _("帰還の呪文", "Word of Recall");
\r
4516 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
\r
4517 "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
\r
4523 if (info) return info_delay(base, sides);
\r
4527 if (!word_of_recall()) return NULL;
\r
4533 if (name) return _("千里眼", "Clairvoyance");
\r
4534 if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。さらに、一定時間テレパシー能力を得る。",
\r
4535 "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");
\r
4541 if (info) return info_duration(base, sides);
\r
4545 chg_virtue(V_KNOWLEDGE, 1);
\r
4546 chg_virtue(V_ENLIGHTEN, 1);
\r
4550 if (!p_ptr->telepathy)
\r
4552 set_tim_esp(randint1(sides) + base, FALSE);
\r
4563 * @brief 匠領域魔法の各処理を行う
\r
4564 * @param spell 魔法ID
\r
4565 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
4566 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
4568 static cptr do_craft_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
4570 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
4571 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
4572 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
4573 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
4575 int plev = p_ptr->lev;
\r
4580 if (name) return _("赤外線視力", "Infravision");
\r
4581 if (desc) return _("一定時間、赤外線視力が増強される。", "Gives infravision for a while.");
\r
4586 if (info) return info_duration(base, base);
\r
4590 set_tim_infra(base + randint1(base), FALSE);
\r
4596 if (name) return _("回復力強化", "Regeneration");
\r
4597 if (desc) return _("一定時間、回復力が増強される。", "Gives regeneration ability for a while.");
\r
4602 if (info) return info_duration(base, base);
\r
4606 set_tim_regen(base + randint1(base), FALSE);
\r
4612 if (name) return _("空腹充足", "Satisfy Hunger");
\r
4613 if (desc) return _("満腹になる。", "Satisfies hunger.");
\r
4618 set_food(PY_FOOD_MAX - 1);
\r
4624 if (name) return _("耐冷気", "Resist Cold");
\r
4625 if (desc) return _("一定時間、冷気への耐性を得る。装備による耐性に累積する。",
\r
4626 "Gives resistance to cold. This resistance can be added to which from equipment for more powerful resistance.");
\r
4631 if (info) return info_duration(base, base);
\r
4635 set_oppose_cold(randint1(base) + base, FALSE);
\r
4641 if (name) return _("耐火炎", "Resist Fire");
\r
4642 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
\r
4643 "Gives resistance to fire. This resistance can be added to which from equipment for more powerful resistance.");
\r
4648 if (info) return info_duration(base, base);
\r
4652 set_oppose_fire(randint1(base) + base, FALSE);
\r
4658 if (name) return _("士気高揚", "Heroism");
\r
4659 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
4664 if (info) return info_duration(base, base);
\r
4668 set_hero(randint1(base) + base, FALSE);
\r
4676 if (name) return _("耐電撃", "Resist Lightning");
\r
4677 if (desc) return _("一定時間、電撃への耐性を得る。装備による耐性に累積する。",
\r
4678 "Gives resistance to electricity. This resistance can be added to which from equipment for more powerful resistance.");
\r
4683 if (info) return info_duration(base, base);
\r
4687 set_oppose_elec(randint1(base) + base, FALSE);
\r
4693 if (name) return _("耐酸", "Resist Acid");
\r
4694 if (desc) return _("一定時間、酸への耐性を得る。装備による耐性に累積する。",
\r
4695 "Gives resistance to acid. This resistance can be added to which from equipment for more powerful resistance.");
\r
4700 if (info) return info_duration(base, base);
\r
4704 set_oppose_acid(randint1(base) + base, FALSE);
\r
4710 if (name) return _("透明視認", "See Invisibility");
\r
4711 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
\r
4716 if (info) return info_duration(base, base);
\r
4720 set_tim_invis(randint1(base) + base, FALSE);
\r
4726 if (name) return _("解呪", "Remove Curse");
\r
4727 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
\r
4732 if (remove_curse())
\r
4734 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
4741 if (name) return _("耐毒", "Resist Poison");
\r
4742 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",
\r
4743 "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");
\r
4748 if (info) return info_duration(base, base);
\r
4752 set_oppose_pois(randint1(base) + base, FALSE);
\r
4758 if (name) return _("狂戦士化", "Berserk");
\r
4759 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");
\r
4764 if (info) return info_duration(base, base);
\r
4768 set_shero(randint1(base) + base, FALSE);
\r
4776 if (name) return _("自己分析", "Self Knowledge");
\r
4777 if (desc) return _("現在の自分の状態を完全に知る。",
\r
4778 "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");
\r
4789 if (name) return _("対邪悪結界", "Protection from Evil");
\r
4790 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");
\r
4793 int base = 3 * plev;
\r
4796 if (info) return info_duration(base, sides);
\r
4800 set_protevil(randint1(sides) + base, FALSE);
\r
4806 if (name) return _("癒し", "Cure");
\r
4807 if (desc) return _("毒、朦朧状態、負傷を全快させ、幻覚を直す。", "Heals poison, stun, cut and hallucination completely.");
\r
4821 if (name) return _("魔法剣", "Mana Branding");
\r
4822 if (desc) return _("一定時間、武器に冷気、炎、電撃、酸、毒のいずれかの属性をつける。武器を持たないと使えない。",
\r
4823 "Makes current weapon some elemental branded. You must wield weapons.");
\r
4826 int base = plev / 2;
\r
4828 if (info) return info_duration(base, base);
\r
4832 if (!choose_ele_attack()) return NULL;
\r
4838 if (name) return _("テレパシー", "Telepathy");
\r
4839 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
\r
4845 if (info) return info_duration(base, sides);
\r
4849 set_tim_esp(randint1(sides) + base, FALSE);
\r
4855 if (name) return _("肌石化", "Stone Skin");
\r
4856 if (desc) return _("一定時間、ACを上昇させる。", "Gives bonus to AC for a while.");
\r
4862 if (info) return info_duration(base, sides);
\r
4866 set_shield(randint1(sides) + base, FALSE);
\r
4872 if (name) return _("全耐性", "Resistance");
\r
4873 if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
\r
4874 "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
4879 if (info) return info_duration(base, base);
\r
4883 set_oppose_acid(randint1(base) + base, FALSE);
\r
4884 set_oppose_elec(randint1(base) + base, FALSE);
\r
4885 set_oppose_fire(randint1(base) + base, FALSE);
\r
4886 set_oppose_cold(randint1(base) + base, FALSE);
\r
4887 set_oppose_pois(randint1(base) + base, FALSE);
\r
4893 if (name) return _("スピード", "Haste Self");
\r
4894 if (desc) return _("一定時間、加速する。", "Hastes you for a while.");
\r
4898 int sides = 20 + plev;
\r
4900 if (info) return info_duration(base, sides);
\r
4904 set_fast(randint1(sides) + base, FALSE);
\r
4910 if (name) return _("壁抜け", "Walk through Wall");
\r
4911 if (desc) return _("一定時間、半物質化し壁を通り抜けられるようになる。", "Gives ability to pass walls for a while.");
\r
4914 int base = plev / 2;
\r
4916 if (info) return info_duration(base, base);
\r
4920 set_kabenuke(randint1(base) + base, FALSE);
\r
4926 if (name) return _("盾磨き", "Polish Shield");
\r
4927 if (desc) return _("盾に反射の属性をつける。", "Makes a shield a shield of reflection.");
\r
4938 if (name) return _("ゴーレム製造", "Create Golem");
\r
4939 if (desc) return _("1体のゴーレムを製造する。", "Creates a golem.");
\r
4944 if (summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_GOLEM, PM_FORCE_PET))
\r
4946 msg_print(_("ゴーレムを作った。", "You make a golem."));
\r
4950 msg_print(_("うまくゴーレムを作れなかった。", "No Golems arrive."));
\r
4957 if (name) return _("魔法の鎧", "Magical armor");
\r
4958 if (desc) return _("一定時間、魔法防御力とACが上がり、混乱と盲目の耐性、反射能力、麻痺知らず、浮遊を得る。",
\r
4959 "Gives resistance to magic, bonus to AC, resistance to confusion, blindness, reflection, free action and levitation for a while.");
\r
4964 if (info) return info_duration(base, base);
\r
4968 set_magicdef(randint1(base) + base, FALSE);
\r
4974 if (name) return _("装備無力化", "Remove Enchantment");
\r
4975 if (desc) return _("武器・防具にかけられたあらゆる魔力を完全に解除する。", "Removes all magics completely from any weapon or armor.");
\r
4980 if (!mundane_spell(TRUE)) return NULL;
\r
4986 if (name) return _("呪い粉砕", "Remove All Curse");
\r
4987 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
\r
4992 if (remove_all_curse())
\r
4994 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
5001 if (name) return _("完全なる知識", "Knowledge True");
\r
5002 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
\r
5007 if (!identify_fully(FALSE)) return NULL;
\r
5013 if (name) return _("武器強化", "Enchant Weapon");
\r
5014 if (desc) return _("武器の命中率修正とダメージ修正を強化する。", "Attempts to increase +to-hit, +to-dam of a weapon.");
\r
5019 if (!enchant_spell(randint0(4) + 1, randint0(4) + 1, 0)) return NULL;
\r
5025 if (name) return _("防具強化", "Enchant Armor");
\r
5026 if (desc) return _("鎧の防御修正を強化する。", "Attempts to increase +AC of an armor.");
\r
5031 if (!enchant_spell(0, 0, randint0(3) + 2)) return NULL;
\r
5037 if (name) return _("武器属性付与", "Brand Weapon");
\r
5038 if (desc) return _("武器にランダムに属性をつける。", "Makes current weapon a random ego weapon.");
\r
5043 brand_weapon(randint0(18));
\r
5049 if (name) return _("人間トランプ", "Living Trump");
\r
5050 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",
\r
5051 "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");
\r
5059 /* Teleport control */
\r
5062 /* Random teleportation (uncontrolled) */
\r
5065 /* Gain the mutation */
\r
5066 if (gain_random_mutation(mutation))
\r
5068 msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));
\r
5075 if (name) return _("属性への免疫", "Immunity");
\r
5076 if (desc) return _("一定時間、冷気、炎、電撃、酸のいずれかに対する免疫を得る。",
\r
5077 "Gives an immunity to fire, cold, electricity or acid for a while.");
\r
5082 if (info) return info_duration(base, base);
\r
5086 if (!choose_ele_immune(base + randint1(base))) return NULL;
\r
5096 * @brief 悪魔領域魔法の各処理を行う
\r
5097 * @param spell 魔法ID
\r
5098 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
5099 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
5101 static cptr do_daemon_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
5103 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
5104 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
5105 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
5106 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
5107 static const char s_dam[] = _("損傷:", "dam ");
\r
5110 int plev = p_ptr->lev;
\r
5115 if (name) return _("マジック・ミサイル", "Magic Missile");
\r
5116 if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");
\r
5119 int dice = 3 + (plev - 1) / 5;
\r
5122 if (info) return info_damage(dice, sides, 0);
\r
5126 if (!get_aim_dir(&dir)) return NULL;
\r
5128 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));
\r
5134 if (name) return _("無生命感知", "Detect Unlife");
\r
5135 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
\r
5138 int rad = DETECT_RAD_DEFAULT;
\r
5140 if (info) return info_radius(rad);
\r
5144 detect_monsters_nonliving(rad);
\r
5150 if (name) return _("邪なる祝福", "Evil Bless");
\r
5151 if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
\r
5156 if (info) return info_duration(base, base);
\r
5160 set_blessed(randint1(base) + base, FALSE);
\r
5166 if (name) return _("耐火炎", "Resist Fire");
\r
5167 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
\r
5168 "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");
\r
5173 if (info) return info_duration(base, base);
\r
5177 set_oppose_fire(randint1(base) + base, FALSE);
\r
5183 if (name) return _("恐慌", "Horrify");
\r
5184 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
\r
5189 if (info) return info_power(power);
\r
5193 if (!get_aim_dir(&dir)) return NULL;
\r
5195 fear_monster(dir, power);
\r
5196 stun_monster(dir, power);
\r
5202 if (name) return _("地獄の矢", "Nether Bolt");
\r
5203 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
\r
5206 int dice = 6 + (plev - 5) / 4;
\r
5209 if (info) return info_damage(dice, sides, 0);
\r
5213 if (!get_aim_dir(&dir)) return NULL;
\r
5215 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
\r
5221 if (name) return _("古代の死霊召喚", "Summon Manes");
\r
5222 if (desc) return _("古代の死霊を召喚する。", "Summons a manes.");
\r
5227 if (!summon_specific(-1, p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET)))
\r
5229 msg_print(_("古代の死霊は現れなかった。", "No Manes arrive."));
\r
5236 if (name) return _("地獄の焔", "Hellish Flame");
\r
5237 if (desc) return _("邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",
\r
5238 "Fires a ball of evil power. Hurts good monsters greatly.");
\r
5243 int rad = (plev < 30) ? 2 : 3;
\r
5246 if (p_ptr->pclass == CLASS_MAGE ||
\r
5247 p_ptr->pclass == CLASS_HIGH_MAGE ||
\r
5248 p_ptr->pclass == CLASS_SORCERER)
\r
5249 base = plev + plev / 2;
\r
5251 base = plev + plev / 4;
\r
5254 if (info) return info_damage(dice, sides, base);
\r
5258 if (!get_aim_dir(&dir)) return NULL;
\r
5260 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides) + base, rad);
\r
5266 if (name) return _("デーモン支配", "Dominate Demon");
\r
5267 if (desc) return _("悪魔1体を魅了する。抵抗されると無効", "Attempts to charm a demon.");
\r
5272 if (info) return info_power(power);
\r
5276 if (!get_aim_dir(&dir)) return NULL;
\r
5278 control_one_demon(dir, power);
\r
5284 if (name) return _("ビジョン", "Vision");
\r
5285 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
\r
5288 int rad = DETECT_RAD_MAP;
\r
5290 if (info) return info_radius(rad);
\r
5300 if (name) return _("耐地獄", "Resist Nether");
\r
5301 if (desc) return _("一定時間、地獄への耐性を得る。", "Gives resistance to nether for a while.");
\r
5306 if (info) return info_duration(base, base);
\r
5310 set_tim_res_nether(randint1(base) + base, FALSE);
\r
5316 if (name) return _("プラズマ・ボルト", "Plasma bolt");
\r
5317 if (desc) return _("プラズマのボルトもしくはビームを放つ。", "Fires a bolt or beam of plasma.");
\r
5320 int dice = 11 + (plev - 5) / 4;
\r
5323 if (info) return info_damage(dice, sides, 0);
\r
5327 if (!get_aim_dir(&dir)) return NULL;
\r
5329 fire_bolt_or_beam(beam_chance(), GF_PLASMA, dir, damroll(dice, sides));
\r
5335 if (name) return _("ファイア・ボール", "Fire Ball");
\r
5336 if (desc) return _("炎の球を放つ。", "Fires a ball of fire.");
\r
5339 HIT_POINT dam = plev + 55;
\r
5342 if (info) return info_damage(0, 0, dam);
\r
5346 if (!get_aim_dir(&dir)) return NULL;
\r
5348 fire_ball(GF_FIRE, dir, dam, rad);
\r
5354 if (name) return _("炎の刃", "Fire Branding");
\r
5355 if (desc) return _("武器に炎の属性をつける。", "Makes current weapon fire branded.");
\r
5366 if (name) return _("地獄球", "Nether Ball");
\r
5367 if (desc) return _("大きな地獄の球を放つ。", "Fires a huge ball of nether.");
\r
5370 HIT_POINT dam = plev * 3 / 2 + 100;
\r
5371 int rad = plev / 20 + 2;
\r
5373 if (info) return info_damage(0, 0, dam);
\r
5377 if (!get_aim_dir(&dir)) return NULL;
\r
5379 fire_ball(GF_NETHER, dir, dam, rad);
\r
5385 if (name) return _("デーモン召喚", "Summon Demon");
\r
5386 if (desc) return _("悪魔1体を召喚する。", "Summons a demon.");
\r
5391 bool pet = !one_in_(3);
\r
5394 if (pet) flg |= PM_FORCE_PET;
\r
5395 else flg |= PM_NO_PET;
\r
5396 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
\r
5398 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, plev*2/3+randint1(plev/2), SUMMON_DEMON, flg))
\r
5400 msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));
\r
5404 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
\r
5408 msg_print(_("「卑しき者よ、我は汝の下僕にあらず! お前の魂を頂くぞ!」",
\r
5409 "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));
\r
5414 msg_print(_("悪魔は現れなかった。", "No demons arrive."));
\r
5422 if (name) return _("悪魔の目", "Devilish Eye");
\r
5423 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
\r
5429 if (info) return info_duration(base, sides);
\r
5433 set_tim_esp(randint1(sides) + base, FALSE);
\r
5439 if (name) return _("悪魔のクローク", "Devil Cloak");
\r
5440 if (desc) return _("恐怖を取り除き、一定時間、炎と冷気の耐性、炎のオーラを得る。耐性は装備による耐性に累積する。",
\r
5441 "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
5444 TIME_EFFECT base = 20;
\r
5446 if (info) return info_duration(base, base);
\r
5450 TIME_EFFECT dur = randint1(base) + base;
\r
5452 set_oppose_fire(dur, FALSE);
\r
5453 set_oppose_cold(dur, FALSE);
\r
5454 set_tim_sh_fire(dur, FALSE);
\r
5462 if (name) return _("溶岩流", "The Flow of Lava");
\r
5463 if (desc) return _("自分を中心とした炎の球を作り出し、床を溶岩に変える。",
\r
5464 "Generates a ball of fire centered on you which transforms floors to magma.");
\r
5467 HIT_POINT dam = (55 + plev) * 2;
\r
5470 if (info) return info_damage(0, 0, dam/2);
\r
5474 fire_ball(GF_FIRE, 0, dam, rad);
\r
5475 fire_ball_hide(GF_LAVA_FLOW, 0, 2 + randint1(2), rad);
\r
5481 if (name) return _("プラズマ球", "Plasma Ball");
\r
5482 if (desc) return _("プラズマの球を放つ。", "Fires a ball of plasma.");
\r
5485 HIT_POINT dam = plev * 3 / 2 + 80;
\r
5486 int rad = 2 + plev / 40;
\r
5488 if (info) return info_damage(0, 0, dam);
\r
5492 if (!get_aim_dir(&dir)) return NULL;
\r
5494 fire_ball(GF_PLASMA, dir, dam, rad);
\r
5500 if (name) return _("悪魔変化", "Polymorph Demon");
\r
5501 if (desc) return _("一定時間、悪魔に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔としての能力を得る。",
\r
5502 "Mimic a demon for a while. Loses abilities of original race and gets abilities as a demon.");
\r
5505 int base = 10 + plev / 2;
\r
5507 if (info) return info_duration(base, base);
\r
5511 set_mimic(base + randint1(base), MIMIC_DEMON, FALSE);
\r
5517 if (name) return _("地獄の波動", "Nather Wave");
\r
5518 if (desc) return _("視界内の全てのモンスターにダメージを与える。善良なモンスターに特に大きなダメージを与える。",
\r
5519 "Damages all monsters in sight. Hurts good monsters greatly.");
\r
5522 int sides1 = plev * 2;
\r
5523 int sides2 = plev * 2;
\r
5525 if (info) return format("%sd%d+d%d", s_dam, sides1, sides2);
\r
5529 dispel_monsters(randint1(sides1));
\r
5530 dispel_good(randint1(sides2));
\r
5536 if (name) return _("サキュバスの接吻", "Kiss of Succubus");
\r
5537 if (desc) return _("因果混乱の球を放つ。", "Fires a ball of nexus.");
\r
5540 HIT_POINT dam = 100 + plev * 2;
\r
5543 if (info) return info_damage(0, 0, dam);
\r
5547 if (!get_aim_dir(&dir)) return NULL;
\r
5548 fire_ball(GF_NEXUS, dir, dam, rad);
\r
5554 if (name) return _("破滅の手", "Doom Hand");
\r
5555 if (desc) return _("破滅の手を放つ。食らったモンスターはそのときのHPの半分前後のダメージを受ける。", "Attempts to make a monster's HP almost half.");
\r
5560 if (!get_aim_dir(&dir))
\r
5563 msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));
\r
5565 fire_ball_hide(GF_HAND_DOOM, dir, plev * 2, 0);
\r
5571 if (name) return _("士気高揚", "Raise the Morale");
\r
5572 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
5577 if (info) return info_duration(base, base);
\r
5581 set_hero(randint1(base) + base, FALSE);
\r
5589 if (name) return _("不滅の肉体", "Immortal Body");
\r
5590 if (desc) return _("一定時間、時間逆転への耐性を得る。", "Gives resistance to time for a while.");
\r
5595 if (info) return info_duration(base, base);
\r
5599 set_tim_res_time(randint1(base)+base, FALSE);
\r
5605 if (name) return _("狂気の円環", "Insanity Circle");
\r
5606 if (desc) return _("自分を中心としたカオスの球、混乱の球を発生させ、近くのモンスターを魅了する。",
\r
5607 "Generate balls of chaos, confusion and charm centered on you.");
\r
5610 HIT_POINT dam = 50 + plev;
\r
5611 int power = 20 + plev;
\r
5612 int rad = 3 + plev / 20;
\r
5614 if (info) return format("%s%d+%d", s_dam, dam/2, dam/2);
\r
5618 fire_ball(GF_CHAOS, 0, dam, rad);
\r
5619 fire_ball(GF_CONFUSION, 0, dam, rad);
\r
5620 fire_ball(GF_CHARM, 0, power, rad);
\r
5626 if (name) return _("ペット爆破", "Explode Pets");
\r
5627 if (desc) return _("全てのペットを強制的に爆破させる。", "Makes all pets explode.");
\r
5632 discharge_minion();
\r
5638 if (name) return _("グレーターデーモン召喚", "Summon Greater Demon");
\r
5639 if (desc) return _("上級デーモンを召喚する。召喚するには人間('p','h','t'で表されるモンスター)の死体を捧げなければならない。",
\r
5640 "Summons greater demon. It need to sacrifice a corpse of human ('p','h' or 't').");
\r
5645 if (!cast_summon_greater_demon()) return NULL;
\r
5651 if (name) return _("地獄嵐", "Nether Storm");
\r
5652 if (desc) return _("超巨大な地獄の球を放つ。", "Generate a huge ball of nether.");
\r
5655 HIT_POINT dam = plev * 15;
\r
5656 int rad = plev / 5;
\r
5658 if (info) return info_damage(0, 0, dam);
\r
5662 if (!get_aim_dir(&dir)) return NULL;
\r
5664 fire_ball(GF_NETHER, dir, dam, rad);
\r
5670 if (name) return _("血の呪い", "Bloody Curse");
\r
5671 if (desc) return _("自分がダメージを受けることによって対象に呪いをかけ、ダメージを与え様々な効果を引き起こす。",
\r
5672 "Puts blood curse which damages and causes various effects on a monster. You also take damage.");
\r
5675 HIT_POINT dam = 600;
\r
5678 if (info) return info_damage(0, 0, dam);
\r
5682 if (!get_aim_dir(&dir)) return NULL;
\r
5684 fire_ball_hide(GF_BLOOD_CURSE, dir, dam, rad);
\r
5685 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("血の呪い", "Blood curse"), -1);
\r
5691 if (name) return _("魔王変化", "Polymorph Demonlord");
\r
5692 if (desc) return _("悪魔の王に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔の王としての能力を得、壁を破壊しながら歩く。",
\r
5693 "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
5698 if (info) return info_duration(base, base);
\r
5702 set_mimic(base + randint1(base), MIMIC_DEMON_LORD, FALSE);
\r
5712 * @brief 破邪領域魔法の各処理を行う
\r
5713 * @param spell 魔法ID
\r
5714 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
5715 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
5717 static cptr do_crusade_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
5719 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
5720 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
5721 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
5722 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
5725 int plev = p_ptr->lev;
\r
5730 if (name) return _("懲罰", "Punishment");
\r
5731 if (desc) return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");
\r
5734 int dice = 3 + (plev - 1) / 5;
\r
5737 if (info) return info_damage(dice, sides, 0);
\r
5741 if (!get_aim_dir(&dir)) return NULL;
\r
5743 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));
\r
5749 if (name) return _("邪悪存在感知", "Detect Evil");
\r
5750 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
\r
5753 int rad = DETECT_RAD_DEFAULT;
\r
5755 if (info) return info_radius(rad);
\r
5759 detect_monsters_evil(rad);
\r
5765 if (name) return _("恐怖除去", "Remove Fear");
\r
5766 if (desc) return _("恐怖を取り除く。", "Removes fear.");
\r
5777 if (name) return _("威圧", "Scare Monster");
\r
5778 if (desc) return _("モンスター1体を恐怖させる。抵抗されると無効。", "Attempts to scare a monster.");
\r
5783 if (info) return info_power(power);
\r
5787 if (!get_aim_dir(&dir)) return NULL;
\r
5789 fear_monster(dir, power);
\r
5795 if (name) return _("聖域", "Sanctuary");
\r
5796 if (desc) return _("隣接した全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep monsters in the adjacent squares.");
\r
5801 if (info) return info_power(power);
\r
5805 sleep_monsters_touch();
\r
5811 if (name) return _("入口", "Portal");
\r
5812 if (desc) return _("中距離のテレポートをする。", "Teleport medium distance.");
\r
5815 POSITION range = 25 + plev / 2;
\r
5817 if (info) return info_range(range);
\r
5821 teleport_player(range, 0L);
\r
5827 if (name) return _("スターダスト", "Star Dust");
\r
5828 if (desc) return _("ターゲット付近に閃光のボルトを連射する。", "Fires many bolts of light near the target.");
\r
5831 int dice = 3 + (plev - 1) / 9;
\r
5834 if (info) return info_multi_damage_dice(dice, sides);
\r
5838 if (!get_aim_dir(&dir)) return NULL;
\r
5839 fire_blast(GF_LITE, dir, dice, sides, 10, 3);
\r
5845 if (name) return _("身体浄化", "Purify");
\r
5846 if (desc) return _("傷、毒、朦朧から全快する。", "Heals all cut, stun and poison status.");
\r
5859 if (name) return _("邪悪飛ばし", "Scatter Evil");
\r
5860 if (desc) return _("邪悪なモンスター1体をテレポートさせる。抵抗されると無効。", "Attempts to teleport an evil monster away.");
\r
5863 int power = MAX_SIGHT * 5;
\r
5865 if (info) return info_power(power);
\r
5869 if (!get_aim_dir(&dir)) return NULL;
\r
5870 fire_ball(GF_AWAY_EVIL, dir, power, 0);
\r
5876 if (name) return _("聖なる光球", "Holy Orb");
\r
5877 if (desc) return _("聖なる力をもつ宝珠を放つ。邪悪なモンスターに対して大きなダメージを与えるが、善良なモンスターには効果がない。",
\r
5878 "Fires a ball with holy power. Hurts evil monsters greatly, but don't effect good monsters.");
\r
5883 int rad = (plev < 30) ? 2 : 3;
\r
5886 if (p_ptr->pclass == CLASS_PRIEST ||
\r
5887 p_ptr->pclass == CLASS_HIGH_MAGE ||
\r
5888 p_ptr->pclass == CLASS_SORCERER)
\r
5889 base = plev + plev / 2;
\r
5891 base = plev + plev / 4;
\r
5894 if (info) return info_damage(dice, sides, base);
\r
5898 if (!get_aim_dir(&dir)) return NULL;
\r
5900 fire_ball(GF_HOLY_FIRE, dir, damroll(dice, sides) + base, rad);
\r
5906 if (name) return _("悪魔払い", "Exorcism");
\r
5907 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与え、邪悪なモンスターを恐怖させる。",
\r
5908 "Damages all undead and demons in sight, and scares all evil monsters in sight.");
\r
5914 if (info) return info_damage(1, sides, 0);
\r
5918 dispel_undead(randint1(sides));
\r
5919 dispel_demons(randint1(sides));
\r
5926 if (name) return _("解呪", "Remove Curse");
\r
5927 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
\r
5932 if (remove_curse())
\r
5934 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
5941 if (name) return _("透明視認", "Sense Unseen");
\r
5942 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
\r
5947 if (info) return info_duration(base, base);
\r
5951 set_tim_invis(randint1(base) + base, FALSE);
\r
5957 if (name) return _("対邪悪結界", "Protection from Evil");
\r
5958 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");
\r
5962 int sides = 3 * plev;
\r
5964 if (info) return info_duration(base, sides);
\r
5968 set_protevil(randint1(sides) + base, FALSE);
\r
5974 if (name) return _("裁きの雷", "Judgment Thunder");
\r
5975 if (desc) return _("強力な電撃のボルトを放つ。", "Fires a powerful bolt of lightning.");
\r
5978 HIT_POINT dam = plev * 5;
\r
5980 if (info) return info_damage(0, 0, dam);
\r
5984 if (!get_aim_dir(&dir)) return NULL;
\r
5985 fire_bolt(GF_ELEC, dir, dam);
\r
5991 if (name) return _("聖なる御言葉", "Holy Word");
\r
5992 if (desc) return _("視界内の邪悪な存在に大きなダメージを与え、体力を回復し、毒、恐怖、朦朧状態、負傷から全快する。",
\r
5993 "Damages all evil monsters in sight, heals HP somewhat, and completely heals poison, fear, stun and cut status.");
\r
5996 int dam_sides = plev * 6;
\r
5999 if (info) return format(_("損:1d%d/回%d", "dam:d%d/h%d"), dam_sides, heal);
\r
6002 dispel_evil(randint1(dam_sides));
\r
6013 if (name) return _("開かれた道", "Unbarring Ways");
\r
6014 if (desc) return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");
\r
6019 if (!get_aim_dir(&dir)) return NULL;
\r
6021 destroy_door(dir);
\r
6027 if (name) return _("封魔", "Arrest");
\r
6028 if (desc) return _("邪悪なモンスターの動きを止める。", "Attempts to paralyze an evil monster.");
\r
6031 int power = plev * 2;
\r
6033 if (info) return info_power(power);
\r
6037 if (!get_aim_dir(&dir)) return NULL;
\r
6044 if (name) return _("聖なるオーラ", "Holy Aura");
\r
6045 if (desc) return _("一定時間、邪悪なモンスターを傷つける聖なるオーラを得る。",
\r
6046 "Gives aura of holy power which injures evil monsters which attacked you for a while.");
\r
6051 if (info) return info_duration(base, base);
\r
6055 set_tim_sh_holy(randint1(base) + base, FALSE);
\r
6061 if (name) return _("アンデッド&悪魔退散", "Dispel Undead & Demons");
\r
6062 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与える。", "Damages all undead and demons in sight.");
\r
6065 int sides = plev * 4;
\r
6067 if (info) return info_damage(1, sides, 0);
\r
6071 dispel_undead(randint1(sides));
\r
6072 dispel_demons(randint1(sides));
\r
6078 if (name) return _("邪悪退散", "Dispel Evil");
\r
6079 if (desc) return _("視界内の全ての邪悪なモンスターにダメージを与える。", "Damages all evil monsters in sight.");
\r
6082 int sides = plev * 4;
\r
6084 if (info) return info_damage(1, sides, 0);
\r
6088 dispel_evil(randint1(sides));
\r
6094 if (name) return _("聖なる刃", "Holy Blade");
\r
6095 if (desc) return _("通常の武器に滅邪の属性をつける。", "Makes current weapon especially deadly against evil monsters.");
\r
6106 if (name) return _("スターバースト", "Star Burst");
\r
6107 if (desc) return _("巨大な閃光の球を放つ。", "Fires a huge ball of powerful light.");
\r
6110 HIT_POINT dam = 100 + plev * 2;
\r
6113 if (info) return info_damage(0, 0, dam);
\r
6117 if (!get_aim_dir(&dir)) return NULL;
\r
6119 fire_ball(GF_LITE, dir, dam, rad);
\r
6125 if (name) return _("天使召喚", "Summon Angel");
\r
6126 if (desc) return _("天使を1体召喚する。", "Summons an angel.");
\r
6131 bool pet = !one_in_(3);
\r
6134 if (pet) flg |= PM_FORCE_PET;
\r
6135 else flg |= PM_NO_PET;
\r
6136 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
\r
6138 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_ANGEL, flg))
\r
6142 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
\r
6146 msg_print(_("「我は汝の下僕にあらず! 悪行者よ、悔い改めよ!」", "Mortal! Repent of thy impiousness."));
\r
6154 if (name) return _("士気高揚", "Heroism");
\r
6155 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
6160 if (info) return info_duration(base, base);
\r
6164 set_hero(randint1(base) + base, FALSE);
\r
6172 if (name) return _("呪い退散", "Dispel Curse");
\r
6173 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
\r
6178 if (remove_all_curse())
\r
6180 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
6187 if (name) return _("邪悪追放", "Banish Evil");
\r
6188 if (desc) return _("視界内の全ての邪悪なモンスターをテレポートさせる。抵抗されると無効。",
\r
6189 "Teleports all evil monsters in sight away unless resisted.");
\r
6194 if (info) return info_power(power);
\r
6198 if (banish_evil(power))
\r
6200 msg_print(_("神聖な力が邪悪を打ち払った!", "The holy power banishes evil!"));
\r
6207 if (name) return _("ハルマゲドン", "Armageddon");
\r
6208 if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroy everything in nearby area.");
\r
6216 destroy_area(p_ptr->y, p_ptr->x, base + randint1(sides), FALSE);
\r
6222 if (name) return _("目には目を", "An Eye for an Eye");
\r
6223 if (desc) return _("一定時間、自分がダメージを受けたときに攻撃を行ったモンスターに対して同等のダメージを与える。",
\r
6224 "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
6229 if (info) return info_duration(base, base);
\r
6233 set_tim_eyeeye(randint1(base) + base, FALSE);
\r
6239 if (name) return _("神の怒り", "Wrath of the God");
\r
6240 if (desc) return _("ターゲットの周囲に分解の球を多数落とす。", "Drops many balls of disintegration near the target.");
\r
6243 HIT_POINT dam = plev * 3 + 25;
\r
6246 if (info) return info_multi_damage(dam);
\r
6250 if (!cast_wrath_of_the_god(dam, rad)) return NULL;
\r
6256 if (name) return _("神威", "Divine Intervention");
\r
6257 if (desc) return _("隣接するモンスターに聖なるダメージを与え、視界内のモンスターにダメージ、減速、朦朧、混乱、恐怖、眠りを与える。さらに体力を回復する。",
\r
6258 "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
6261 int b_dam = plev * 11;
\r
6262 int d_dam = plev * 4;
\r
6264 int power = plev * 4;
\r
6266 if (info) return format(_("回%d/損%d+%d", "h%d/dm%d+%d"), heal, d_dam, b_dam/2);
\r
6269 project(0, 1, p_ptr->y, p_ptr->x, b_dam, GF_HOLY_FIRE, PROJECT_KILL, -1);
\r
6270 dispel_monsters(d_dam);
\r
6271 slow_monsters(plev);
\r
6272 stun_monsters(power);
\r
6273 confuse_monsters(power);
\r
6274 turn_monsters(power);
\r
6275 stasis_monsters(power);
\r
6282 if (name) return _("聖戦", "Crusade");
\r
6283 if (desc) return _("視界内の善良なモンスターをペットにしようとし、ならなかった場合及び善良でないモンスターを恐怖させる。さらに多数の加速された騎士を召喚し、ヒーロー、祝福、加速、対邪悪結界を得る。",
\r
6284 "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
6290 int sp_sides = 20 + plev;
\r
6291 int sp_base = plev;
\r
6295 for (i = 0; i < 12; i++)
\r
6298 POSITION my = 0, mx = 0;
\r
6302 scatter(&my, &mx, p_ptr->y, p_ptr->x, 4, 0);
\r
6304 /* Require empty grids */
\r
6305 if (cave_empty_bold2(my, mx)) break;
\r
6307 if (attempt < 0) continue;
\r
6308 summon_specific(-1, my, mx, plev, SUMMON_KNIGHTS, (PM_ALLOW_GROUP | PM_FORCE_PET | PM_HASTE));
\r
6310 set_hero(randint1(base) + base, FALSE);
\r
6311 set_blessed(randint1(base) + base, FALSE);
\r
6312 set_fast(randint1(sp_sides) + sp_base, FALSE);
\r
6313 set_protevil(randint1(base) + base, FALSE);
\r
6326 * @param spell 歌ID
\r
6327 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP)
\r
6328 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
\r
6330 static cptr do_music_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
6332 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
6333 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
6334 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
6335 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
6336 bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
\r
6337 bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
\r
6338 bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
\r
6339 static const char s_dam[] = _("損傷:", "dam ");
\r
6342 int plev = p_ptr->lev;
\r
6347 if (name) return _("遅鈍の歌", "Song of Holding");
\r
6348 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
\r
6350 /* Stop singing before start another */
\r
6351 if (cast || fail) stop_singing();
\r
6355 msg_print(_("ゆっくりとしたメロディを口ずさみ始めた...", "You start humming a slow, steady melody..."));
\r
6356 start_singing(spell, MUSIC_SLOW);
\r
6362 if (info) return info_power(power);
\r
6366 slow_monsters(plev);
\r
6372 if (name) return _("祝福の歌", "Song of Blessing");
\r
6373 if (desc) return _("命中率とACのボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
\r
6375 /* Stop singing before start another */
\r
6376 if (cast || fail) stop_singing();
\r
6380 msg_print(_("厳かなメロディを奏で始めた...", "The holy power of the Music of the Ainur enters you..."));
\r
6381 start_singing(spell, MUSIC_BLESS);
\r
6386 if (!p_ptr->blessed)
\r
6388 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
\r
6395 if (name) return _("崩壊の音色", "Wrecking Note");
\r
6396 if (desc) return _("轟音のボルトを放つ。", "Fires a bolt of sound.");
\r
6398 /* Stop singing before start another */
\r
6399 if (cast || fail) stop_singing();
\r
6402 int dice = 4 + (plev - 1) / 5;
\r
6405 if (info) return info_damage(dice, sides, 0);
\r
6409 if (!get_aim_dir(&dir)) return NULL;
\r
6411 fire_bolt(GF_SOUND, dir, damroll(dice, sides));
\r
6417 if (name) return _("朦朧の旋律", "Stun Pattern");
\r
6418 if (desc) return _("視界内の全てのモンスターを朦朧させる。抵抗されると無効。", "Attempts to stun all monsters in sight.");
\r
6420 /* Stop singing before start another */
\r
6421 if (cast || fail) stop_singing();
\r
6425 msg_print(_("眩惑させるメロディを奏で始めた...", "You weave a pattern of sounds to bewilder and daze..."));
\r
6426 start_singing(spell, MUSIC_STUN);
\r
6430 int dice = plev / 10;
\r
6433 if (info) return info_power_dice(dice, sides);
\r
6437 stun_monsters(damroll(dice, sides));
\r
6444 if (name) return _("生命の流れ", "Flow of Life");
\r
6445 if (desc) return _("体力を少し回復させる。", "Heals HP a little.");
\r
6447 /* Stop singing before start another */
\r
6448 if (cast || fail) stop_singing();
\r
6452 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing a song of healing..."));
\r
6453 start_singing(spell, MUSIC_L_LIFE);
\r
6460 if (info) return info_heal(dice, sides, 0);
\r
6464 hp_player(damroll(dice, sides));
\r
6471 if (name) return _("太陽の歌", "Song of the Sun");
\r
6472 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
\r
6474 /* Stop singing before start another */
\r
6475 if (cast || fail) stop_singing();
\r
6479 int sides = plev / 2;
\r
6480 int rad = plev / 10 + 1;
\r
6482 if (info) return info_damage(dice, sides, 0);
\r
6486 msg_print(_("光り輝く歌が辺りを照らした。", "Your uplifting song brings brightness to dark places..."));
\r
6487 lite_area(damroll(dice, sides), rad);
\r
6493 if (name) return _("恐怖の歌", "Song of Fear");
\r
6494 if (desc) return _("視界内の全てのモンスターを恐怖させる。抵抗されると無効。", "Attempts to scare all monsters in sight.");
\r
6496 /* Stop singing before start another */
\r
6497 if (cast || fail) stop_singing();
\r
6501 msg_print(_("おどろおどろしいメロディを奏で始めた...", "You start weaving a fearful pattern..."));
\r
6502 start_singing(spell, MUSIC_FEAR);
\r
6508 if (info) return info_power(power);
\r
6512 project_hack(GF_TURN_ALL, power);
\r
6519 if (name) return _("戦いの歌", "Heroic Ballad");
\r
6520 if (desc) return _("ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
6522 /* Stop singing before start another */
\r
6523 if (cast || fail) stop_singing();
\r
6527 msg_print(_("激しい戦いの歌を歌った...", "You start singing a song of intense fighting..."));
\r
6529 (void)hp_player(10);
\r
6530 (void)set_afraid(0);
\r
6532 /* Recalculate hitpoints */
\r
6533 p_ptr->update |= (PU_HP);
\r
6535 start_singing(spell, MUSIC_HERO);
\r
6542 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
\r
6543 /* Recalculate hitpoints */
\r
6544 p_ptr->update |= (PU_HP);
\r
6551 if (name) return _("霊的知覚", "Clairaudience");
\r
6552 if (desc) return _("近くの罠/扉/階段を感知する。レベル15で全てのモンスター、20で財宝とアイテムを感知できるようになる。レベル25で周辺の地形を感知し、40でその階全体を永久に照らし、ダンジョン内のすべてのアイテムを感知する。この効果は歌い続けることで順に起こる。",
\r
6553 "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
6555 /* Stop singing before start another */
\r
6556 if (cast || fail) stop_singing();
\r
6560 msg_print(_("静かな音楽が感覚を研ぎ澄まさせた...", "Your quiet music sharpens your sense of hearing..."));
\r
6561 /* Hack -- Initialize the turn count */
\r
6562 SINGING_COUNT(p_ptr) = 0;
\r
6563 start_singing(spell, MUSIC_DETECT);
\r
6567 int rad = DETECT_RAD_DEFAULT;
\r
6569 if (info) return info_radius(rad);
\r
6573 int count = SINGING_COUNT(p_ptr);
\r
6575 if (count >= 19) wiz_lite(FALSE);
\r
6579 if (plev > 39 && count < 19)
\r
6580 SINGING_COUNT(p_ptr) = count + 1;
\r
6584 /* There are too many hidden treasure. So... */
\r
6585 /* detect_treasure(rad); */
\r
6586 detect_objects_gold(rad);
\r
6587 detect_objects_normal(rad);
\r
6589 if (plev > 24 && count < 11)
\r
6590 SINGING_COUNT(p_ptr) = count + 1;
\r
6594 detect_monsters_invis(rad);
\r
6595 detect_monsters_normal(rad);
\r
6597 if (plev > 19 && count < 6)
\r
6598 SINGING_COUNT(p_ptr) = count + 1;
\r
6600 detect_traps(rad, TRUE);
\r
6601 detect_doors(rad);
\r
6602 detect_stairs(rad);
\r
6604 if (plev > 14 && count < 3)
\r
6605 SINGING_COUNT(p_ptr) = count + 1;
\r
6612 if (name) return _("魂の歌", "Soul Shriek");
\r
6613 if (desc) return _("視界内の全てのモンスターに対して精神攻撃を行う。", "Damages all monsters in sight with PSI damages.");
\r
6615 /* Stop singing before start another */
\r
6616 if (cast || fail) stop_singing();
\r
6620 msg_print(_("精神を捻じ曲げる歌を歌った...", "You start singing a song of soul in pain..."));
\r
6621 start_singing(spell, MUSIC_PSI);
\r
6626 int sides = plev * 3 / 2;
\r
6628 if (info) return info_damage(dice, sides, 0);
\r
6632 project_hack(GF_PSI, damroll(dice, sides));
\r
6639 if (name) return _("知識の歌", "Song of Lore");
\r
6640 if (desc) return _("自分のいるマスと隣りのマスに落ちているアイテムを鑑定する。", "Identifies all items which are in the adjacent squares.");
\r
6642 /* Stop singing before start another */
\r
6643 if (cast || fail) stop_singing();
\r
6647 msg_print(_("この世界の知識が流れ込んできた...", "You recall the rich lore of the world..."));
\r
6648 start_singing(spell, MUSIC_ID);
\r
6654 if (info) return info_radius(rad);
\r
6658 * MP不足で鑑定が発動される前に歌が中断してしまうのを防止。
\r
6662 project(0, rad, p_ptr->y, p_ptr->x, 0, GF_IDENTIFY, PROJECT_ITEM, -1);
\r
6669 if (name) return _("隠遁の歌", "Hiding Tune");
\r
6670 if (desc) return _("隠密行動能力を上昇させる。", "Gives improved stealth.");
\r
6672 /* Stop singing before start another */
\r
6673 if (cast || fail) stop_singing();
\r
6677 msg_print(_("あなたの姿が景色にとけこんでいった...", "Your song carries you beyond the sight of mortal eyes..."));
\r
6678 start_singing(spell, MUSIC_STEALTH);
\r
6683 if (!p_ptr->tim_stealth)
\r
6685 msg_print(_("姿がはっきりと見えるようになった。", "You are no longer hided."));
\r
6692 if (name) return _("幻影の旋律", "Illusion Pattern");
\r
6693 if (desc) return _("視界内の全てのモンスターを混乱させる。抵抗されると無効。", "Attempts to confuse all monsters in sight.");
\r
6695 /* Stop singing before start another */
\r
6696 if (cast || fail) stop_singing();
\r
6700 msg_print(_("辺り一面に幻影が現れた...", "You weave a pattern of sounds to beguile and confuse..."));
\r
6701 start_singing(spell, MUSIC_CONF);
\r
6705 int power = plev * 2;
\r
6707 if (info) return info_power(power);
\r
6711 confuse_monsters(power);
\r
6718 if (name) return _("破滅の叫び", "Doomcall");
\r
6719 if (desc) return _("視界内の全てのモンスターに対して轟音攻撃を行う。", "Damages all monsters in sight with booming sound.");
\r
6721 /* Stop singing before start another */
\r
6722 if (cast || fail) stop_singing();
\r
6726 msg_print(_("轟音が響いた...", "The fury of the Downfall of Numenor lashes out..."));
\r
6727 start_singing(spell, MUSIC_SOUND);
\r
6731 int dice = 10 + plev / 5;
\r
6734 if (info) return info_damage(dice, sides, 0);
\r
6738 project_hack(GF_SOUND, damroll(dice, sides));
\r
6745 if (name) return _("フィリエルの歌", "Firiel's Song");
\r
6746 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
\r
6749 /* Stop singing before start another */
\r
6750 if (cast || fail) stop_singing();
\r
6754 msg_print(_("生命と復活のテーマを奏で始めた...", "The themes of life and revival are woven into your song..."));
\r
6755 animate_dead(0, p_ptr->y, p_ptr->x);
\r
6761 if (name) return _("旅の仲間", "Fellowship Chant");
\r
6762 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
\r
6764 /* Stop singing before start another */
\r
6765 if (cast || fail) stop_singing();
\r
6769 msg_print(_("安らかなメロディを奏で始めた...", "You weave a slow, soothing melody of imploration..."));
\r
6770 start_singing(spell, MUSIC_CHARM);
\r
6774 int dice = 10 + plev / 15;
\r
6777 if (info) return info_power_dice(dice, sides);
\r
6781 charm_monsters(damroll(dice, sides));
\r
6788 if (name) return _("分解音波", "Sound of disintegration");
\r
6789 if (desc) return _("壁を掘り進む。自分の足元のアイテムは蒸発する。", "Makes you be able to burrow into walls. Objects under your feet evaporate.");
\r
6791 /* Stop singing before start another */
\r
6792 if (cast || fail) stop_singing();
\r
6796 msg_print(_("粉砕するメロディを奏で始めた...", "You weave a violent pattern of sounds to break wall."));
\r
6797 start_singing(spell, MUSIC_WALL);
\r
6803 * MP不足で効果が発動される前に歌が中断してしまうのを防止。
\r
6807 project(0, 0, p_ptr->y, p_ptr->x,
\r
6808 0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1);
\r
6814 if (name) return _("元素耐性", "Finrod's Resistance");
\r
6815 if (desc) return _("酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
\r
6816 "Gives resistance to fire, cold, electricity, acid and poison. These resistances can be added to which from equipment for more powerful resistances.");
\r
6818 /* Stop singing before start another */
\r
6819 if (cast || fail) stop_singing();
\r
6823 msg_print(_("元素の力に対する忍耐の歌を歌った。", "You sing a song of perseverance against powers..."));
\r
6824 start_singing(spell, MUSIC_RESIST);
\r
6829 if (!p_ptr->oppose_acid)
\r
6831 msg_print(_("酸への耐性が薄れた気がする。", "You feel less resistant to acid."));
\r
6834 if (!p_ptr->oppose_elec)
\r
6836 msg_print(_("電撃への耐性が薄れた気がする。", "You feel less resistant to elec."));
\r
6839 if (!p_ptr->oppose_fire)
\r
6841 msg_print(_("火への耐性が薄れた気がする。", "You feel less resistant to fire."));
\r
6844 if (!p_ptr->oppose_cold)
\r
6846 msg_print(_("冷気への耐性が薄れた気がする。", "You feel less resistant to cold."));
\r
6849 if (!p_ptr->oppose_pois)
\r
6851 msg_print(_("毒への耐性が薄れた気がする。", "You feel less resistant to pois."));
\r
6858 if (name) return _("ホビットのメロディ", "Hobbit Melodies");
\r
6859 if (desc) return _("加速する。", "Hastes you.");
\r
6861 /* Stop singing before start another */
\r
6862 if (cast || fail) stop_singing();
\r
6866 msg_print(_("軽快な歌を口ずさみ始めた...", "You start singing joyful pop song..."));
\r
6867 start_singing(spell, MUSIC_SPEED);
\r
6874 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
\r
6881 if (name) return _("歪んだ世界", "World Contortion");
\r
6882 if (desc) return _("近くのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all nearby monsters away unless resisted.");
\r
6885 int rad = plev / 15 + 1;
\r
6886 int power = plev * 3 + 1;
\r
6888 if (info) return info_radius(rad);
\r
6890 /* Stop singing before start another */
\r
6891 if (cast || fail) stop_singing();
\r
6895 msg_print(_("歌が空間を歪めた...", "Reality whirls wildly as you sing a dizzying melody..."));
\r
6896 project(0, rad, p_ptr->y, p_ptr->x, power, GF_AWAY_ALL, PROJECT_KILL, -1);
\r
6902 if (name) return _("退散の歌", "Dispelling chant");
\r
6903 if (desc) return _("視界内の全てのモンスターにダメージを与える。邪悪なモンスターに特に大きなダメージを与える。",
\r
6904 "Damages all monsters in sight. Hurts evil monsters greatly.");
\r
6906 /* Stop singing before start another */
\r
6907 if (cast || fail) stop_singing();
\r
6911 msg_print(_("耐えられない不協和音が敵を責め立てた...", "You cry out in an ear-wracking voice..."));
\r
6912 start_singing(spell, MUSIC_DISPEL);
\r
6916 int m_sides = plev * 3;
\r
6917 int e_sides = plev * 3;
\r
6919 if (info) return format("%s1d%d+1d%d", s_dam, m_sides, e_sides);
\r
6923 dispel_monsters(randint1(m_sides));
\r
6924 dispel_evil(randint1(e_sides));
\r
6930 if (name) return _("サルマンの甘言", "The Voice of Saruman");
\r
6931 if (desc) return _("視界内の全てのモンスターを減速させ、眠らせようとする。抵抗されると無効。", "Attempts to slow and sleep all monsters in sight.");
\r
6933 /* Stop singing before start another */
\r
6934 if (cast || fail) stop_singing();
\r
6938 msg_print(_("優しく、魅力的な歌を口ずさみ始めた...", "You start humming a gentle and attractive song..."));
\r
6939 start_singing(spell, MUSIC_SARUMAN);
\r
6945 if (info) return info_power(power);
\r
6949 slow_monsters(plev);
\r
6950 sleep_monsters(plev);
\r
6957 if (name) return _("嵐の音色", "Song of the Tempest");
\r
6958 if (desc) return _("轟音のビームを放つ。", "Fires a beam of sound.");
\r
6961 int dice = 15 + (plev - 1) / 2;
\r
6964 if (info) return info_damage(dice, sides, 0);
\r
6966 /* Stop singing before start another */
\r
6967 if (cast || fail) stop_singing();
\r
6971 if (!get_aim_dir(&dir)) return NULL;
\r
6973 fire_beam(GF_SOUND, dir, damroll(dice, sides));
\r
6979 if (name) return _("もう一つの世界", "Ambarkanta");
\r
6980 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
\r
6986 if (info) return info_delay(base, sides);
\r
6988 /* Stop singing before start another */
\r
6989 if (cast || fail) stop_singing();
\r
6993 msg_print(_("周囲が変化し始めた...", "You sing of the primeval shaping of Middle-earth..."));
\r
7000 if (name) return _("破壊の旋律", "Wrecking Pattern");
\r
7001 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
\r
7002 "Shakes dungeon structure, and results in random swapping of floors and walls.");
\r
7004 /* Stop singing before start another */
\r
7005 if (cast || fail) stop_singing();
\r
7009 msg_print(_("破壊的な歌が響きわたった...", "You weave a pattern of sounds to contort and shatter..."));
\r
7010 start_singing(spell, MUSIC_QUAKE);
\r
7016 if (info) return info_radius(rad);
\r
7020 earthquake(p_ptr->y, p_ptr->x, 10);
\r
7028 if (name) return _("停滞の歌", "Stationary Shriek");
\r
7029 if (desc) return _("視界内の全てのモンスターを麻痺させようとする。抵抗されると無効。", "Attempts to freeze all monsters in sight.");
\r
7031 /* Stop singing before start another */
\r
7032 if (cast || fail) stop_singing();
\r
7036 msg_print(_("ゆっくりとしたメロディを奏で始めた...", "You weave a very slow pattern which is almost likely to stop..."));
\r
7037 start_singing(spell, MUSIC_STASIS);
\r
7041 int power = plev * 4;
\r
7043 if (info) return info_power(power);
\r
7047 stasis_monsters(power);
\r
7054 if (name) return _("守りの歌", "Endurance");
\r
7055 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。",
\r
7056 "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
7059 /* Stop singing before start another */
\r
7060 if (cast || fail) stop_singing();
\r
7064 msg_print(_("歌が神聖な場を作り出した...", "The holy power of the Music is creating sacred field..."));
\r
7071 if (name) return _("英雄の詩", "The Hero's Poem");
\r
7072 if (desc) return _("加速し、ヒーロー気分になり、視界内の全てのモンスターにダメージを与える。",
\r
7073 "Hastes you. Gives heroism. Damages all monsters in sight.");
\r
7075 /* Stop singing before start another */
\r
7076 if (cast || fail) stop_singing();
\r
7080 msg_print(_("英雄の歌を口ずさんだ...", "You chant a powerful, heroic call to arms..."));
\r
7081 (void)hp_player(10);
\r
7082 (void)set_afraid(0);
\r
7084 /* Recalculate hitpoints */
\r
7085 p_ptr->update |= (PU_HP);
\r
7087 start_singing(spell, MUSIC_SHERO);
\r
7094 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
\r
7095 /* Recalculate hitpoints */
\r
7096 p_ptr->update |= (PU_HP);
\r
7101 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
\r
7107 int sides = plev * 3;
\r
7109 if (info) return info_damage(dice, sides, 0);
\r
7113 dispel_monsters(damroll(dice, sides));
\r
7119 if (name) return _("ヤヴァンナの助け", "Relief of Yavanna");
\r
7120 if (desc) return _("強力な回復の歌で、負傷と朦朧状態も全快する。", "Powerful healing song. Also heals cut and stun completely.");
\r
7122 /* Stop singing before start another */
\r
7123 if (cast || fail) stop_singing();
\r
7127 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing the song..."));
\r
7128 start_singing(spell, MUSIC_H_LIFE);
\r
7135 if (info) return info_heal(dice, sides, 0);
\r
7139 hp_player(damroll(dice, sides));
\r
7148 if (name) return _("再生の歌", "Goddess' rebirth");
\r
7149 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
\r
7152 /* Stop singing before start another */
\r
7153 if (cast || fail) stop_singing();
\r
7157 msg_print(_("暗黒の中に光と美をふりまいた。体が元の活力を取り戻した。",
\r
7158 "You strewed light and beauty in the dark as you sing. You feel refreshed."));
\r
7159 (void)do_res_stat(A_STR);
\r
7160 (void)do_res_stat(A_INT);
\r
7161 (void)do_res_stat(A_WIS);
\r
7162 (void)do_res_stat(A_DEX);
\r
7163 (void)do_res_stat(A_CON);
\r
7164 (void)do_res_stat(A_CHR);
\r
7165 (void)restore_level();
\r
7171 if (name) return _("サウロンの魔術", "Wizardry of Sauron");
\r
7172 if (desc) return _("非常に強力でごく小さい轟音の球を放つ。", "Fires an extremely powerful tiny ball of sound.");
\r
7175 int dice = 50 + plev;
\r
7179 if (info) return info_damage(dice, sides, 0);
\r
7181 /* Stop singing before start another */
\r
7182 if (cast || fail) stop_singing();
\r
7186 if (!get_aim_dir(&dir)) return NULL;
\r
7188 fire_ball(GF_SOUND, dir, damroll(dice, sides), rad);
\r
7194 if (name) return _("フィンゴルフィンの挑戦", "Fingolfin's Challenge");
\r
7195 if (desc) return _("ダメージを受けなくなるバリアを張る。",
\r
7196 "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks.");
\r
7198 /* Stop singing before start another */
\r
7199 if (cast || fail) stop_singing();
\r
7203 msg_print(_("フィンゴルフィンの冥王への挑戦を歌った...",
\r
7204 "You recall the valor of Fingolfin's challenge to the Dark Lord..."));
\r
7207 p_ptr->redraw |= (PR_MAP);
\r
7209 /* Update monsters */
\r
7210 p_ptr->update |= (PU_MONSTERS);
\r
7212 /* Window stuff */
\r
7213 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
\r
7215 start_singing(spell, MUSIC_INVULN);
\r
7220 if (!p_ptr->invuln)
\r
7222 msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));
\r
7224 p_ptr->redraw |= (PR_MAP);
\r
7226 /* Update monsters */
\r
7227 p_ptr->update |= (PU_MONSTERS);
\r
7229 /* Window stuff */
\r
7230 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
\r
7241 * @brief 剣術の各処理を行う
\r
7242 * @param spell 剣術ID
\r
7243 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_CAST)
\r
7244 * @return SPELL_NAME / SPELL_DESC 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
7246 static cptr do_hissatsu_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
7248 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
7249 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
7250 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
7253 int plev = p_ptr->lev;
\r
7258 if (name) return _("飛飯綱", "Tobi-Izuna");
\r
7259 if (desc) return _("2マス離れたところにいるモンスターを攻撃する。", "Attacks a two squares distant monster.");
\r
7263 project_length = 2;
\r
7264 if (!get_aim_dir(&dir)) return NULL;
\r
7266 project_hook(GF_ATTACK, dir, HISSATSU_2, PROJECT_STOP | PROJECT_KILL);
\r
7271 if (name) return _("五月雨斬り", "3-Way Attack");
\r
7272 if (desc) return _("3方向に対して攻撃する。", "Attacks in 3 directions in one time.");
\r
7279 if (!get_rep_dir2(&dir)) return NULL;
\r
7280 if (dir == 5) return NULL;
\r
7282 for (cdir = 0;cdir < 8; cdir++)
\r
7284 if (cdd[cdir] == dir) break;
\r
7287 if (cdir == 8) return NULL;
\r
7289 y = p_ptr->y + ddy_cdd[cdir];
\r
7290 x = p_ptr->x + ddx_cdd[cdir];
\r
7291 if (cave[y][x].m_idx)
\r
7292 py_attack(y, x, 0);
\r
7294 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
\r
7296 y = p_ptr->y + ddy_cdd[(cdir + 7) % 8];
\r
7297 x = p_ptr->x + ddx_cdd[(cdir + 7) % 8];
\r
7298 if (cave[y][x].m_idx)
\r
7299 py_attack(y, x, 0);
\r
7301 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
\r
7303 y = p_ptr->y + ddy_cdd[(cdir + 1) % 8];
\r
7304 x = p_ptr->x + ddx_cdd[(cdir + 1) % 8];
\r
7305 if (cave[y][x].m_idx)
\r
7306 py_attack(y, x, 0);
\r
7308 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
\r
7313 if (name) return _("ブーメラン", "Boomerang");
\r
7314 if (desc) return _("武器を手元に戻ってくるように投げる。戻ってこないこともある。",
\r
7315 "Throws current weapon. And it'll return to your hand unless failed.");
\r
7319 if (!do_cmd_throw(1, TRUE, -1)) return NULL;
\r
7324 if (name) return _("焔霊", "Burning Strike");
\r
7325 if (desc) return _("火炎耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to fire.");
\r
7331 if (!get_rep_dir2(&dir)) return NULL;
\r
7332 if (dir == 5) return NULL;
\r
7334 y = p_ptr->y + ddy[dir];
\r
7335 x = p_ptr->x + ddx[dir];
\r
7337 if (cave[y][x].m_idx)
\r
7338 py_attack(y, x, HISSATSU_FIRE);
\r
7341 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7348 if (name) return _("殺気感知", "Detect Ferocity");
\r
7349 if (desc) return _("近くの思考することができるモンスターを感知する。", "Detects all monsters except mindless in your vicinity.");
\r
7353 detect_monsters_mind(DETECT_RAD_DEFAULT);
\r
7358 if (name) return _("みね打ち", "Strike to Stun");
\r
7359 if (desc) return _("相手にダメージを与えないが、朦朧とさせる。", "Attempts to stun a monster in the adjacent.");
\r
7365 if (!get_rep_dir2(&dir)) return NULL;
\r
7366 if (dir == 5) return NULL;
\r
7368 y = p_ptr->y + ddy[dir];
\r
7369 x = p_ptr->x + ddx[dir];
\r
7371 if (cave[y][x].m_idx)
\r
7372 py_attack(y, x, HISSATSU_MINEUCHI);
\r
7375 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7382 if (name) return _("カウンター", "Counter");
\r
7383 if (desc) return _("相手に攻撃されたときに反撃する。反撃するたびにMPを消費。",
\r
7384 "Prepares to counterattack. When attack by a monster, strikes back using SP each time.");
\r
7388 if (p_ptr->riding)
\r
7390 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
\r
7393 msg_print(_("相手の攻撃に対して身構えた。", "You prepare to counter blow."));
\r
7394 p_ptr->counter = TRUE;
\r
7399 if (name) return _("払い抜け", "Harainuke");
\r
7400 if (desc) return _("攻撃した後、反対側に抜ける。",
\r
7401 "Attacks monster with your weapons normally, then move through counter side of the monster.");
\r
7407 if (p_ptr->riding)
\r
7409 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
\r
7413 if (!get_rep_dir2(&dir)) return NULL;
\r
7415 if (dir == 5) return NULL;
\r
7416 y = p_ptr->y + ddy[dir];
\r
7417 x = p_ptr->x + ddx[dir];
\r
7419 if (!cave[y][x].m_idx)
\r
7421 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7425 py_attack(y, x, 0);
\r
7427 if (!player_can_enter(cave[y][x].feat, 0) || is_trap(cave[y][x].feat))
\r
7433 if (player_can_enter(cave[y][x].feat, 0) && !is_trap(cave[y][x].feat) && !cave[y][x].m_idx)
\r
7437 /* Move the player */
\r
7438 (void)move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);
\r
7444 if (name) return _("サーペンツタン", "Serpent's Tongue");
\r
7445 if (desc) return _("毒耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to poison.");
\r
7451 if (!get_rep_dir2(&dir)) return NULL;
\r
7452 if (dir == 5) return NULL;
\r
7454 y = p_ptr->y + ddy[dir];
\r
7455 x = p_ptr->x + ddx[dir];
\r
7457 if (cave[y][x].m_idx)
\r
7458 py_attack(y, x, HISSATSU_POISON);
\r
7461 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7468 if (name) return _("斬魔剣弐の太刀", "Zammaken");
\r
7469 if (desc) return _("生命のない邪悪なモンスターに大ダメージを与えるが、他のモンスターには全く効果がない。",
\r
7470 "Attacks an evil unliving monster with great damage. No effect to other monsters.");
\r
7476 if (!get_rep_dir2(&dir)) return NULL;
\r
7477 if (dir == 5) return NULL;
\r
7479 y = p_ptr->y + ddy[dir];
\r
7480 x = p_ptr->x + ddx[dir];
\r
7482 if (cave[y][x].m_idx)
\r
7483 py_attack(y, x, HISSATSU_ZANMA);
\r
7486 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7493 if (name) return _("裂風剣", "Wind Blast");
\r
7494 if (desc) return _("攻撃した相手を後方へ吹き飛ばす。", "Attacks an adjacent monster, and blow it away.");
\r
7500 if (!get_rep_dir2(&dir)) return NULL;
\r
7501 if (dir == 5) return NULL;
\r
7503 y = p_ptr->y + ddy[dir];
\r
7504 x = p_ptr->x + ddx[dir];
\r
7506 if (cave[y][x].m_idx)
\r
7507 py_attack(y, x, 0);
\r
7510 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7513 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
\r
7517 if (cave[y][x].m_idx)
\r
7520 POSITION ty = y, tx = x;
\r
7521 POSITION oy = y, ox = x;
\r
7522 MONSTER_IDX m_idx = cave[y][x].m_idx;
\r
7523 monster_type *m_ptr = &m_list[m_idx];
\r
7526 monster_desc(m_name, m_ptr, 0);
\r
7528 for (i = 0; i < 5; i++)
\r
7532 if (cave_empty_bold(y, x))
\r
7539 if ((ty != oy) || (tx != ox))
\r
7541 msg_format(_("%sを吹き飛ばした!", "You blow %s away!"), m_name);
\r
7542 cave[oy][ox].m_idx = 0;
\r
7543 cave[ty][tx].m_idx = m_idx;
\r
7547 update_mon(m_idx, TRUE);
\r
7548 lite_spot(oy, ox);
\r
7549 lite_spot(ty, tx);
\r
7551 if (r_info[m_ptr->r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))
\r
7552 p_ptr->update |= (PU_MON_LITE);
\r
7559 if (name) return _("刀匠の目利き", "Judge");
\r
7560 if (desc) return _("武器・防具を1つ識別する。レベル45以上で武器・防具の能力を完全に知ることができる。",
\r
7561 "Identifies a weapon or armor. Or *identifies* these at level 45.");
\r
7567 if (!identify_fully(TRUE)) return NULL;
\r
7571 if (!ident_spell(TRUE)) return NULL;
\r
7577 if (name) return _("破岩斬", "Rock Smash");
\r
7578 if (desc) return _("岩を壊し、岩石系のモンスターに大ダメージを与える。", "Breaks rock. Or greatly damage a monster made by rocks.");
\r
7584 if (!get_rep_dir2(&dir)) return NULL;
\r
7585 if (dir == 5) return NULL;
\r
7587 y = p_ptr->y + ddy[dir];
\r
7588 x = p_ptr->x + ddx[dir];
\r
7590 if (cave[y][x].m_idx)
\r
7591 py_attack(y, x, HISSATSU_HAGAN);
\r
7593 if (!cave_have_flag_bold(y, x, FF_HURT_ROCK)) break;
\r
7595 /* Destroy the feature */
\r
7596 cave_alter_feat(y, x, FF_HURT_ROCK);
\r
7598 /* Update some things */
\r
7599 p_ptr->update |= (PU_FLOW);
\r
7604 if (name) return _("乱れ雪月花", "Midare-Setsugekka");
\r
7605 if (desc) return _("攻撃回数が増え、冷気耐性のないモンスターに大ダメージを与える。",
\r
7606 "Attacks a monster with increased number of attacks and more damage unless it has resistance to cold.");
\r
7612 if (!get_rep_dir2(&dir)) return NULL;
\r
7613 if (dir == 5) return NULL;
\r
7615 y = p_ptr->y + ddy[dir];
\r
7616 x = p_ptr->x + ddx[dir];
\r
7618 if (cave[y][x].m_idx)
\r
7619 py_attack(y, x, HISSATSU_COLD);
\r
7622 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7629 if (name) return _("急所突き", "Spot Aiming");
\r
7630 if (desc) return _("モンスターを一撃で倒す攻撃を繰り出す。失敗すると1点しかダメージを与えられない。",
\r
7631 "Attempts to kill a monster instantly. If failed cause only 1HP of damage.");
\r
7637 if (!get_rep_dir2(&dir)) return NULL;
\r
7638 if (dir == 5) return NULL;
\r
7640 y = p_ptr->y + ddy[dir];
\r
7641 x = p_ptr->x + ddx[dir];
\r
7643 if (cave[y][x].m_idx)
\r
7644 py_attack(y, x, HISSATSU_KYUSHO);
\r
7647 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7654 if (name) return _("魔神斬り", "Majingiri");
\r
7655 if (desc) return _("会心の一撃で攻撃する。攻撃がかわされやすい。",
\r
7656 "Attempts to attack with critical hit. But this attack is easy to evade for a monster.");
\r
7662 if (!get_rep_dir2(&dir)) return NULL;
\r
7663 if (dir == 5) return NULL;
\r
7665 y = p_ptr->y + ddy[dir];
\r
7666 x = p_ptr->x + ddx[dir];
\r
7668 if (cave[y][x].m_idx)
\r
7669 py_attack(y, x, HISSATSU_MAJIN);
\r
7672 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7679 if (name) return _("捨て身", "Desperate Attack");
\r
7680 if (desc) return _("強力な攻撃を繰り出す。次のターンまでの間、食らうダメージが増える。",
\r
7681 "Attacks with all of your power. But all damages you take will be doubled for one turn.");
\r
7687 if (!get_rep_dir2(&dir)) return NULL;
\r
7688 if (dir == 5) return NULL;
\r
7690 y = p_ptr->y + ddy[dir];
\r
7691 x = p_ptr->x + ddx[dir];
\r
7693 if (cave[y][x].m_idx)
\r
7694 py_attack(y, x, HISSATSU_SUTEMI);
\r
7697 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7700 p_ptr->sutemi = TRUE;
\r
7705 if (name) return _("雷撃鷲爪斬", "Lightning Eagle");
\r
7706 if (desc) return _("電撃耐性のないモンスターに非常に大きいダメージを与える。",
\r
7707 "Attacks a monster with more damage unless it has resistance to electricity.");
\r
7713 if (!get_rep_dir2(&dir)) return NULL;
\r
7714 if (dir == 5) return NULL;
\r
7716 y = p_ptr->y + ddy[dir];
\r
7717 x = p_ptr->x + ddx[dir];
\r
7719 if (cave[y][x].m_idx)
\r
7720 py_attack(y, x, HISSATSU_ELEC);
\r
7723 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7730 if (name) return _("入身", "Rush Attack");
\r
7731 if (desc) return _("素早く相手に近寄り攻撃する。", "Steps close to a monster and attacks at a time.");
\r
7735 if (!rush_attack(NULL)) return NULL;
\r
7740 if (name) return _("赤流渦", "Bloody Maelstrom");
\r
7741 if (desc) return _("自分自身も傷を作りつつ、その傷が深いほど大きい威力で全方向の敵を攻撃できる。生きていないモンスターには効果がない。",
\r
7742 "Attacks all adjacent monsters with power corresponding to your cut status. Then increases your cut status. No effect to unliving monsters.");
\r
7749 monster_type *m_ptr;
\r
7751 if (p_ptr->cut < 300)
\r
7752 set_cut(p_ptr->cut + 300);
\r
7754 set_cut(p_ptr->cut * 2);
\r
7756 for (dir = 0; dir < 8; dir++)
\r
7758 y = p_ptr->y + ddy_ddd[dir];
\r
7759 x = p_ptr->x + ddx_ddd[dir];
\r
7760 c_ptr = &cave[y][x];
\r
7762 /* Get the monster */
\r
7763 m_ptr = &m_list[c_ptr->m_idx];
\r
7765 /* Hack -- attack monsters */
\r
7766 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
\r
7768 if (!monster_living(&r_info[m_ptr->r_idx]))
\r
7772 monster_desc(m_name, m_ptr, 0);
\r
7773 msg_format(_("%sには効果がない!", "%s is unharmed!"), m_name);
\r
7775 else py_attack(y, x, HISSATSU_SEKIRYUKA);
\r
7782 if (name) return _("激震撃", "Earthquake Blow");
\r
7783 if (desc) return _("地震を起こす。", "Shakes dungeon structure, and results in random swapping of floors and walls.");
\r
7789 if (!get_rep_dir2(&dir)) return NULL;
\r
7790 if (dir == 5) return NULL;
\r
7792 y = p_ptr->y + ddy[dir];
\r
7793 x = p_ptr->x + ddx[dir];
\r
7795 if (cave[y][x].m_idx)
\r
7796 py_attack(y, x, HISSATSU_QUAKE);
\r
7798 earthquake(p_ptr->y, p_ptr->x, 10);
\r
7803 if (name) return _("地走り", "Crack");
\r
7804 if (desc) return _("衝撃波のビームを放つ。", "Fires a beam of shock wave.");
\r
7808 int total_damage = 0, basedam, i;
\r
7809 u32b flgs[TR_FLAG_SIZE];
\r
7810 object_type *o_ptr;
\r
7811 if (!get_aim_dir(&dir)) return NULL;
\r
7812 msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
\r
7813 for (i = 0; i < 2; i++)
\r
7817 if (!buki_motteruka(INVEN_RARM+i)) break;
\r
7818 o_ptr = &inventory[INVEN_RARM+i];
\r
7819 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
\r
7820 damage = o_ptr->to_d * 100;
\r
7821 object_flags(o_ptr, flgs);
\r
7822 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
\r
7824 /* vorpal blade */
\r
7828 else if (have_flag(flgs, TR_VORPAL))
\r
7830 /* vorpal flag only */
\r
7834 damage += basedam;
\r
7835 damage *= p_ptr->num_blow[i];
\r
7836 total_damage += damage / 200;
\r
7837 if (i) total_damage = total_damage*7/10;
\r
7839 fire_beam(GF_FORCE, dir, total_damage);
\r
7844 if (name) return _("気迫の雄叫び", "War Cry");
\r
7845 if (desc) return _("視界内の全モンスターに対して轟音の攻撃を行う。さらに、近くにいるモンスターを怒らせる。",
\r
7846 "Damages all monsters in sight with sound. Aggravate nearby monsters.");
\r
7850 msg_print(_("雄叫びをあげた!", "You roar out!"));
\r
7851 project_hack(GF_SOUND, randint1(plev * 3));
\r
7852 aggravate_monsters(0);
\r
7857 if (name) return _("無双三段", "Musou-Sandan");
\r
7858 if (desc) return _("強力な3段攻撃を繰り出す。", "Attacks with powerful 3 strikes.");
\r
7864 if (!get_rep_dir2(&dir)) return NULL;
\r
7865 if (dir == 5) return NULL;
\r
7867 for (i = 0; i < 3; i++)
\r
7871 MONSTER_IDX m_idx;
\r
7873 monster_type *m_ptr;
\r
7875 y = p_ptr->y + ddy[dir];
\r
7876 x = p_ptr->x + ddx[dir];
\r
7877 c_ptr = &cave[y][x];
\r
7880 py_attack(y, x, HISSATSU_3DAN);
\r
7883 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7887 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
\r
7892 /* Monster is dead? */
\r
7893 if (!c_ptr->m_idx) break;
\r
7895 ny = y + ddy[dir];
\r
7896 nx = x + ddx[dir];
\r
7897 m_idx = c_ptr->m_idx;
\r
7898 m_ptr = &m_list[m_idx];
\r
7900 /* Monster cannot move back? */
\r
7901 if (!monster_can_enter(ny, nx, &r_info[m_ptr->r_idx], 0))
\r
7904 if (i < 2) msg_print(NULL);
\r
7909 cave[ny][nx].m_idx = m_idx;
\r
7913 update_mon(m_idx, TRUE);
\r
7915 /* Redraw the old spot */
\r
7918 /* Redraw the new spot */
\r
7919 lite_spot(ny, nx);
\r
7921 /* Player can move forward? */
\r
7922 if (player_can_enter(c_ptr->feat, 0))
\r
7924 /* Move the player */
\r
7925 if (!move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP)) break;
\r
7933 if (i < 2) msg_print(NULL);
\r
7939 if (name) return _("吸血鬼の牙", "Vampire's Fang");
\r
7940 if (desc) return _("攻撃した相手の体力を吸いとり、自分の体力を回復させる。生命を持たないモンスターには通じない。",
\r
7941 "Attacks with vampiric strikes which absorbs HP from a monster and gives them to you. No effect to unliving monsters.");
\r
7947 if (!get_rep_dir2(&dir)) return NULL;
\r
7948 if (dir == 5) return NULL;
\r
7950 y = p_ptr->y + ddy[dir];
\r
7951 x = p_ptr->x + ddx[dir];
\r
7953 if (cave[y][x].m_idx)
\r
7954 py_attack(y, x, HISSATSU_DRAIN);
\r
7957 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
7964 if (name) return _("幻惑", "Moon Dazzling");
\r
7965 if (desc) return _("視界内の起きている全モンスターに朦朧、混乱、眠りを与えようとする。", "Attempts to stun, confuse and sleep all waking monsters.");
\r
7969 msg_print(_("武器を不規則に揺らした...", "You irregularly wave your weapon..."));
\r
7970 project_hack(GF_ENGETSU, plev * 4);
\r
7971 project_hack(GF_ENGETSU, plev * 4);
\r
7972 project_hack(GF_ENGETSU, plev * 4);
\r
7977 if (name) return _("百人斬り", "Hundred Slaughter");
\r
7978 if (desc) return _("連続して入身でモンスターを攻撃する。攻撃するたびにMPを消費。MPがなくなるか、モンスターを倒せなかったら百人斬りは終了する。",
\r
7979 "Performs a series of rush attacks. The series continues while killing each monster in a time and SP remains.");
\r
7983 const int mana_cost_per_monster = 8;
\r
7984 bool is_new = TRUE;
\r
7989 if (!rush_attack(&mdeath)) break;
\r
7992 /* Reserve needed mana point */
\r
7993 p_ptr->csp -= technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
\r
7997 p_ptr->csp -= mana_cost_per_monster;
\r
7999 if (!mdeath) break;
\r
8002 p_ptr->redraw |= PR_MANA;
\r
8005 while (p_ptr->csp > mana_cost_per_monster);
\r
8007 if (is_new) return NULL;
\r
8009 /* Restore reserved mana */
\r
8010 p_ptr->csp += technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
\r
8015 if (name) return _("天翔龍閃", "Dragonic Flash");
\r
8016 if (desc) return _("視界内の場所を指定して、その場所と自分の間にいる全モンスターを攻撃し、その場所に移動する。",
\r
8017 "Runs toward given location while attacking all monsters on the path.");
\r
8023 if (!tgt_pt(&x, &y)) return NULL;
\r
8025 if (!cave_player_teleportable_bold(y, x, 0L) ||
\r
8026 (distance(y, x, p_ptr->y, p_ptr->x) > MAX_SIGHT / 2) ||
\r
8027 !projectable(p_ptr->y, p_ptr->x, y, x))
\r
8029 msg_print(_("失敗!", "You cannot move to that place!"));
\r
8032 if (p_ptr->anti_tele)
\r
8034 msg_print(_("不思議な力がテレポートを防いだ!", "A mysterious force prevents you from teleporting!"));
\r
8037 project(0, 0, y, x, HISSATSU_ISSEN, GF_ATTACK, PROJECT_BEAM | PROJECT_KILL, -1);
\r
8038 teleport_player_to(y, x, 0L);
\r
8043 if (name) return _("二重の剣撃", "Twin Slash");
\r
8044 if (desc) return _("1ターンで2度攻撃を行う。", "double attacks at a time.");
\r
8050 if (!get_rep_dir(&dir, FALSE)) return NULL;
\r
8052 y = p_ptr->y + ddy[dir];
\r
8053 x = p_ptr->x + ddx[dir];
\r
8055 if (cave[y][x].m_idx)
\r
8057 py_attack(y, x, 0);
\r
8058 if (cave[y][x].m_idx)
\r
8061 py_attack(y, x, 0);
\r
8066 msg_print(_("その方向にはモンスターはいません。", "You don't see any monster in this direction"));
\r
8073 if (name) return _("虎伏絶刀勢", "Kofuku-Zettousei");
\r
8074 if (desc) return _("強力な攻撃を行い、近くの場所にも効果が及ぶ。", "Performs a powerful attack which even effect nearby monsters.");
\r
8078 int total_damage = 0, basedam, i;
\r
8080 u32b flgs[TR_FLAG_SIZE];
\r
8081 object_type *o_ptr;
\r
8083 if (!get_rep_dir2(&dir)) return NULL;
\r
8084 if (dir == 5) return NULL;
\r
8086 y = p_ptr->y + ddy[dir];
\r
8087 x = p_ptr->x + ddx[dir];
\r
8089 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
\r
8091 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));
\r
8094 msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
\r
8095 for (i = 0; i < 2; i++)
\r
8098 if (!buki_motteruka(INVEN_RARM+i)) break;
\r
8099 o_ptr = &inventory[INVEN_RARM+i];
\r
8100 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
\r
8101 damage = o_ptr->to_d * 100;
\r
8102 object_flags(o_ptr, flgs);
\r
8103 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
\r
8105 /* vorpal blade */
\r
8109 else if (have_flag(flgs, TR_VORPAL))
\r
8111 /* vorpal flag only */
\r
8115 damage += basedam;
\r
8116 damage += p_ptr->to_d[i] * 100;
\r
8117 damage *= p_ptr->num_blow[i];
\r
8118 total_damage += (damage / 100);
\r
8120 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
8125 if (name) return _("慶雲鬼忍剣", "Keiun-Kininken");
\r
8126 if (desc) return _("自分もダメージをくらうが、相手に非常に大きなダメージを与える。アンデッドには特に効果がある。",
\r
8127 "Attacks a monster with extremely powerful damage. But you also takes some damages. Hurts a undead monster greatly.");
\r
8133 if (!get_rep_dir2(&dir)) return NULL;
\r
8134 if (dir == 5) return NULL;
\r
8136 y = p_ptr->y + ddy[dir];
\r
8137 x = p_ptr->x + ddx[dir];
\r
8139 if (cave[y][x].m_idx)
\r
8140 py_attack(y, x, HISSATSU_UNDEAD);
\r
8143 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
8146 take_hit(DAMAGE_NOESCAPE, 100 + randint1(100), _("慶雲鬼忍剣を使った衝撃", "exhaustion on using Keiun-Kininken"), -1);
\r
8151 if (name) return _("切腹", "Harakiri");
\r
8152 if (desc) return _("「武士道とは、死ぬことと見つけたり。」", "'Busido is found in death'");
\r
8157 if (!get_check(_("本当に自殺しますか?", "Do you really want to commit suicide? "))) return NULL;
\r
8158 /* Special Verification for suicide */
\r
8159 prt(_("確認のため '@' を押して下さい。", "Please verify SUICIDE by typing the '@' sign: "), 0, 0);
\r
8164 if (i != '@') return NULL;
\r
8165 if (p_ptr->total_winner)
\r
8167 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
\r
8168 p_ptr->total_winner = TRUE;
\r
8172 msg_print(_("武士道とは、死ぬことと見つけたり。", "Meaning of Bushi-do is found in the death."));
\r
8173 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
\r
8183 * @brief 呪術領域の武器呪縛の対象にできる武器かどうかを返す。 / An "item_tester_hook" for offer
\r
8184 * @param o_ptr オブジェクト構造体の参照ポインタ
\r
8185 * @return 呪縛可能な武器ならばTRUEを返す
\r
8187 static bool item_tester_hook_weapon_except_bow(object_type *o_ptr)
\r
8189 switch (o_ptr->tval)
\r
8204 * @brief 呪術領域の各処理に使える呪われた装備かどうかを返す。 / An "item_tester_hook" for offer
\r
8205 * @param o_ptr オブジェクト構造体の参照ポインタ
\r
8206 * @return 使える装備ならばTRUEを返す
\r
8208 static bool item_tester_hook_cursed(object_type *o_ptr)
\r
8210 return (bool)(object_is_cursed(o_ptr));
\r
8214 * @brief 呪術領域魔法の各処理を行う
\r
8215 * @param spell 魔法ID
\r
8216 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_CONT / SPELL_STOP)
\r
8217 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
\r
8219 static cptr do_hex_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
8221 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
8222 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
8223 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
8224 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
8225 bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
\r
8226 bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
\r
8230 PLAYER_LEVEL plev = p_ptr->lev;
\r
8235 /*** 1st book (0-7) ***/
\r
8237 if (name) return _("邪なる祝福", "Evily blessing");
\r
8238 if (desc) return _("祝福により攻撃精度と防御力が上がる。", "Attempts to increase +to_hit of a weapon and AC");
\r
8241 if (!p_ptr->blessed)
\r
8243 msg_print(_("高潔な気分になった!", "You feel righteous!"));
\r
8248 if (!p_ptr->blessed)
\r
8250 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
\r
8256 if (name) return _("軽傷の治癒", "Cure light wounds");
\r
8257 if (desc) return _("HPや傷を少し回復させる。", "Heals cut and HP a little.");
\r
8258 if (info) return info_heal(1, 10, 0);
\r
8261 msg_print(_("気分が良くなってくる。", "You feel better and better."));
\r
8265 hp_player(damroll(1, 10));
\r
8266 set_cut(p_ptr->cut - 10);
\r
8271 if (name) return _("悪魔のオーラ", "Demonic aura");
\r
8272 if (desc) return _("炎のオーラを身にまとい、回復速度が速くなる。", "Gives fire aura and regeneration.");
\r
8275 msg_print(_("体が炎のオーラで覆われた。", "You have enveloped by fiery aura!"));
\r
8279 msg_print(_("炎のオーラが消え去った。", "Fiery aura disappeared."));
\r
8284 if (name) return _("悪臭霧", "Stinking mist");
\r
8285 if (desc) return _("視界内のモンスターに微弱量の毒のダメージを与える。", "Deals few damages of poison to all monsters in your sight.");
\r
8286 power = plev / 2 + 5;
\r
8287 if (info) return info_damage(1, power, 0);
\r
8290 project_hack(GF_POIS, randint1(power));
\r
8295 if (name) return _("腕力強化", "Extra might");
\r
8296 if (desc) return _("術者の腕力を上昇させる。", "Attempts to increase your strength.");
\r
8299 msg_print(_("何だか力が湧いて来る。", "You feel you get stronger."));
\r
8304 if (name) return _("武器呪縛", "Curse weapon");
\r
8305 if (desc) return _("装備している武器を呪う。", "Curses your weapon.");
\r
8310 char o_name[MAX_NLEN];
\r
8311 object_type *o_ptr;
\r
8312 u32b f[TR_FLAG_SIZE];
\r
8314 item_tester_hook = item_tester_hook_weapon_except_bow;
\r
8315 q = _("どれを呪いますか?", "Which weapon do you curse?");
\r
8316 s = _("武器を装備していない。", "You wield no weapons.");
\r
8318 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
\r
8320 o_ptr = &inventory[item];
\r
8321 object_desc(o_name, o_ptr, OD_NAME_ONLY);
\r
8322 object_flags(o_ptr, f);
\r
8324 if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
\r
8326 if (!one_in_(3) &&
\r
8327 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
\r
8329 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
\r
8332 if (o_ptr->to_d > 0)
\r
8334 o_ptr->to_d -= randint1(3) % 2;
\r
8335 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
\r
8337 if (o_ptr->to_h > 0)
\r
8339 o_ptr->to_h -= randint1(3) % 2;
\r
8340 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
\r
8342 if (o_ptr->to_a > 0)
\r
8344 o_ptr->to_a -= randint1(3) % 2;
\r
8345 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
\r
8347 msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
\r
8352 int curse_rank = 0;
\r
8353 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
\r
8354 o_ptr->curse_flags |= (TRC_CURSED);
\r
8356 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
\r
8359 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
\r
8362 o_ptr->curse_flags |= (TRC_TY_CURSE);
\r
8363 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
\r
8365 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
\r
8366 add_flag(o_ptr->art_flags, TR_VORPAL);
\r
8367 add_flag(o_ptr->art_flags, TR_VAMPIRIC);
\r
8368 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
\r
8373 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);
\r
8376 p_ptr->update |= (PU_BONUS);
\r
8382 if (name) return _("邪悪感知", "Evil detection");
\r
8383 if (desc) return _("周囲の邪悪なモンスターを感知する。", "Detects evil monsters.");
\r
8384 if (info) return info_range(MAX_SIGHT);
\r
8387 msg_print(_("邪悪な生物の存在を感じ取ろうとした。", "You attend to the presence of evil creatures."));
\r
8392 if (name) return _("我慢", "Patience");
\r
8393 if (desc) return _("数ターン攻撃を耐えた後、受けたダメージを地獄の業火として周囲に放出する。",
\r
8394 "Bursts hell fire strongly after patients any damage while few turns.");
\r
8395 power = MIN(200, (HEX_REVENGE_POWER(p_ptr) * 2));
\r
8396 if (info) return info_damage(0, 0, power);
\r
8399 int a = 3 - (p_ptr->pspeed - 100) / 10;
\r
8400 MAGIC_NUM2 r = 3 + randint1(3) + MAX(0, MIN(3, a));
\r
8402 if (HEX_REVENGE_TURN(p_ptr) > 0)
\r
8404 msg_print(_("すでに我慢をしている。", "You are already patienting."));
\r
8408 HEX_REVENGE_TYPE(p_ptr) = 1;
\r
8409 HEX_REVENGE_TURN(p_ptr) = r;
\r
8410 HEX_REVENGE_POWER(p_ptr) = 0;
\r
8411 msg_print(_("じっと耐えることにした。", "You decide to patient all damages."));
\r
8416 int rad = 2 + (power / 50);
\r
8418 HEX_REVENGE_TURN(p_ptr)--;
\r
8420 if ((HEX_REVENGE_TURN(p_ptr) <= 0) || (power >= 200))
\r
8422 msg_print(_("我慢が解かれた!", "Time for end of patioence!"));
\r
8425 project(0, rad, p_ptr->y, p_ptr->x, power, GF_HELL_FIRE,
\r
8426 (PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);
\r
8428 if (p_ptr->wizard)
\r
8430 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
\r
8434 HEX_REVENGE_TYPE(p_ptr) = 0;
\r
8435 HEX_REVENGE_TURN(p_ptr) = 0;
\r
8436 HEX_REVENGE_POWER(p_ptr) = 0;
\r
8441 /*** 2nd book (8-15) ***/
\r
8443 if (name) return _("氷の鎧", "Ice armor");
\r
8444 if (desc) return _("氷のオーラを身にまとい、防御力が上昇する。", "Gives fire aura and bonus to AC.");
\r
8447 msg_print(_("体が氷の鎧で覆われた。", "You have enveloped by ice armor!"));
\r
8451 msg_print(_("氷の鎧が消え去った。", "Ice armor disappeared."));
\r
8456 if (name) return _("重傷の治癒", "Cure serious wounds");
\r
8457 if (desc) return _("体力や傷を多少回復させる。", "Heals cut and HP more.");
\r
8458 if (info) return info_heal(2, 10, 0);
\r
8461 msg_print(_("気分が良くなってくる。", "You feel better and better."));
\r
8465 hp_player(damroll(2, 10));
\r
8466 set_cut((p_ptr->cut / 2) - 10);
\r
8471 if (name) return _("薬品吸入", "Inhail potion");
\r
8472 if (desc) return _("呪文詠唱を中止することなく、薬の効果を得ることができる。", "Quaffs a potion without canceling of casting a spell.");
\r
8475 CASTING_HEX_FLAGS(p_ptr) |= (1L << HEX_INHAIL);
\r
8476 do_cmd_quaff_potion();
\r
8477 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_INHAIL);
\r
8483 if (name) return _("衰弱の霧", "Hypodynamic mist");
\r
8484 if (desc) return _("視界内のモンスターに微弱量の衰弱属性のダメージを与える。",
\r
8485 "Deals few damages of hypodynamia to all monsters in your sight.");
\r
8486 power = (plev / 2) + 5;
\r
8487 if (info) return info_damage(1, power, 0);
\r
8490 project_hack(GF_HYPODYNAMIA, randint1(power));
\r
8495 if (name) return _("魔剣化", "Swords to runeswords");
\r
8496 if (desc) return _("武器の攻撃力を上げる。切れ味を得、呪いに応じて与えるダメージが上昇し、善良なモンスターに対するダメージが2倍になる。",
\r
8497 "Gives vorpal ability to your weapon. Increases damages by your weapon acccording to curse of your weapon.");
\r
8501 msg_print("あなたの武器が黒く輝いた。");
\r
8503 if (!empty_hands(FALSE))
\r
8504 msg_print("Your weapons glow bright black.");
\r
8506 msg_print("Your weapon glows bright black.");
\r
8512 msg_print("武器の輝きが消え去った。");
\r
8514 msg_format("Brightness of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
\r
8520 if (name) return _("混乱の手", "Touch of confusion");
\r
8521 if (desc) return _("攻撃した際モンスターを混乱させる。", "Confuses a monster when you attack.");
\r
8524 msg_print(_("あなたの手が赤く輝き始めた。", "Your hands glow bright red."));
\r
8528 msg_print(_("手の輝きがなくなった。", "Brightness on your hands disappeard."));
\r
8533 if (name) return _("肉体強化", "Building up");
\r
8534 if (desc) return _("術者の腕力、器用さ、耐久力を上昇させる。攻撃回数の上限を 1 増加させる。",
\r
8535 "Attempts to increases your strength, dexterity and constitusion.");
\r
8538 msg_print(_("身体が強くなった気がした。", "You feel your body is developed more now."));
\r
8543 if (name) return _("反テレポート結界", "Anti teleport barrier");
\r
8544 if (desc) return _("視界内のモンスターのテレポートを阻害するバリアを張る。", "Obstructs all teleportations by monsters in your sight.");
\r
8545 power = plev * 3 / 2;
\r
8546 if (info) return info_power(power);
\r
8549 msg_print(_("テレポートを防ぐ呪いをかけた。", "You feel anyone can not teleport except you."));
\r
8553 /*** 3rd book (16-23) ***/
\r
8555 if (name) return _("衝撃のクローク", "Cloak of shock");
\r
8556 if (desc) return _("電気のオーラを身にまとい、動きが速くなる。", "Gives lightning aura and a bonus to speed.");
\r
8559 msg_print(_("体が稲妻のオーラで覆われた。", "You have enveloped by electrical aura!"));
\r
8563 msg_print(_("稲妻のオーラが消え去った。", "Electrical aura disappeared."));
\r
8568 if (name) return _("致命傷の治癒", "Cure critical wounds");
\r
8569 if (desc) return _("体力や傷を回復させる。", "Heals cut and HP greatry.");
\r
8570 if (info) return info_heal(4, 10, 0);
\r
8573 msg_print(_("気分が良くなってくる。", "You feel better and better."));
\r
8577 hp_player(damroll(4, 10));
\r
8585 if (name) return _("呪力封入", "Recharging");
\r
8586 if (desc) return _("魔法の道具に魔力を再充填する。", "Recharges a magic device.");
\r
8588 if (info) return info_power(power);
\r
8591 if (!recharge(power)) return NULL;
\r
8597 if (name) return _("死者復活", "Animate Dead");
\r
8598 if (desc) return _("死体を蘇らせてペットにする。", "Raises corpses and skeletons from dead.");
\r
8601 msg_print(_("死者への呼びかけを始めた。", "You start to call deads.!"));
\r
8605 animate_dead(0, p_ptr->y, p_ptr->x);
\r
8610 if (name) return _("防具呪縛", "Curse armor");
\r
8611 if (desc) return _("装備している防具に呪いをかける。", "Curse a piece of armour that you wielding.");
\r
8616 char o_name[MAX_NLEN];
\r
8617 object_type *o_ptr;
\r
8618 u32b f[TR_FLAG_SIZE];
\r
8620 item_tester_hook = object_is_armour;
\r
8621 q = _("どれを呪いますか?", "Which piece of armour do you curse?");
\r
8622 s = _("防具を装備していない。", "You wield no piece of armours.");
\r
8624 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
\r
8626 o_ptr = &inventory[item];
\r
8627 object_desc(o_name, o_ptr, OD_NAME_ONLY);
\r
8628 object_flags(o_ptr, f);
\r
8630 if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
\r
8632 if (!one_in_(3) &&
\r
8633 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
\r
8635 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
\r
8638 if (o_ptr->to_d > 0)
\r
8640 o_ptr->to_d -= randint1(3) % 2;
\r
8641 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
\r
8643 if (o_ptr->to_h > 0)
\r
8645 o_ptr->to_h -= randint1(3) % 2;
\r
8646 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
\r
8648 if (o_ptr->to_a > 0)
\r
8650 o_ptr->to_a -= randint1(3) % 2;
\r
8651 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
\r
8653 msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
\r
8658 int curse_rank = 0;
\r
8659 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
\r
8660 o_ptr->curse_flags |= (TRC_CURSED);
\r
8662 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
\r
8665 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
\r
8668 o_ptr->curse_flags |= (TRC_TY_CURSE);
\r
8669 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
\r
8671 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
\r
8672 add_flag(o_ptr->art_flags, TR_RES_POIS);
\r
8673 add_flag(o_ptr->art_flags, TR_RES_DARK);
\r
8674 add_flag(o_ptr->art_flags, TR_RES_NETHER);
\r
8675 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
\r
8680 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);
\r
8683 p_ptr->update |= (PU_BONUS);
\r
8689 if (name) return _("影のクローク", "Cloak of shadow");
\r
8690 if (desc) return _("影のオーラを身にまとい、敵に影のダメージを与える。", "Gives aura of shadow.");
\r
8693 object_type *o_ptr = &inventory[INVEN_OUTER];
\r
8695 if (!o_ptr->k_idx)
\r
8697 msg_print(_("クロークを身につけていない!", "You don't ware any cloak."));
\r
8700 else if (!object_is_cursed(o_ptr))
\r
8702 msg_print(_("クロークは呪われていない!", "Your cloak is not cursed."));
\r
8707 msg_print(_("影のオーラを身にまとった。", "You have enveloped by shadow aura!"));
\r
8712 object_type *o_ptr = &inventory[INVEN_OUTER];
\r
8714 if ((!o_ptr->k_idx) || (!object_is_cursed(o_ptr)))
\r
8716 do_spell(REALM_HEX, spell, SPELL_STOP);
\r
8717 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << spell);
\r
8718 CASTING_HEX_NUM(p_ptr)--;
\r
8719 if (!SINGING_SONG_ID(p_ptr)) set_action(ACTION_NONE);
\r
8724 msg_print(_("影のオーラが消え去った。", "Shadow aura disappeared."));
\r
8729 if (name) return _("苦痛を魔力に", "Pains to mana");
\r
8730 if (desc) return _("視界内のモンスターに精神ダメージ与え、魔力を吸い取る。", "Deals psychic damages to all monsters in sight, and drains some mana.");
\r
8731 power = plev * 3 / 2;
\r
8732 if (info) return info_damage(1, power, 0);
\r
8735 project_hack(GF_PSI_DRAIN, randint1(power));
\r
8740 if (name) return _("目には目を", "Eye for an eye");
\r
8741 if (desc) return _("打撃や魔法で受けたダメージを、攻撃元のモンスターにも与える。", "Returns same damage which you got to the monster which damaged you.");
\r
8744 msg_print(_("復讐したい欲望にかられた。", "You wish strongly you want to revenge anything."));
\r
8748 /*** 4th book (24-31) ***/
\r
8750 if (name) return _("反増殖結界", "Anti multiply barrier");
\r
8751 if (desc) return _("その階の増殖するモンスターの増殖を阻止する。", "Obstructs all multiplying by monsters in entire floor.");
\r
8754 msg_print(_("増殖を阻止する呪いをかけた。", "You feel anyone can not already multiply."));
\r
8759 if (name) return _("全復活", "Restoration");
\r
8760 if (desc) return _("経験値を徐々に復活し、減少した能力値を回復させる。", "Restores experience and status.");
\r
8763 msg_print(_("体が元の活力を取り戻し始めた。", "You feel your lost status starting to return."));
\r
8767 bool flag = FALSE;
\r
8768 int d = (p_ptr->max_exp - p_ptr->exp);
\r
8769 int r = (p_ptr->exp / 20);
\r
8775 p_ptr->exp = p_ptr->max_exp;
\r
8779 /* Check the experience */
\r
8780 check_experience();
\r
8784 for (i = A_STR; i < 6; i ++)
\r
8786 if (p_ptr->stat_cur[i] < p_ptr->stat_max[i])
\r
8788 if (p_ptr->stat_cur[i] < 18)
\r
8789 p_ptr->stat_cur[i]++;
\r
8791 p_ptr->stat_cur[i] += 10;
\r
8793 if (p_ptr->stat_cur[i] > p_ptr->stat_max[i])
\r
8794 p_ptr->stat_cur[i] = p_ptr->stat_max[i];
\r
8796 /* Recalculate bonuses */
\r
8797 p_ptr->update |= (PU_BONUS);
\r
8805 msg_format(_("%sの呪文の詠唱をやめた。", "Finish casting '%^s'."), do_spell(REALM_HEX, HEX_RESTORE, SPELL_NAME));
\r
8806 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_RESTORE);
\r
8807 if (cont) CASTING_HEX_NUM(p_ptr)--;
\r
8808 if (CASTING_HEX_NUM(p_ptr)) p_ptr->action = ACTION_NONE;
\r
8810 /* Redraw status */
\r
8811 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
\r
8812 p_ptr->redraw |= (PR_EXTRA);
\r
8820 if (name) return _("呪力吸収", "Drain curse power");
\r
8821 if (desc) return _("呪われた武器の呪いを吸収して魔力を回復する。", "Drains curse on your weapon and heals SP a little.");
\r
8826 u32b f[TR_FLAG_SIZE];
\r
8827 object_type *o_ptr;
\r
8829 item_tester_hook = item_tester_hook_cursed;
\r
8830 q = _("どの装備品から吸収しますか?", "Which cursed equipment do you drain mana from?");
\r
8831 s = _("呪われたアイテムを装備していない。", "You have no cursed equipment.");
\r
8833 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
\r
8835 o_ptr = &inventory[item];
\r
8836 object_flags(o_ptr, f);
\r
8838 p_ptr->csp += (p_ptr->lev / 5) + randint1(p_ptr->lev / 5);
\r
8839 if (have_flag(f, TR_TY_CURSE) || (o_ptr->curse_flags & TRC_TY_CURSE)) p_ptr->csp += randint1(5);
\r
8840 if (p_ptr->csp > p_ptr->msp) p_ptr->csp = p_ptr->msp;
\r
8842 if (o_ptr->curse_flags & TRC_PERMA_CURSE)
\r
8846 else if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
\r
8850 msg_print(_("呪いを全て吸い取った。", "Heavy curse vanished away."));
\r
8851 o_ptr->curse_flags = 0L;
\r
8854 else if ((o_ptr->curse_flags & (TRC_CURSED)) && one_in_(3))
\r
8856 msg_print(_("呪いを全て吸い取った。", "Curse vanished away."));
\r
8857 o_ptr->curse_flags = 0L;
\r
8865 if (name) return _("吸血の刃", "Swords to vampires");
\r
8866 if (desc) return _("吸血属性で攻撃する。", "Gives vampiric ability to your weapon.");
\r
8870 msg_print("あなたの武器が血を欲している。");
\r
8872 if (!empty_hands(FALSE))
\r
8873 msg_print("Your weapons want more blood now.");
\r
8875 msg_print("Your weapon wants more blood now.");
\r
8881 msg_print("武器の渇望が消え去った。");
\r
8883 msg_format("Thirsty of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
\r
8889 if (name) return _("朦朧の言葉", "Word of stun");
\r
8890 if (desc) return _("視界内のモンスターを朦朧とさせる。", "Stuns all monsters in your sight.");
\r
8892 if (info) return info_power(power);
\r
8895 stun_monsters(power);
\r
8900 if (name) return _("影移動", "Moving into shadow");
\r
8901 if (desc) return _("モンスターの隣のマスに瞬間移動する。", "Teleports you close to a monster.");
\r
8908 for (i = 0; i < 3; i++)
\r
8910 if (!tgt_pt(&x, &y)) return FALSE;
\r
8914 for (dir = 0; dir < 8; dir++)
\r
8916 int dy = y + ddy_ddd[dir];
\r
8917 int dx = x + ddx_ddd[dir];
\r
8918 if (dir == 5) continue;
\r
8919 if(cave[dy][dx].m_idx) flag = TRUE;
\r
8922 if (!cave_empty_bold(y, x) || (cave[y][x].info & CAVE_ICKY) ||
\r
8923 (distance(y, x, p_ptr->y, p_ptr->x) > plev + 2))
\r
8925 msg_print(_("そこには移動できない。", "Can not teleport to there."));
\r
8931 if (flag && randint0(plev * plev / 2))
\r
8933 teleport_player_to(y, x, 0L);
\r
8937 msg_print(_("おっと!", "Oops!"));
\r
8938 teleport_player(30, 0L);
\r
8946 if (name) return _("反魔法結界", "Anti magic barrier");
\r
8947 if (desc) return _("視界内のモンスターの魔法を阻害するバリアを張る。", "Obstructs all magic spell of monsters in your sight.");
\r
8948 power = plev * 3 / 2;
\r
8949 if (info) return info_power(power);
\r
8952 msg_print(_("魔法を防ぐ呪いをかけた。", "You feel anyone can not cast spells except you."));
\r
8957 if (name) return _("復讐の宣告", "Revenge sentence");
\r
8958 if (desc) return _("数ターン後にそれまで受けたダメージに応じた威力の地獄の劫火の弾を放つ。",
\r
8959 "Fires a ball of hell fire to try revenging after few turns.");
\r
8960 power = HEX_REVENGE_POWER(p_ptr);
\r
8961 if (info) return info_damage(0, 0, power);
\r
8965 int a = 3 - (p_ptr->pspeed - 100) / 10;
\r
8966 r = 1 + randint1(2) + MAX(0, MIN(3, a));
\r
8968 if (HEX_REVENGE_TURN(p_ptr) > 0)
\r
8970 msg_print(_("すでに復讐は宣告済みだ。", "You already pronounced your revenge."));
\r
8974 HEX_REVENGE_TYPE(p_ptr) = 2;
\r
8975 HEX_REVENGE_TURN(p_ptr) = r;
\r
8976 msg_format(_("あなたは復讐を宣告した。あと %d ターン。", "You pronounce your revenge. %d turns left."), r);
\r
8981 HEX_REVENGE_TURN(p_ptr)--;
\r
8983 if (HEX_REVENGE_TURN(p_ptr) <= 0)
\r
8993 msg_print(_("復讐の時だ!", "Time to revenge!"));
\r
8995 while (!get_aim_dir(&dir));
\r
8997 fire_ball(GF_HELL_FIRE, dir, power, 1);
\r
8999 if (p_ptr->wizard)
\r
9001 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
\r
9006 msg_print(_("復讐する気が失せた。", "You are not a mood to revenge."));
\r
9008 HEX_REVENGE_POWER(p_ptr) = 0;
\r
9014 /* start casting */
\r
9015 if ((cast) && (add))
\r
9018 CASTING_HEX_FLAGS(p_ptr) |= 1L << (spell);
\r
9019 CASTING_HEX_NUM(p_ptr)++;
\r
9021 if (p_ptr->action != ACTION_SPELL) set_action(ACTION_SPELL);
\r
9024 /* Redraw status */
\r
9027 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
\r
9028 p_ptr->redraw |= (PR_EXTRA | PR_HP | PR_MANA);
\r
9036 * @brief 魔法処理のメインルーチン
\r
9037 * @param realm 魔法領域のID
\r
9038 * @param spell 各領域の魔法ID
\r
9039 * @param mode 求める処理
\r
9040 * @return 各領域魔法に各種テキストを求めた場合は文字列参照ポインタ、そうでない場合はNULLポインタを返す。
\r
9042 cptr do_spell(REALM_IDX realm, SPELL_IDX spell, BIT_FLAGS mode)
\r
9046 case REALM_LIFE: return do_life_spell(spell, mode);
\r
9047 case REALM_SORCERY: return do_sorcery_spell(spell, mode);
\r
9048 case REALM_NATURE: return do_nature_spell(spell, mode);
\r
9049 case REALM_CHAOS: return do_chaos_spell(spell, mode);
\r
9050 case REALM_DEATH: return do_death_spell(spell, mode);
\r
9051 case REALM_TRUMP: return do_trump_spell(spell, mode);
\r
9052 case REALM_ARCANE: return do_arcane_spell(spell, mode);
\r
9053 case REALM_CRAFT: return do_craft_spell(spell, mode);
\r
9054 case REALM_DAEMON: return do_daemon_spell(spell, mode);
\r
9055 case REALM_CRUSADE: return do_crusade_spell(spell, mode);
\r
9056 case REALM_MUSIC: return do_music_spell(spell, mode);
\r
9057 case REALM_HISSATSU: return do_hissatsu_spell(spell, mode);
\r
9058 case REALM_HEX: return do_hex_spell(spell, mode);
\r