3 @brief 魔法のインターフェイスと発動 / Purpose: Do everything for each spell
\r
6 2013 Deskull rearranged comment for Doxygen.
\r
10 #include "selfinfo.h"
\r
11 #include "cmd-quaff.h"
\r
12 #include "spells-summon.h"
\r
13 #include "realm-arcane.h"
\r
14 #include "realm-chaos.h"
\r
15 #include "realm-life.h"
\r
16 #include "realm-sorcery.h"
\r
20 * 魔法の効果を「キャプション:ダイス+定数値」のフォーマットで出力する / Generate dice info string such as "foo 2d10"
\r
25 * @return フォーマットに従い整形された文字列
\r
27 cptr info_string_dice(cptr str, int dice, int sides, int base)
\r
31 return format("%s%d", str, base);
\r
35 return format("%s%dd%d", str, dice, sides);
\r
37 /* Dice plus base value */
\r
39 return format("%s%dd%d%+d", str, dice, sides, base);
\r
44 * @brief 魔法によるダメージを出力する / Generate damage-dice info string such as "dam 2d10"
\r
48 * @return フォーマットに従い整形された文字列
\r
50 cptr info_damage(int dice, int sides, int base)
\r
52 return info_string_dice(_("損傷:", "dam "), dice, sides, base);
\r
56 * @brief 魔法の効果時間を出力する / Generate duration info string such as "dur 20+1d20"
\r
59 * @return フォーマットに従い整形された文字列
\r
61 cptr info_duration(int base, int sides)
\r
63 return format(_("期間:%d+1d%d", "dur %d+1d%d"), base, sides);
\r
67 * @brief 魔法の効果範囲を出力する / Generate range info string such as "range 5"
\r
69 * @return フォーマットに従い整形された文字列
\r
71 cptr info_range(POSITION range)
\r
73 return format(_("範囲:%d", "range %d"), range);
\r
77 * @brief 魔法による回復量を出力する / Generate heal info string such as "heal 2d8"
\r
81 * @return フォーマットに従い整形された文字列
\r
83 cptr info_heal(int dice, int sides, int base)
\r
85 return info_string_dice(_("回復:", "heal "), dice, sides, base);
\r
89 * @brief 魔法効果発動までの遅延ターンを出力する / Generate delay info string such as "delay 15+1d15"
\r
92 * @return フォーマットに従い整形された文字列
\r
94 cptr info_delay(int base, int sides)
\r
96 return format(_("遅延:%d+1d%d", "delay %d+1d%d"), base, sides);
\r
101 * @brief 魔法によるダメージを出力する(固定値&複数回処理) / Generate multiple-damage info string such as "dam 25 each"
\r
103 * @return フォーマットに従い整形された文字列
\r
105 cptr info_multi_damage(HIT_POINT dam)
\r
107 return format(_("損傷:各%d", "dam %d each"), dam);
\r
112 * @brief 魔法によるダメージを出力する(ダイスのみ&複数回処理) / Generate multiple-damage-dice info string such as "dam 5d2 each"
\r
114 * @param sides ダイス目
\r
115 * @return フォーマットに従い整形された文字列
\r
117 cptr info_multi_damage_dice(int dice, int sides)
\r
119 return format(_("損傷:各%dd%d", "dam %dd%d each"), dice, sides);
\r
123 * @brief 魔法による一般的な効力値を出力する(固定値) / Generate power info string such as "power 100"
\r
125 * @return フォーマットに従い整形された文字列
\r
127 cptr info_power(int power)
\r
129 return format(_("効力:%d", "power %d"), power);
\r
134 * @brief 魔法による一般的な効力値を出力する(ダイス値) / Generate power info string such as "power 100"
\r
136 * @param sides ダイス目
\r
137 * @return フォーマットに従い整形された文字列
\r
140 * Generate power info string such as "power 1d100"
\r
142 cptr info_power_dice(int dice, int sides)
\r
144 return format(_("効力:%dd%d", "power %dd%d"), dice, sides);
\r
149 * @brief 魔法の効果半径を出力する / Generate radius info string such as "rad 100"
\r
151 * @return フォーマットに従い整形された文字列
\r
153 cptr info_radius(int rad)
\r
155 return format(_("半径:%d", "rad %d"), rad);
\r
160 * @brief 魔法効果の限界重量を出力する / Generate weight info string such as "max wgt 15"
\r
161 * @param weight 最大重量
\r
162 * @return フォーマットに従い整形された文字列
\r
164 cptr info_weight(int weight)
\r
167 return format("最大重量:%d.%dkg", lbtokg1(weight), lbtokg2(weight));
\r
169 return format("max wgt %d", weight/10);
\r
175 * @brief 歌の開始を処理する / Start singing if the player is a Bard
\r
176 * @param spell 領域魔法としてのID
\r
177 * @param song 魔法効果のID
\r
180 static void start_singing(SPELL_IDX spell, MAGIC_NUM1 song)
\r
182 /* Remember the song index */
\r
183 SINGING_SONG_EFFECT(p_ptr) = (MAGIC_NUM1)song;
\r
185 /* Remember the index of the spell which activated the song */
\r
186 SINGING_SONG_ID(p_ptr) = (MAGIC_NUM2)spell;
\r
189 /* Now the player is singing */
\r
190 set_action(ACTION_SING);
\r
193 /* Recalculate bonuses */
\r
194 p_ptr->update |= (PU_BONUS);
\r
196 /* Redraw status bar */
\r
197 p_ptr->redraw |= (PR_STATUS);
\r
201 * @brief 歌の停止を処理する / Stop singing if the player is a Bard
\r
204 void stop_singing(void)
\r
206 if (p_ptr->pclass != CLASS_BARD) return;
\r
208 /* Are there interupted song? */
\r
209 if (INTERUPTING_SONG_EFFECT(p_ptr))
\r
211 /* Forget interupted song */
\r
212 INTERUPTING_SONG_EFFECT(p_ptr) = MUSIC_NONE;
\r
216 /* The player is singing? */
\r
217 if (!SINGING_SONG_EFFECT(p_ptr)) return;
\r
219 /* Hack -- if called from set_action(), avoid recursive loop */
\r
220 if (p_ptr->action == ACTION_SING) set_action(ACTION_NONE);
\r
222 /* Message text of each song or etc. */
\r
223 do_spell(REALM_MUSIC, SINGING_SONG_ID(p_ptr), SPELL_STOP);
\r
225 SINGING_SONG_EFFECT(p_ptr) = MUSIC_NONE;
\r
226 SINGING_SONG_ID(p_ptr) = 0;
\r
228 /* Recalculate bonuses */
\r
229 p_ptr->update |= (PU_BONUS);
\r
231 /* Redraw status bar */
\r
232 p_ptr->redraw |= (PR_STATUS);
\r
240 * @brief 自然領域魔法の各処理を行う
\r
241 * @param spell 魔法ID
\r
242 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
243 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
245 static cptr do_nature_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
247 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
248 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
249 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
250 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
252 static const char s_dam[] = _("損傷:", "dam ");
\r
253 static const char s_rng[] = _("射程", "rng ");
\r
256 int plev = p_ptr->lev;
\r
261 if (name) return _("モンスター感知", "Detect Creatures");
\r
262 if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
\r
265 int rad = DETECT_RAD_DEFAULT;
\r
267 if (info) return info_radius(rad);
\r
271 detect_monsters_normal(rad);
\r
277 if (name) return _("稲妻", "Lightning");
\r
278 if (desc) return _("電撃の短いビームを放つ。", "Fires a short beam of lightning.");
\r
281 int dice = 3 + (plev - 1) / 5;
\r
283 POSITION range = plev / 6 + 2;
\r
285 if (info) return format("%s%dd%d %s%d", s_dam, dice, sides, s_rng, range);
\r
289 project_length = range;
\r
291 if (!get_aim_dir(&dir)) return NULL;
\r
293 fire_beam(GF_ELEC, dir, damroll(dice, sides));
\r
299 if (name) return _("罠と扉感知", "Detect Doors and Traps");
\r
300 if (desc) return _("近くの全ての罠と扉を感知する。", "Detects traps, doors, and stairs in your vicinity.");
\r
303 int rad = DETECT_RAD_DEFAULT;
\r
305 if (info) return info_radius(rad);
\r
309 detect_traps(rad, TRUE);
\r
311 detect_stairs(rad);
\r
317 if (name) return _("食糧生成", "Produce Food");
\r
318 if (desc) return _("食料を一つ作り出す。", "Produces a Ration of Food.");
\r
323 object_type forge, *q_ptr = &forge;
\r
324 msg_print(_("食料を生成した。", "A food ration is produced."));
\r
326 /* Create the food ration */
\r
327 object_prep(q_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION));
\r
329 /* Drop the object from heaven */
\r
330 drop_near(q_ptr, -1, p_ptr->y, p_ptr->x);
\r
336 if (name) return _("日の光", "Daylight");
\r
337 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
\r
341 int sides = plev / 2;
\r
342 int rad = (plev / 10) + 1;
\r
344 if (info) return info_damage(dice, sides, 0);
\r
348 lite_area(damroll(dice, sides), rad);
\r
350 if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)
\r
352 msg_print(_("日の光があなたの肉体を焦がした!", "The daylight scorches your flesh!"));
\r
353 take_hit(DAMAGE_NOESCAPE, damroll(2, 2), _("日の光", "daylight"), -1);
\r
360 if (name) return _("動物習し", "Animal Taming");
\r
361 if (desc) return _("動物1体を魅了する。抵抗されると無効。", "Attempts to charm an animal.");
\r
366 if (info) return info_power(power);
\r
370 if (!get_aim_dir(&dir)) return NULL;
\r
372 charm_animal(dir, power);
\r
378 if (name) return _("環境への耐性", "Resist Environment");
\r
379 if (desc) return _("一定時間、冷気、炎、電撃に対する耐性を得る。装備による耐性に累積する。",
\r
380 "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");
\r
385 if (info) return info_duration(base, base);
\r
389 set_oppose_cold(randint1(base) + base, FALSE);
\r
390 set_oppose_fire(randint1(base) + base, FALSE);
\r
391 set_oppose_elec(randint1(base) + base, FALSE);
\r
397 if (name) return _("傷と毒治療", "Cure Wounds & Poison");
\r
398 if (desc) return _("怪我を全快させ、毒を体から完全に取り除き、体力を少し回復させる。", "Heals all cut and poison status. Heals HP a little.");
\r
404 if (info) return info_heal(dice, sides, 0);
\r
408 hp_player(damroll(dice, sides));
\r
416 if (name) return _("岩石溶解", "Stone to Mud");
\r
417 if (desc) return _("壁を溶かして床にする。", "Turns one rock square to mud.");
\r
424 if (info) return info_damage(dice, sides, base);
\r
428 if (!get_aim_dir(&dir)) return NULL;
\r
430 wall_to_mud(dir, 20 + randint1(30));
\r
436 if (name) return _("アイス・ボルト", "Frost Bolt");
\r
437 if (desc) return _("冷気のボルトもしくはビームを放つ。", "Fires a bolt or beam of cold.");
\r
440 int dice = 3 + (plev - 5) / 4;
\r
443 if (info) return info_damage(dice, sides, 0);
\r
447 if (!get_aim_dir(&dir)) return NULL;
\r
448 fire_bolt_or_beam(beam_chance() - 10, GF_COLD, dir, damroll(dice, sides));
\r
454 if (name) return _("自然の覚醒", "Nature Awareness");
\r
455 if (desc) return _("周辺の地形を感知し、近くの罠、扉、階段、全てのモンスターを感知する。",
\r
456 "Maps nearby area. Detects all monsters, traps, doors and stairs.");
\r
459 int rad1 = DETECT_RAD_MAP;
\r
460 int rad2 = DETECT_RAD_DEFAULT;
\r
462 if (info) return info_radius(MAX(rad1, rad2));
\r
467 detect_traps(rad2, TRUE);
\r
468 detect_doors(rad2);
\r
469 detect_stairs(rad2);
\r
470 detect_monsters_normal(rad2);
\r
476 if (name) return _("ファイア・ボルト", "Fire Bolt");
\r
477 if (desc) return _("火炎のボルトもしくはビームを放つ。", "Fires a bolt or beam of fire.");
\r
480 int dice = 5 + (plev - 5) / 4;
\r
483 if (info) return info_damage(dice, sides, 0);
\r
487 if (!get_aim_dir(&dir)) return NULL;
\r
488 fire_bolt_or_beam(beam_chance() - 10, GF_FIRE, dir, damroll(dice, sides));
\r
494 if (name) return _("太陽光線", "Ray of Sunlight");
\r
495 if (desc) return _("光線を放つ。光りを嫌うモンスターに効果がある。", "Fires a beam of light which damages to light-sensitive monsters.");
\r
501 if (info) return info_damage(dice, sides, 0);
\r
505 if (!get_aim_dir(&dir)) return NULL;
\r
506 msg_print(_("太陽光線が現れた。", "A line of sunlight appears."));
\r
507 lite_line(dir, damroll(6, 8));
\r
513 if (name) return _("足かせ", "Entangle");
\r
514 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
\r
519 if (info) return info_power(power);
\r
523 slow_monsters(plev);
\r
529 if (name) return _("動物召喚", "Summon Animal");
\r
530 if (desc) return _("動物を1体召喚する。", "Summons an animal.");
\r
535 if (!(summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_ANIMAL_RANGER, (PM_ALLOW_GROUP | PM_FORCE_PET))))
\r
537 msg_print(_("動物は現れなかった。", "No animals arrive."));
\r
545 if (name) return _("薬草治療", "Herbal Healing");
\r
546 if (desc) return _("体力を大幅に回復させ、負傷、朦朧状態、毒から全快する。", "Heals HP greatly. And heals cut, stun and poison completely.");
\r
551 if (info) return info_heal(0, 0, heal);
\r
564 if (name) return _("階段生成", "Stair Building");
\r
565 if (desc) return _("自分のいる位置に階段を作る。", "Creates a stair which goes down or up.");
\r
576 if (name) return _("肌石化", "Stone Skin");
\r
577 if (desc) return _("一定時間、ACを上昇させる。", "Gives bonus to AC for a while.");
\r
583 if (info) return info_duration(base, sides);
\r
587 set_shield(randint1(sides) + base, FALSE);
\r
593 if (name) return _("真・耐性", "Resistance True");
\r
594 if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
\r
595 "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
600 if (info) return info_duration(base, base);
\r
604 set_oppose_acid(randint1(base) + base, FALSE);
\r
605 set_oppose_elec(randint1(base) + base, FALSE);
\r
606 set_oppose_fire(randint1(base) + base, FALSE);
\r
607 set_oppose_cold(randint1(base) + base, FALSE);
\r
608 set_oppose_pois(randint1(base) + base, FALSE);
\r
614 if (name) return _("森林創造", "Forest Creation");
\r
615 if (desc) return _("周囲に木を作り出す。", "Creates trees in all adjacent squares.");
\r
626 if (name) return _("動物友和", "Animal Friendship");
\r
627 if (desc) return _("視界内の全ての動物を魅了する。抵抗されると無効。", "Attempts to charm all animals in sight.");
\r
630 int power = plev * 2;
\r
632 if (info) return info_power(power);
\r
636 charm_animals(power);
\r
642 if (name) return _("試金石", "Stone Tell");
\r
643 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
\r
648 if (!identify_fully(FALSE)) return NULL;
\r
654 if (name) return _("石の壁", "Wall of Stone");
\r
655 if (desc) return _("自分の周囲に花崗岩の壁を作る。", "Creates granite walls in all adjacent squares.");
\r
666 if (name) return _("腐食防止", "Protect from Corrosion");
\r
667 if (desc) return _("アイテムを酸で傷つかないよう加工する。", "Makes an equipment acid-proof.");
\r
672 if (!rustproof()) return NULL;
\r
678 if (name) return _("地震", "Earthquake");
\r
679 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
\r
680 "Shakes dungeon structure, and results in random swapping of floors and walls.");
\r
685 if (info) return info_radius(rad);
\r
689 earthquake(p_ptr->y, p_ptr->x, rad);
\r
695 if (name) return _("カマイタチ", "Cyclone");
\r
696 if (desc) return _("全方向に向かって攻撃する。", "Attacks all adjacent monsters.");
\r
703 monster_type *m_ptr;
\r
705 for (dir = 0; dir < 8; dir++)
\r
707 y = p_ptr->y + ddy_ddd[dir];
\r
708 x = p_ptr->x + ddx_ddd[dir];
\r
709 c_ptr = &cave[y][x];
\r
711 /* Get the monster */
\r
712 m_ptr = &m_list[c_ptr->m_idx];
\r
714 /* Hack -- attack monsters */
\r
715 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
\r
716 py_attack(y, x, 0);
\r
723 if (name) return _("ブリザード", "Blizzard");
\r
724 if (desc) return _("巨大な冷気の球を放つ。", "Fires a huge ball of cold.");
\r
727 HIT_POINT dam = 70 + plev * 3 / 2;
\r
728 int rad = plev / 12 + 1;
\r
730 if (info) return info_damage(0, 0, dam);
\r
734 if (!get_aim_dir(&dir)) return NULL;
\r
736 fire_ball(GF_COLD, dir, dam, rad);
\r
742 if (name) return _("稲妻嵐", "Lightning Storm");
\r
743 if (desc) return _("巨大な電撃の球を放つ。", "Fires a huge electric ball.");
\r
746 HIT_POINT dam = 90 + plev * 3 / 2;
\r
747 int rad = plev / 12 + 1;
\r
749 if (info) return info_damage(0, 0, dam);
\r
753 if (!get_aim_dir(&dir)) return NULL;
\r
754 fire_ball(GF_ELEC, dir, dam, rad);
\r
761 if (name) return _("渦潮", "Whirlpool");
\r
762 if (desc) return _("巨大な水の球を放つ。", "Fires a huge ball of water.");
\r
765 HIT_POINT dam = 100 + plev * 3 / 2;
\r
766 int rad = plev / 12 + 1;
\r
768 if (info) return info_damage(0, 0, dam);
\r
772 if (!get_aim_dir(&dir)) return NULL;
\r
773 fire_ball(GF_WATER, dir, dam, rad);
\r
779 if (name) return _("陽光召喚", "Call Sunlight");
\r
780 if (desc) return _("自分を中心とした光の球を発生させる。さらに、その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。",
\r
781 "Generates ball of light centered on you. Maps and lights whole dungeon level. Knows all objects location.");
\r
784 HIT_POINT dam = 150;
\r
787 if (info) return info_damage(0, 0, dam/2);
\r
791 fire_ball(GF_LITE, 0, dam, rad);
\r
792 chg_virtue(V_KNOWLEDGE, 1);
\r
793 chg_virtue(V_ENLIGHTEN, 1);
\r
796 if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)
\r
798 msg_print(_("日光があなたの肉体を焦がした!", "The sunlight scorches your flesh!"));
\r
799 take_hit(DAMAGE_NOESCAPE, 50, _("日光", "sunlight"), -1);
\r
806 if (name) return _("精霊の刃", "Elemental Branding");
\r
807 if (desc) return _("武器に炎か冷気の属性をつける。", "Makes current weapon fire or frost branded.");
\r
812 brand_weapon(randint0(2));
\r
818 if (name) return _("自然の脅威", "Nature's Wrath");
\r
819 if (desc) return _("近くの全てのモンスターにダメージを与え、地震を起こし、自分を中心とした分解の球を発生させる。",
\r
820 "Damages all monsters in sight. Makes quake. Generates disintegration ball centered on you.");
\r
823 int d_dam = 4 * plev;
\r
824 int b_dam = (100 + plev) * 2;
\r
825 int b_rad = 1 + plev / 12;
\r
826 int q_rad = 20 + plev / 2;
\r
828 if (info) return format("%s%d+%d", s_dam, d_dam, b_dam/2);
\r
832 dispel_monsters(d_dam);
\r
833 earthquake(p_ptr->y, p_ptr->x, q_rad);
\r
834 project(0, b_rad, p_ptr->y, p_ptr->x, b_dam, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM, -1);
\r
846 * @brief 暗黒領域魔法の各処理を行う
\r
847 * @param spell 魔法ID
\r
848 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
849 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
851 static cptr do_death_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
853 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
854 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
855 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
856 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
858 static const char s_dam[] = _("損傷:", "dam ");
\r
859 static const char s_random[] = _("ランダム", "random");
\r
862 int plev = p_ptr->lev;
\r
867 if (name) return _("無生命感知", "Detect Unlife");
\r
868 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
\r
871 int rad = DETECT_RAD_DEFAULT;
\r
873 if (info) return info_radius(rad);
\r
877 detect_monsters_nonliving(rad);
\r
883 if (name) return _("呪殺弾", "Malediction");
\r
884 if (desc) return _("ごく小さな邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",
\r
885 "Fires a tiny ball of evil power which hurts good monsters greatly.");
\r
888 int dice = 3 + (plev - 1) / 5;
\r
892 if (info) return info_damage(dice, sides, 0);
\r
896 if (!get_aim_dir(&dir)) return NULL;
\r
899 * A radius-0 ball may (1) be aimed at
\r
900 * objects etc., and will affect them;
\r
901 * (2) may be aimed at ANY visible
\r
902 * monster, unlike a 'bolt' which must
\r
903 * travel to the monster.
\r
906 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides), rad);
\r
910 /* Special effect first */
\r
911 int effect = randint1(1000);
\r
914 fire_ball_hide(GF_DEATH_RAY, dir, plev * 200, 0);
\r
915 else if (effect < 500)
\r
916 fire_ball_hide(GF_TURN_ALL, dir, plev, 0);
\r
917 else if (effect < 800)
\r
918 fire_ball_hide(GF_OLD_CONF, dir, plev, 0);
\r
920 fire_ball_hide(GF_STUN, dir, plev, 0);
\r
927 if (name) return _("邪悪感知", "Detect Evil");
\r
928 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
\r
931 int rad = DETECT_RAD_DEFAULT;
\r
933 if (info) return info_radius(rad);
\r
937 detect_monsters_evil(rad);
\r
943 if (name) return _("悪臭雲", "Stinking Cloud");
\r
944 if (desc) return _("毒の球を放つ。", "Fires a ball of poison.");
\r
947 HIT_POINT dam = 10 + plev / 2;
\r
950 if (info) return info_damage(0, 0, dam);
\r
954 if (!get_aim_dir(&dir)) return NULL;
\r
956 fire_ball(GF_POIS, dir, dam, rad);
\r
962 if (name) return _("黒い眠り", "Black Sleep");
\r
963 if (desc) return _("1体のモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep a monster.");
\r
968 if (info) return info_power(power);
\r
972 if (!get_aim_dir(&dir)) return NULL;
\r
974 sleep_monster(dir, plev);
\r
980 if (name) return _("耐毒", "Resist Poison");
\r
981 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",
\r
982 "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");
\r
987 if (info) return info_duration(base, base);
\r
991 set_oppose_pois(randint1(base) + base, FALSE);
\r
997 if (name) return _("恐慌", "Horrify");
\r
998 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
\r
1003 if (info) return info_power(power);
\r
1007 if (!get_aim_dir(&dir)) return NULL;
\r
1009 fear_monster(dir, power);
\r
1010 stun_monster(dir, power);
\r
1016 if (name) return _("アンデッド従属", "Enslave Undead");
\r
1017 if (desc) return _("アンデッド1体を魅了する。抵抗されると無効。", "Attempts to charm an undead monster.");
\r
1022 if (info) return info_power(power);
\r
1026 if (!get_aim_dir(&dir)) return NULL;
\r
1028 control_one_undead(dir, power);
\r
1034 if (name) return _("エントロピーの球", "Orb of Entropy");
\r
1035 if (desc) return _("生命のある者のHPと最大HP双方にダメージを与える効果のある球を放つ。", "Fires a ball which damages to both HP and MaxHP of living monsters.");
\r
1040 int rad = (plev < 30) ? 2 : 3;
\r
1043 if (p_ptr->pclass == CLASS_MAGE ||
\r
1044 p_ptr->pclass == CLASS_HIGH_MAGE ||
\r
1045 p_ptr->pclass == CLASS_SORCERER)
\r
1046 base = plev + plev / 2;
\r
1048 base = plev + plev / 4;
\r
1051 if (info) return info_damage(dice, sides, base);
\r
1055 if (!get_aim_dir(&dir)) return NULL;
\r
1057 fire_ball(GF_HYPODYNAMIA, dir, damroll(dice, sides) + base, rad);
\r
1063 if (name) return _("地獄の矢", "Nether Bolt");
\r
1064 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
\r
1067 int dice = 8 + (plev - 5) / 4;
\r
1070 if (info) return info_damage(dice, sides, 0);
\r
1074 if (!get_aim_dir(&dir)) return NULL;
\r
1076 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
\r
1082 if (name) return _("殺戮雲", "Cloud kill");
\r
1083 if (desc) return _("自分を中心とした毒の球を発生させる。", "Generate a ball of poison centered on you.");
\r
1086 HIT_POINT dam = (30 + plev) * 2;
\r
1087 int rad = plev / 10 + 2;
\r
1089 if (info) return info_damage(0, 0, dam/2);
\r
1093 project(0, rad, p_ptr->y, p_ptr->x, dam, GF_POIS, PROJECT_KILL | PROJECT_ITEM, -1);
\r
1099 if (name) return _("モンスター消滅", "Genocide One");
\r
1100 if (desc) return _("モンスター1体を消し去る。経験値やアイテムは手に入らない。抵抗されると無効。", "Attempts to vanish a monster.");
\r
1103 int power = plev + 50;
\r
1105 if (info) return info_power(power);
\r
1109 if (!get_aim_dir(&dir)) return NULL;
\r
1111 fire_ball_hide(GF_GENOCIDE, dir, power, 0);
\r
1117 if (name) return _("毒の刃", "Poison Branding");
\r
1118 if (desc) return _("武器に毒の属性をつける。", "Makes current weapon poison branded.");
\r
1129 if (name) return _("吸血の矢", "Vampiric Bolt");
\r
1130 if (desc) return _("ボルトによりモンスター1体から生命力を吸いとる。吸いとった生命力によって満腹度が上がる。",
\r
1131 "Absorbs some HP from a monster and gives them to you by bolt. You will also gain nutritional sustenance from this.");
\r
1135 int sides = plev * 2;
\r
1136 int base = plev * 2;
\r
1138 if (info) return info_damage(dice, sides, base);
\r
1142 HIT_POINT dam = base + damroll(dice, sides);
\r
1144 if (!get_aim_dir(&dir)) return NULL;
\r
1146 if (hypodynamic_bolt(dir, dam))
\r
1148 chg_virtue(V_SACRIFICE, -1);
\r
1149 chg_virtue(V_VITALITY, -1);
\r
1154 * Gain nutritional sustenance:
\r
1157 * A Food ration gives 5000
\r
1158 * food points (by contrast)
\r
1159 * Don't ever get more than
\r
1160 * "Full" this way But if we
\r
1161 * ARE Gorged, it won't cure
\r
1164 dam = p_ptr->food + MIN(5000, 100 * dam);
\r
1166 /* Not gorged already */
\r
1167 if (p_ptr->food < PY_FOOD_MAX)
\r
1168 set_food(dam >= PY_FOOD_MAX ? PY_FOOD_MAX - 1 : dam);
\r
1175 if (name) return _("反魂の術", "Animate dead");
\r
1176 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
\r
1181 animate_dead(0, p_ptr->y, p_ptr->x);
\r
1187 if (name) return _("抹殺", "Genocide");
\r
1188 if (desc) return _("指定した文字のモンスターを現在の階から消し去る。抵抗されると無効。",
\r
1189 "Eliminates an entire class of monster, exhausting you. Powerful or unique monsters may resist.");
\r
1192 int power = plev+50;
\r
1194 if (info) return info_power(power);
\r
1198 symbol_genocide(power, TRUE);
\r
1204 if (name) return _("狂戦士化", "Berserk");
\r
1205 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");
\r
1210 if (info) return info_duration(base, base);
\r
1214 set_shero(randint1(base) + base, FALSE);
\r
1222 if (name) return _("悪霊召喚", "Invoke Spirits");
\r
1223 if (desc) return _("ランダムで様々な効果が起こる。", "Causes random effects.");
\r
1226 if (info) return s_random;
\r
1230 if (!get_aim_dir(&dir)) return NULL;
\r
1232 cast_invoke_spirits(dir);
\r
1238 if (name) return _("暗黒の矢", "Dark Bolt");
\r
1239 if (desc) return _("暗黒のボルトもしくはビームを放つ。", "Fires a bolt or beam of darkness.");
\r
1242 int dice = 4 + (plev - 5) / 4;
\r
1245 if (info) return info_damage(dice, sides, 0);
\r
1249 if (!get_aim_dir(&dir)) return NULL;
\r
1251 fire_bolt_or_beam(beam_chance(), GF_DARK, dir, damroll(dice, sides));
\r
1257 if (name) return _("狂乱戦士", "Battle Frenzy");
\r
1258 if (desc) return _("狂戦士化し、恐怖を除去し、加速する。",
\r
1259 "Gives another bonus to hit and HP, immunity to fear for a while. Hastes you. But decreases AC.");
\r
1263 int sp_base = plev / 2;
\r
1264 int sp_sides = 20 + plev / 2;
\r
1266 if (info) return info_duration(b_base, b_base);
\r
1270 set_shero(randint1(25) + 25, FALSE);
\r
1273 set_fast(randint1(sp_sides) + sp_base, FALSE);
\r
1279 if (name) return _("吸血の刃", "Vampiric Branding");
\r
1280 if (desc) return _("武器に吸血の属性をつける。", "Makes current weapon Vampiric.");
\r
1291 if (name) return _("吸血の連矢", "Vampiric Bolts");
\r
1292 if (desc) return _("3連射のボルトによりモンスター1体から生命力を吸いとる。吸いとった生命力によって体力が回復する。",
\r
1293 "Fires 3 bolts. Each of the bolts absorbs some HP from a monster and gives them to you.");
\r
1295 HIT_POINT dam = 100;
\r
1297 if (info) return format("%s3*%d", s_dam, dam);
\r
1303 if (!get_aim_dir(&dir)) return NULL;
\r
1305 chg_virtue(V_SACRIFICE, -1);
\r
1306 chg_virtue(V_VITALITY, -1);
\r
1308 for (i = 0; i < 3; i++)
\r
1310 if (hypodynamic_bolt(dir, dam))
\r
1318 if (name) return _("死の言魂", "Nether Wave");
\r
1319 if (desc) return _("視界内の生命のあるモンスターにダメージを与える。", "Damages all living monsters in sight.");
\r
1322 int sides = plev * 3;
\r
1324 if (info) return info_damage(1, sides, 0);
\r
1328 dispel_living(randint1(sides));
\r
1334 if (name) return _("暗黒の嵐", "Darkness Storm");
\r
1335 if (desc) return _("巨大な暗黒の球を放つ。", "Fires a huge ball of darkness.");
\r
1338 HIT_POINT dam = 100 + plev * 2;
\r
1341 if (info) return info_damage(0, 0, dam);
\r
1345 if (!get_aim_dir(&dir)) return NULL;
\r
1347 fire_ball(GF_DARK, dir, dam, rad);
\r
1353 if (name) return _("死の光線", "Death Ray");
\r
1354 if (desc) return _("死の光線を放つ。", "Fires a beam of death.");
\r
1359 if (!get_aim_dir(&dir)) return NULL;
\r
1361 death_ray(dir, plev);
\r
1367 if (name) return _("死者召喚", "Raise the Dead");
\r
1368 if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");
\r
1374 bool pet = one_in_(3);
\r
1377 type = (plev > 47 ? SUMMON_HI_UNDEAD : SUMMON_UNDEAD);
\r
1379 if (!pet || (pet && (plev > 24) && one_in_(3)))
\r
1380 flg |= PM_ALLOW_GROUP;
\r
1382 if (pet) flg |= PM_FORCE_PET;
\r
1383 else flg |= (PM_ALLOW_UNIQUE | PM_NO_PET);
\r
1385 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, type, flg))
\r
1387 msg_print(_("冷たい風があなたの周りに吹き始めた。それは腐敗臭を運んでいる...",
\r
1388 "Cold winds begin to blow around you, carrying with them the stench of decay..."));
\r
1393 msg_print(_("古えの死せる者共があなたに仕えるため土から甦った!",
\r
1394 "Ancient, long-dead forms arise from the ground to serve you!"));
\r
1398 msg_print(_("死者が甦った。眠りを妨げるあなたを罰するために!",
\r
1399 "'The dead arise... to punish you for disturbing them!'"));
\r
1402 chg_virtue(V_UNLIFE, 1);
\r
1409 if (name) return _("死者の秘伝", "Esoteria");
\r
1410 if (desc) return _("アイテムを1つ識別する。レベルが高いとアイテムの能力を完全に知ることができる。",
\r
1411 "Identifies an item. Or *identifies* an item at higher level.");
\r
1416 if (randint1(50) > plev)
\r
1418 if (!ident_spell(FALSE)) return NULL;
\r
1422 if (!identify_fully(FALSE)) return NULL;
\r
1429 if (name) return _("吸血鬼変化", "Polymorph Vampire");
\r
1430 if (desc) return _("一定時間、吸血鬼に変化する。変化している間は本来の種族の能力を失い、代わりに吸血鬼としての能力を得る。",
\r
1431 "Mimic a vampire for a while. Loses abilities of original race and gets abilities as a vampire.");
\r
1434 int base = 10 + plev / 2;
\r
1436 if (info) return info_duration(base, base);
\r
1440 set_mimic(base + randint1(base), MIMIC_VAMPIRE, FALSE);
\r
1446 if (name) return _("経験値復活", "Restore Life");
\r
1447 if (desc) return _("失った経験値を回復する。", "Restore lost experience.");
\r
1458 if (name) return _("周辺抹殺", "Mass Genocide");
\r
1459 if (desc) return _("自分の周囲にいるモンスターを現在の階から消し去る。抵抗されると無効。",
\r
1460 "Eliminates all nearby monsters, exhausting you. Powerful or unique monsters may be able to resist.");
\r
1463 int power = plev + 50;
\r
1465 if (info) return info_power(power);
\r
1469 mass_genocide(power, TRUE);
\r
1475 if (name) return _("地獄の劫火", "Hellfire");
\r
1476 if (desc) return _("邪悪な力を持つ宝珠を放つ。善良なモンスターには大きなダメージを与える。",
\r
1477 "Fires a powerful ball of evil power. Hurts good monsters greatly.");
\r
1480 HIT_POINT dam = 666;
\r
1483 if (info) return info_damage(0, 0, dam);
\r
1487 if (!get_aim_dir(&dir)) return NULL;
\r
1489 fire_ball(GF_HELL_FIRE, dir, dam, rad);
\r
1490 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("地獄の劫火の呪文を唱えた疲労", "the strain of casting Hellfire"), -1);
\r
1496 if (name) return _("幽体化", "Wraithform");
\r
1497 if (desc) return _("一定時間、壁を通り抜けることができ受けるダメージが軽減される幽体の状態に変身する。",
\r
1498 "Becomes wraith form which gives ability to pass walls and makes all damages half.");
\r
1501 int base = plev / 2;
\r
1503 if (info) return info_duration(base, base);
\r
1507 set_wraith_form(randint1(base) + base, FALSE);
\r
1518 * @brief トランプ領域魔法の各処理を行う
\r
1519 * @param spell 魔法ID
\r
1520 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
1521 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
1523 static cptr do_trump_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
1525 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
1526 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
1527 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
1528 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
1529 bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
\r
1530 static const char s_random[] = _("ランダム", "random");
\r
1533 int plev = p_ptr->lev;
\r
1538 if (name) return _("ショート・テレポート", "Phase Door");
\r
1539 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");
\r
1542 POSITION range = 10;
\r
1544 if (info) return info_range(range);
\r
1548 teleport_player(range, 0L);
\r
1554 if (name) return _("蜘蛛のカード", "Trump Spiders");
\r
1555 if (desc) return _("蜘蛛を召喚する。", "Summons spiders.");
\r
1560 msg_print(_("あなたは蜘蛛のカードに集中する...", "You concentrate on the trump of an spider..."));
\r
1561 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_SPIDER, PM_ALLOW_GROUP))
\r
1565 msg_print(_("召喚された蜘蛛は怒っている!", "The summoned spiders get angry!"));
\r
1573 if (name) return _("シャッフル", "Shuffle");
\r
1574 if (desc) return _("カードの占いをする。", "Causes random effects.");
\r
1577 if (info) return s_random;
\r
1587 if (name) return _("フロア・リセット", "Reset Recall");
\r
1588 if (desc) return _("最深階を変更する。", "Resets the 'deepest' level for recall spell.");
\r
1593 if (!reset_recall()) return NULL;
\r
1599 if (name) return _("テレポート", "Teleport");
\r
1600 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
\r
1603 POSITION range = plev * 4;
\r
1605 if (info) return info_range(range);
\r
1609 teleport_player(range, 0L);
\r
1615 if (name) return _("感知のカード", "Trump Spying");
\r
1616 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
\r
1622 if (info) return info_duration(base, sides);
\r
1626 set_tim_esp(randint1(sides) + base, FALSE);
\r
1632 if (name) return _("テレポート・モンスター", "Teleport Away");
\r
1633 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
\r
1638 if (info) return info_power(power);
\r
1642 if (!get_aim_dir(&dir)) return NULL;
\r
1644 fire_beam(GF_AWAY_ALL, dir, power);
\r
1650 if (name) return _("動物のカード", "Trump Animals");
\r
1651 if (desc) return _("1体の動物を召喚する。", "Summons an animal.");
\r
1656 int type = (!fail ? SUMMON_ANIMAL_RANGER : SUMMON_ANIMAL);
\r
1657 msg_print(_("あなたは動物のカードに集中する...", "You concentrate on the trump of an animal..."));
\r
1658 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, type, 0L))
\r
1662 msg_print(_("召喚された動物は怒っている!", "The summoned animal gets angry!"));
\r
1670 if (name) return _("移動のカード", "Trump Reach");
\r
1671 if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");
\r
1674 int weight = plev * 15;
\r
1676 if (info) return info_weight(weight);
\r
1680 if (!get_aim_dir(&dir)) return NULL;
\r
1682 fetch(dir, weight, FALSE);
\r
1688 if (name) return _("カミカゼのカード", "Trump Kamikaze");
\r
1689 if (desc) return _("複数の爆発するモンスターを召喚する。", "Summons monsters which explode by itself.");
\r
1699 if (!target_set(TARGET_KILL)) return NULL;
\r
1705 /* Summons near player when failed */
\r
1710 if (p_ptr->pclass == CLASS_BEASTMASTER)
\r
1711 type = SUMMON_KAMIKAZE_LIVING;
\r
1713 type = SUMMON_KAMIKAZE;
\r
1715 msg_print(_("あなたはカミカゼのカードに集中する...", "You concentrate on several trumps at once..."));
\r
1716 if (trump_summoning(2 + randint0(plev / 7), !fail, y, x, 0, type, 0L))
\r
1720 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
\r
1728 if (name) return _("幻霊召喚", "Phantasmal Servant");
\r
1729 if (desc) return _("1体の幽霊を召喚する。", "Summons a ghost.");
\r
1732 /* Phantasmal Servant is not summoned as enemy when failed */
\r
1735 int summon_lev = plev * 2 / 3 + randint1(plev / 2);
\r
1737 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, (summon_lev * 3 / 2), SUMMON_PHANTOM, 0L))
\r
1739 msg_print(_("御用でございますか、御主人様?", "'Your wish, master?'"));
\r
1746 if (name) return _("スピード・モンスター", "Haste Monster");
\r
1747 if (desc) return _("モンスター1体を加速させる。", "Hastes a monster.");
\r
1754 /* Temporary enable target_pet option */
\r
1755 bool old_target_pet = target_pet;
\r
1756 target_pet = TRUE;
\r
1758 result = get_aim_dir(&dir);
\r
1760 /* Restore target_pet option */
\r
1761 target_pet = old_target_pet;
\r
1763 if (!result) return NULL;
\r
1765 speed_monster(dir, plev);
\r
1771 if (name) return _("テレポート・レベル", "Teleport Level");
\r
1772 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");
\r
1777 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
\r
1778 teleport_level(0);
\r
1784 if (name) return _("次元の扉", "Dimension Door");
\r
1785 if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleport to given location.");
\r
1788 POSITION range = plev / 2 + 10;
\r
1790 if (info) return info_range(range);
\r
1794 msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));
\r
1795 if (!dimension_door()) return NULL;
\r
1801 if (name) return _("帰還の呪文", "Word of Recall");
\r
1802 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
\r
1803 "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
\r
1809 if (info) return info_delay(base, sides);
\r
1813 if (!word_of_recall()) return NULL;
\r
1819 if (name) return _("怪物追放", "Banish");
\r
1820 if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");
\r
1823 int power = plev * 4;
\r
1825 if (info) return info_power(power);
\r
1829 banish_monsters(power);
\r
1835 if (name) return _("位置交換のカード", "Swap Position");
\r
1836 if (desc) return _("1体のモンスターと位置を交換する。", "Swap positions of you and a monster.");
\r
1843 /* HACK -- No range limit */
\r
1844 project_length = -1;
\r
1846 result = get_aim_dir(&dir);
\r
1848 /* Restore range to default */
\r
1849 project_length = 0;
\r
1851 if (!result) return NULL;
\r
1853 teleport_swap(dir);
\r
1859 if (name) return _("アンデッドのカード", "Trump Undead");
\r
1860 if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");
\r
1865 msg_print(_("あなたはアンデッドのカードに集中する...", "You concentrate on the trump of an undead creature..."));
\r
1866 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_UNDEAD, 0L))
\r
1870 msg_print(_("召喚されたアンデッドは怒っている!", "The summoned undead creature gets angry!"));
\r
1878 if (name) return _("爬虫類のカード", "Trump Reptiles");
\r
1879 if (desc) return _("1体のヒドラを召喚する。", "Summons a hydra.");
\r
1884 msg_print(_("あなたは爬虫類のカードに集中する...", "You concentrate on the trump of a reptile..."));
\r
1885 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HYDRA, 0L))
\r
1889 msg_print(_("召喚された爬虫類は怒っている!", "The summoned reptile gets angry!"));
\r
1897 if (name) return _("モンスターのカード", "Trump Monsters");
\r
1898 if (desc) return _("複数のモンスターを召喚する。", "Summons some monsters.");
\r
1904 msg_print(_("あなたはモンスターのカードに集中する...", "You concentrate on several trumps at once..."));
\r
1905 if (p_ptr->pclass == CLASS_BEASTMASTER)
\r
1906 type = SUMMON_LIVING;
\r
1910 if (trump_summoning((1 + (plev - 15)/ 10), !fail, p_ptr->y, p_ptr->x, 0, type, 0L))
\r
1914 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
\r
1923 if (name) return _("ハウンドのカード", "Trump Hounds");
\r
1924 if (desc) return _("1グループのハウンドを召喚する。", "Summons a group of hounds.");
\r
1929 msg_print(_("あなたはハウンドのカードに集中する...", "You concentrate on the trump of a hound..."));
\r
1930 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HOUND, PM_ALLOW_GROUP))
\r
1934 msg_print(_("召喚されたハウンドは怒っている!", "The summoned hounds get angry!"));
\r
1942 if (name) return _("トランプの刃", "Trump Branding");
\r
1943 if (desc) return _("武器にトランプの属性をつける。", "Makes current weapon a Trump weapon.");
\r
1954 if (name) return _("人間トランプ", "Living Trump");
\r
1955 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",
\r
1956 "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");
\r
1964 /* Teleport control */
\r
1967 /* Random teleportation (uncontrolled) */
\r
1970 /* Gain the mutation */
\r
1971 if (gain_random_mutation(mutation))
\r
1973 msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));
\r
1980 if (name) return _("サイバーデーモンのカード", "Trump Cyberdemon");
\r
1981 if (desc) return _("1体のサイバーデーモンを召喚する。", "Summons a cyber demon.");
\r
1986 msg_print(_("あなたはサイバーデーモンのカードに集中する...", "You concentrate on the trump of a Cyberdemon..."));
\r
1987 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_CYBER, 0L))
\r
1991 msg_print(_("召喚されたサイバーデーモンは怒っている!", "The summoned Cyberdemon gets angry!"));
\r
1999 if (name) return _("予見のカード", "Trump Divination");
\r
2000 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
\r
2001 "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
\r
2004 int rad = DETECT_RAD_DEFAULT;
\r
2006 if (info) return info_radius(rad);
\r
2016 if (name) return _("知識のカード", "Trump Lore");
\r
2017 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
\r
2022 if (!identify_fully(FALSE)) return NULL;
\r
2028 if (name) return _("回復モンスター", "Heal Monster");
\r
2029 if (desc) return _("モンスター1体の体力を回復させる。", "Heal a monster.");
\r
2032 int heal = plev * 10 + 200;
\r
2034 if (info) return info_heal(0, 0, heal);
\r
2040 /* Temporary enable target_pet option */
\r
2041 bool old_target_pet = target_pet;
\r
2042 target_pet = TRUE;
\r
2044 result = get_aim_dir(&dir);
\r
2046 /* Restore target_pet option */
\r
2047 target_pet = old_target_pet;
\r
2049 if (!result) return NULL;
\r
2051 heal_monster(dir, heal);
\r
2057 if (name) return _("ドラゴンのカード", "Trump Dragon");
\r
2058 if (desc) return _("1体のドラゴンを召喚する。", "Summons a dragon.");
\r
2063 msg_print(_("あなたはドラゴンのカードに集中する...", "You concentrate on the trump of a dragon..."));
\r
2064 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_DRAGON, 0L))
\r
2068 msg_print(_("召喚されたドラゴンは怒っている!", "The summoned dragon gets angry!"));
\r
2076 if (name) return _("隕石のカード", "Trump Meteor");
\r
2077 if (desc) return _("自分の周辺に隕石を落とす。", "Makes meteor balls fall down to nearby random locations.");
\r
2080 HIT_POINT dam = plev * 2;
\r
2083 if (info) return info_multi_damage(dam);
\r
2087 cast_meteor(dam, rad);
\r
2093 if (name) return _("デーモンのカード", "Trump Demon");
\r
2094 if (desc) return _("1体の悪魔を召喚する。", "Summons a demon.");
\r
2099 msg_print(_("あなたはデーモンのカードに集中する...", "You concentrate on the trump of a demon..."));
\r
2100 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_DEMON, 0L))
\r
2104 msg_print(_("召喚されたデーモンは怒っている!", "The summoned demon gets angry!"));
\r
2112 if (name) return _("地獄のカード", "Trump Greater Undead");
\r
2113 if (desc) return _("1体の上級アンデッドを召喚する。", "Summons a greater undead.");
\r
2118 msg_print(_("あなたは強力なアンデッドのカードに集中する...", "You concentrate on the trump of a greater undead being..."));
\r
2119 /* May allow unique depend on level and dice roll */
\r
2120 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HI_UNDEAD, PM_ALLOW_UNIQUE))
\r
2124 msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead creature gets angry!"));
\r
2132 if (name) return _("古代ドラゴンのカード", "Trump Ancient Dragon");
\r
2133 if (desc) return _("1体の古代ドラゴンを召喚する。", "Summons an ancient dragon.");
\r
2140 if (p_ptr->pclass == CLASS_BEASTMASTER)
\r
2141 type = SUMMON_HI_DRAGON_LIVING;
\r
2143 type = SUMMON_HI_DRAGON;
\r
2145 msg_print(_("あなたは古代ドラゴンのカードに集中する...", "You concentrate on the trump of an ancient dragon..."));
\r
2146 /* May allow unique depend on level and dice roll */
\r
2147 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, type, PM_ALLOW_UNIQUE))
\r
2151 msg_print(_("召喚された古代ドラゴンは怒っている!", "The summoned ancient dragon gets angry!"));
\r
2164 * @brief 匠領域魔法の各処理を行う
\r
2165 * @param spell 魔法ID
\r
2166 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
2167 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
2169 static cptr do_craft_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
2171 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
2172 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
2173 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
2174 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
2176 int plev = p_ptr->lev;
\r
2181 if (name) return _("赤外線視力", "Infravision");
\r
2182 if (desc) return _("一定時間、赤外線視力が増強される。", "Gives infravision for a while.");
\r
2187 if (info) return info_duration(base, base);
\r
2191 set_tim_infra(base + randint1(base), FALSE);
\r
2197 if (name) return _("回復力強化", "Regeneration");
\r
2198 if (desc) return _("一定時間、回復力が増強される。", "Gives regeneration ability for a while.");
\r
2203 if (info) return info_duration(base, base);
\r
2207 set_tim_regen(base + randint1(base), FALSE);
\r
2213 if (name) return _("空腹充足", "Satisfy Hunger");
\r
2214 if (desc) return _("満腹になる。", "Satisfies hunger.");
\r
2219 set_food(PY_FOOD_MAX - 1);
\r
2225 if (name) return _("耐冷気", "Resist Cold");
\r
2226 if (desc) return _("一定時間、冷気への耐性を得る。装備による耐性に累積する。",
\r
2227 "Gives resistance to cold. This resistance can be added to which from equipment for more powerful resistance.");
\r
2232 if (info) return info_duration(base, base);
\r
2236 set_oppose_cold(randint1(base) + base, FALSE);
\r
2242 if (name) return _("耐火炎", "Resist Fire");
\r
2243 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
\r
2244 "Gives resistance to fire. This resistance can be added to which from equipment for more powerful resistance.");
\r
2249 if (info) return info_duration(base, base);
\r
2253 set_oppose_fire(randint1(base) + base, FALSE);
\r
2259 if (name) return _("士気高揚", "Heroism");
\r
2260 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
2265 if (info) return info_duration(base, base);
\r
2269 set_hero(randint1(base) + base, FALSE);
\r
2277 if (name) return _("耐電撃", "Resist Lightning");
\r
2278 if (desc) return _("一定時間、電撃への耐性を得る。装備による耐性に累積する。",
\r
2279 "Gives resistance to electricity. This resistance can be added to which from equipment for more powerful resistance.");
\r
2284 if (info) return info_duration(base, base);
\r
2288 set_oppose_elec(randint1(base) + base, FALSE);
\r
2294 if (name) return _("耐酸", "Resist Acid");
\r
2295 if (desc) return _("一定時間、酸への耐性を得る。装備による耐性に累積する。",
\r
2296 "Gives resistance to acid. This resistance can be added to which from equipment for more powerful resistance.");
\r
2301 if (info) return info_duration(base, base);
\r
2305 set_oppose_acid(randint1(base) + base, FALSE);
\r
2311 if (name) return _("透明視認", "See Invisibility");
\r
2312 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
\r
2317 if (info) return info_duration(base, base);
\r
2321 set_tim_invis(randint1(base) + base, FALSE);
\r
2327 if (name) return _("解呪", "Remove Curse");
\r
2328 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
\r
2333 if (remove_curse())
\r
2335 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
2342 if (name) return _("耐毒", "Resist Poison");
\r
2343 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",
\r
2344 "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");
\r
2349 if (info) return info_duration(base, base);
\r
2353 set_oppose_pois(randint1(base) + base, FALSE);
\r
2359 if (name) return _("狂戦士化", "Berserk");
\r
2360 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");
\r
2365 if (info) return info_duration(base, base);
\r
2369 set_shero(randint1(base) + base, FALSE);
\r
2377 if (name) return _("自己分析", "Self Knowledge");
\r
2378 if (desc) return _("現在の自分の状態を完全に知る。",
\r
2379 "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");
\r
2390 if (name) return _("対邪悪結界", "Protection from Evil");
\r
2391 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");
\r
2394 int base = 3 * plev;
\r
2397 if (info) return info_duration(base, sides);
\r
2401 set_protevil(randint1(sides) + base, FALSE);
\r
2407 if (name) return _("癒し", "Cure");
\r
2408 if (desc) return _("毒、朦朧状態、負傷を全快させ、幻覚を直す。", "Heals poison, stun, cut and hallucination completely.");
\r
2422 if (name) return _("魔法剣", "Mana Branding");
\r
2423 if (desc) return _("一定時間、武器に冷気、炎、電撃、酸、毒のいずれかの属性をつける。武器を持たないと使えない。",
\r
2424 "Makes current weapon some elemental branded. You must wield weapons.");
\r
2427 int base = plev / 2;
\r
2429 if (info) return info_duration(base, base);
\r
2433 if (!choose_ele_attack()) return NULL;
\r
2439 if (name) return _("テレパシー", "Telepathy");
\r
2440 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
\r
2446 if (info) return info_duration(base, sides);
\r
2450 set_tim_esp(randint1(sides) + base, FALSE);
\r
2456 if (name) return _("肌石化", "Stone Skin");
\r
2457 if (desc) return _("一定時間、ACを上昇させる。", "Gives bonus to AC for a while.");
\r
2463 if (info) return info_duration(base, sides);
\r
2467 set_shield(randint1(sides) + base, FALSE);
\r
2473 if (name) return _("全耐性", "Resistance");
\r
2474 if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
\r
2475 "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
2480 if (info) return info_duration(base, base);
\r
2484 set_oppose_acid(randint1(base) + base, FALSE);
\r
2485 set_oppose_elec(randint1(base) + base, FALSE);
\r
2486 set_oppose_fire(randint1(base) + base, FALSE);
\r
2487 set_oppose_cold(randint1(base) + base, FALSE);
\r
2488 set_oppose_pois(randint1(base) + base, FALSE);
\r
2494 if (name) return _("スピード", "Haste Self");
\r
2495 if (desc) return _("一定時間、加速する。", "Hastes you for a while.");
\r
2499 int sides = 20 + plev;
\r
2501 if (info) return info_duration(base, sides);
\r
2505 set_fast(randint1(sides) + base, FALSE);
\r
2511 if (name) return _("壁抜け", "Walk through Wall");
\r
2512 if (desc) return _("一定時間、半物質化し壁を通り抜けられるようになる。", "Gives ability to pass walls for a while.");
\r
2515 int base = plev / 2;
\r
2517 if (info) return info_duration(base, base);
\r
2521 set_kabenuke(randint1(base) + base, FALSE);
\r
2527 if (name) return _("盾磨き", "Polish Shield");
\r
2528 if (desc) return _("盾に反射の属性をつける。", "Makes a shield a shield of reflection.");
\r
2539 if (name) return _("ゴーレム製造", "Create Golem");
\r
2540 if (desc) return _("1体のゴーレムを製造する。", "Creates a golem.");
\r
2545 if (summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_GOLEM, PM_FORCE_PET))
\r
2547 msg_print(_("ゴーレムを作った。", "You make a golem."));
\r
2551 msg_print(_("うまくゴーレムを作れなかった。", "No Golems arrive."));
\r
2558 if (name) return _("魔法の鎧", "Magical armor");
\r
2559 if (desc) return _("一定時間、魔法防御力とACが上がり、混乱と盲目の耐性、反射能力、麻痺知らず、浮遊を得る。",
\r
2560 "Gives resistance to magic, bonus to AC, resistance to confusion, blindness, reflection, free action and levitation for a while.");
\r
2565 if (info) return info_duration(base, base);
\r
2569 set_magicdef(randint1(base) + base, FALSE);
\r
2575 if (name) return _("装備無力化", "Remove Enchantment");
\r
2576 if (desc) return _("武器・防具にかけられたあらゆる魔力を完全に解除する。", "Removes all magics completely from any weapon or armor.");
\r
2581 if (!mundane_spell(TRUE)) return NULL;
\r
2587 if (name) return _("呪い粉砕", "Remove All Curse");
\r
2588 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
\r
2593 if (remove_all_curse())
\r
2595 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
2602 if (name) return _("完全なる知識", "Knowledge True");
\r
2603 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
\r
2608 if (!identify_fully(FALSE)) return NULL;
\r
2614 if (name) return _("武器強化", "Enchant Weapon");
\r
2615 if (desc) return _("武器の命中率修正とダメージ修正を強化する。", "Attempts to increase +to-hit, +to-dam of a weapon.");
\r
2620 if (!enchant_spell(randint0(4) + 1, randint0(4) + 1, 0)) return NULL;
\r
2626 if (name) return _("防具強化", "Enchant Armor");
\r
2627 if (desc) return _("鎧の防御修正を強化する。", "Attempts to increase +AC of an armor.");
\r
2632 if (!enchant_spell(0, 0, randint0(3) + 2)) return NULL;
\r
2638 if (name) return _("武器属性付与", "Brand Weapon");
\r
2639 if (desc) return _("武器にランダムに属性をつける。", "Makes current weapon a random ego weapon.");
\r
2644 brand_weapon(randint0(18));
\r
2650 if (name) return _("人間トランプ", "Living Trump");
\r
2651 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",
\r
2652 "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");
\r
2660 /* Teleport control */
\r
2663 /* Random teleportation (uncontrolled) */
\r
2666 /* Gain the mutation */
\r
2667 if (gain_random_mutation(mutation))
\r
2669 msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));
\r
2676 if (name) return _("属性への免疫", "Immunity");
\r
2677 if (desc) return _("一定時間、冷気、炎、電撃、酸のいずれかに対する免疫を得る。",
\r
2678 "Gives an immunity to fire, cold, electricity or acid for a while.");
\r
2683 if (info) return info_duration(base, base);
\r
2687 if (!choose_ele_immune(base + randint1(base))) return NULL;
\r
2697 * @brief 悪魔領域魔法の各処理を行う
\r
2698 * @param spell 魔法ID
\r
2699 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
2700 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
2702 static cptr do_daemon_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
2704 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
2705 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
2706 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
2707 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
2708 static const char s_dam[] = _("損傷:", "dam ");
\r
2711 int plev = p_ptr->lev;
\r
2716 if (name) return _("マジック・ミサイル", "Magic Missile");
\r
2717 if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");
\r
2720 int dice = 3 + (plev - 1) / 5;
\r
2723 if (info) return info_damage(dice, sides, 0);
\r
2727 if (!get_aim_dir(&dir)) return NULL;
\r
2729 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));
\r
2735 if (name) return _("無生命感知", "Detect Unlife");
\r
2736 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
\r
2739 int rad = DETECT_RAD_DEFAULT;
\r
2741 if (info) return info_radius(rad);
\r
2745 detect_monsters_nonliving(rad);
\r
2751 if (name) return _("邪なる祝福", "Evil Bless");
\r
2752 if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
\r
2757 if (info) return info_duration(base, base);
\r
2761 set_blessed(randint1(base) + base, FALSE);
\r
2767 if (name) return _("耐火炎", "Resist Fire");
\r
2768 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
\r
2769 "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");
\r
2774 if (info) return info_duration(base, base);
\r
2778 set_oppose_fire(randint1(base) + base, FALSE);
\r
2784 if (name) return _("恐慌", "Horrify");
\r
2785 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
\r
2790 if (info) return info_power(power);
\r
2794 if (!get_aim_dir(&dir)) return NULL;
\r
2796 fear_monster(dir, power);
\r
2797 stun_monster(dir, power);
\r
2803 if (name) return _("地獄の矢", "Nether Bolt");
\r
2804 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
\r
2807 int dice = 6 + (plev - 5) / 4;
\r
2810 if (info) return info_damage(dice, sides, 0);
\r
2814 if (!get_aim_dir(&dir)) return NULL;
\r
2816 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
\r
2822 if (name) return _("古代の死霊召喚", "Summon Manes");
\r
2823 if (desc) return _("古代の死霊を召喚する。", "Summons a manes.");
\r
2828 if (!summon_specific(-1, p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET)))
\r
2830 msg_print(_("古代の死霊は現れなかった。", "No Manes arrive."));
\r
2837 if (name) return _("地獄の焔", "Hellish Flame");
\r
2838 if (desc) return _("邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",
\r
2839 "Fires a ball of evil power. Hurts good monsters greatly.");
\r
2844 int rad = (plev < 30) ? 2 : 3;
\r
2847 if (p_ptr->pclass == CLASS_MAGE ||
\r
2848 p_ptr->pclass == CLASS_HIGH_MAGE ||
\r
2849 p_ptr->pclass == CLASS_SORCERER)
\r
2850 base = plev + plev / 2;
\r
2852 base = plev + plev / 4;
\r
2855 if (info) return info_damage(dice, sides, base);
\r
2859 if (!get_aim_dir(&dir)) return NULL;
\r
2861 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides) + base, rad);
\r
2867 if (name) return _("デーモン支配", "Dominate Demon");
\r
2868 if (desc) return _("悪魔1体を魅了する。抵抗されると無効", "Attempts to charm a demon.");
\r
2873 if (info) return info_power(power);
\r
2877 if (!get_aim_dir(&dir)) return NULL;
\r
2879 control_one_demon(dir, power);
\r
2885 if (name) return _("ビジョン", "Vision");
\r
2886 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
\r
2889 int rad = DETECT_RAD_MAP;
\r
2891 if (info) return info_radius(rad);
\r
2901 if (name) return _("耐地獄", "Resist Nether");
\r
2902 if (desc) return _("一定時間、地獄への耐性を得る。", "Gives resistance to nether for a while.");
\r
2907 if (info) return info_duration(base, base);
\r
2911 set_tim_res_nether(randint1(base) + base, FALSE);
\r
2917 if (name) return _("プラズマ・ボルト", "Plasma bolt");
\r
2918 if (desc) return _("プラズマのボルトもしくはビームを放つ。", "Fires a bolt or beam of plasma.");
\r
2921 int dice = 11 + (plev - 5) / 4;
\r
2924 if (info) return info_damage(dice, sides, 0);
\r
2928 if (!get_aim_dir(&dir)) return NULL;
\r
2930 fire_bolt_or_beam(beam_chance(), GF_PLASMA, dir, damroll(dice, sides));
\r
2936 if (name) return _("ファイア・ボール", "Fire Ball");
\r
2937 if (desc) return _("炎の球を放つ。", "Fires a ball of fire.");
\r
2940 HIT_POINT dam = plev + 55;
\r
2943 if (info) return info_damage(0, 0, dam);
\r
2947 if (!get_aim_dir(&dir)) return NULL;
\r
2949 fire_ball(GF_FIRE, dir, dam, rad);
\r
2955 if (name) return _("炎の刃", "Fire Branding");
\r
2956 if (desc) return _("武器に炎の属性をつける。", "Makes current weapon fire branded.");
\r
2967 if (name) return _("地獄球", "Nether Ball");
\r
2968 if (desc) return _("大きな地獄の球を放つ。", "Fires a huge ball of nether.");
\r
2971 HIT_POINT dam = plev * 3 / 2 + 100;
\r
2972 int rad = plev / 20 + 2;
\r
2974 if (info) return info_damage(0, 0, dam);
\r
2978 if (!get_aim_dir(&dir)) return NULL;
\r
2980 fire_ball(GF_NETHER, dir, dam, rad);
\r
2986 if (name) return _("デーモン召喚", "Summon Demon");
\r
2987 if (desc) return _("悪魔1体を召喚する。", "Summons a demon.");
\r
2992 bool pet = !one_in_(3);
\r
2995 if (pet) flg |= PM_FORCE_PET;
\r
2996 else flg |= PM_NO_PET;
\r
2997 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
\r
2999 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, plev*2/3+randint1(plev/2), SUMMON_DEMON, flg))
\r
3001 msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));
\r
3005 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
\r
3009 msg_print(_("「卑しき者よ、我は汝の下僕にあらず! お前の魂を頂くぞ!」",
\r
3010 "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));
\r
3015 msg_print(_("悪魔は現れなかった。", "No demons arrive."));
\r
3023 if (name) return _("悪魔の目", "Devilish Eye");
\r
3024 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
\r
3030 if (info) return info_duration(base, sides);
\r
3034 set_tim_esp(randint1(sides) + base, FALSE);
\r
3040 if (name) return _("悪魔のクローク", "Devil Cloak");
\r
3041 if (desc) return _("恐怖を取り除き、一定時間、炎と冷気の耐性、炎のオーラを得る。耐性は装備による耐性に累積する。",
\r
3042 "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
3045 TIME_EFFECT base = 20;
\r
3047 if (info) return info_duration(base, base);
\r
3051 TIME_EFFECT dur = randint1(base) + base;
\r
3053 set_oppose_fire(dur, FALSE);
\r
3054 set_oppose_cold(dur, FALSE);
\r
3055 set_tim_sh_fire(dur, FALSE);
\r
3063 if (name) return _("溶岩流", "The Flow of Lava");
\r
3064 if (desc) return _("自分を中心とした炎の球を作り出し、床を溶岩に変える。",
\r
3065 "Generates a ball of fire centered on you which transforms floors to magma.");
\r
3068 HIT_POINT dam = (55 + plev) * 2;
\r
3071 if (info) return info_damage(0, 0, dam/2);
\r
3075 fire_ball(GF_FIRE, 0, dam, rad);
\r
3076 fire_ball_hide(GF_LAVA_FLOW, 0, 2 + randint1(2), rad);
\r
3082 if (name) return _("プラズマ球", "Plasma Ball");
\r
3083 if (desc) return _("プラズマの球を放つ。", "Fires a ball of plasma.");
\r
3086 HIT_POINT dam = plev * 3 / 2 + 80;
\r
3087 int rad = 2 + plev / 40;
\r
3089 if (info) return info_damage(0, 0, dam);
\r
3093 if (!get_aim_dir(&dir)) return NULL;
\r
3095 fire_ball(GF_PLASMA, dir, dam, rad);
\r
3101 if (name) return _("悪魔変化", "Polymorph Demon");
\r
3102 if (desc) return _("一定時間、悪魔に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔としての能力を得る。",
\r
3103 "Mimic a demon for a while. Loses abilities of original race and gets abilities as a demon.");
\r
3106 int base = 10 + plev / 2;
\r
3108 if (info) return info_duration(base, base);
\r
3112 set_mimic(base + randint1(base), MIMIC_DEMON, FALSE);
\r
3118 if (name) return _("地獄の波動", "Nather Wave");
\r
3119 if (desc) return _("視界内の全てのモンスターにダメージを与える。善良なモンスターに特に大きなダメージを与える。",
\r
3120 "Damages all monsters in sight. Hurts good monsters greatly.");
\r
3123 int sides1 = plev * 2;
\r
3124 int sides2 = plev * 2;
\r
3126 if (info) return format("%sd%d+d%d", s_dam, sides1, sides2);
\r
3130 dispel_monsters(randint1(sides1));
\r
3131 dispel_good(randint1(sides2));
\r
3137 if (name) return _("サキュバスの接吻", "Kiss of Succubus");
\r
3138 if (desc) return _("因果混乱の球を放つ。", "Fires a ball of nexus.");
\r
3141 HIT_POINT dam = 100 + plev * 2;
\r
3144 if (info) return info_damage(0, 0, dam);
\r
3148 if (!get_aim_dir(&dir)) return NULL;
\r
3149 fire_ball(GF_NEXUS, dir, dam, rad);
\r
3155 if (name) return _("破滅の手", "Doom Hand");
\r
3156 if (desc) return _("破滅の手を放つ。食らったモンスターはそのときのHPの半分前後のダメージを受ける。", "Attempts to make a monster's HP almost half.");
\r
3161 if (!get_aim_dir(&dir))
\r
3164 msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));
\r
3166 fire_ball_hide(GF_HAND_DOOM, dir, plev * 2, 0);
\r
3172 if (name) return _("士気高揚", "Raise the Morale");
\r
3173 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
3178 if (info) return info_duration(base, base);
\r
3182 set_hero(randint1(base) + base, FALSE);
\r
3190 if (name) return _("不滅の肉体", "Immortal Body");
\r
3191 if (desc) return _("一定時間、時間逆転への耐性を得る。", "Gives resistance to time for a while.");
\r
3196 if (info) return info_duration(base, base);
\r
3200 set_tim_res_time(randint1(base)+base, FALSE);
\r
3206 if (name) return _("狂気の円環", "Insanity Circle");
\r
3207 if (desc) return _("自分を中心としたカオスの球、混乱の球を発生させ、近くのモンスターを魅了する。",
\r
3208 "Generate balls of chaos, confusion and charm centered on you.");
\r
3211 HIT_POINT dam = 50 + plev;
\r
3212 int power = 20 + plev;
\r
3213 int rad = 3 + plev / 20;
\r
3215 if (info) return format("%s%d+%d", s_dam, dam/2, dam/2);
\r
3219 fire_ball(GF_CHAOS, 0, dam, rad);
\r
3220 fire_ball(GF_CONFUSION, 0, dam, rad);
\r
3221 fire_ball(GF_CHARM, 0, power, rad);
\r
3227 if (name) return _("ペット爆破", "Explode Pets");
\r
3228 if (desc) return _("全てのペットを強制的に爆破させる。", "Makes all pets explode.");
\r
3233 discharge_minion();
\r
3239 if (name) return _("グレーターデーモン召喚", "Summon Greater Demon");
\r
3240 if (desc) return _("上級デーモンを召喚する。召喚するには人間('p','h','t'で表されるモンスター)の死体を捧げなければならない。",
\r
3241 "Summons greater demon. It need to sacrifice a corpse of human ('p','h' or 't').");
\r
3246 if (!cast_summon_greater_demon()) return NULL;
\r
3252 if (name) return _("地獄嵐", "Nether Storm");
\r
3253 if (desc) return _("超巨大な地獄の球を放つ。", "Generate a huge ball of nether.");
\r
3256 HIT_POINT dam = plev * 15;
\r
3257 int rad = plev / 5;
\r
3259 if (info) return info_damage(0, 0, dam);
\r
3263 if (!get_aim_dir(&dir)) return NULL;
\r
3265 fire_ball(GF_NETHER, dir, dam, rad);
\r
3271 if (name) return _("血の呪い", "Bloody Curse");
\r
3272 if (desc) return _("自分がダメージを受けることによって対象に呪いをかけ、ダメージを与え様々な効果を引き起こす。",
\r
3273 "Puts blood curse which damages and causes various effects on a monster. You also take damage.");
\r
3276 HIT_POINT dam = 600;
\r
3279 if (info) return info_damage(0, 0, dam);
\r
3283 if (!get_aim_dir(&dir)) return NULL;
\r
3285 fire_ball_hide(GF_BLOOD_CURSE, dir, dam, rad);
\r
3286 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("血の呪い", "Blood curse"), -1);
\r
3292 if (name) return _("魔王変化", "Polymorph Demonlord");
\r
3293 if (desc) return _("悪魔の王に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔の王としての能力を得、壁を破壊しながら歩く。",
\r
3294 "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
3299 if (info) return info_duration(base, base);
\r
3303 set_mimic(base + randint1(base), MIMIC_DEMON_LORD, FALSE);
\r
3313 * @brief 破邪領域魔法の各処理を行う
\r
3314 * @param spell 魔法ID
\r
3315 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
3316 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
3318 static cptr do_crusade_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
3320 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
3321 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
3322 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
3323 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
3326 int plev = p_ptr->lev;
\r
3331 if (name) return _("懲罰", "Punishment");
\r
3332 if (desc) return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");
\r
3335 int dice = 3 + (plev - 1) / 5;
\r
3338 if (info) return info_damage(dice, sides, 0);
\r
3342 if (!get_aim_dir(&dir)) return NULL;
\r
3344 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));
\r
3350 if (name) return _("邪悪存在感知", "Detect Evil");
\r
3351 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
\r
3354 int rad = DETECT_RAD_DEFAULT;
\r
3356 if (info) return info_radius(rad);
\r
3360 detect_monsters_evil(rad);
\r
3366 if (name) return _("恐怖除去", "Remove Fear");
\r
3367 if (desc) return _("恐怖を取り除く。", "Removes fear.");
\r
3378 if (name) return _("威圧", "Scare Monster");
\r
3379 if (desc) return _("モンスター1体を恐怖させる。抵抗されると無効。", "Attempts to scare a monster.");
\r
3384 if (info) return info_power(power);
\r
3388 if (!get_aim_dir(&dir)) return NULL;
\r
3390 fear_monster(dir, power);
\r
3396 if (name) return _("聖域", "Sanctuary");
\r
3397 if (desc) return _("隣接した全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep monsters in the adjacent squares.");
\r
3402 if (info) return info_power(power);
\r
3406 sleep_monsters_touch();
\r
3412 if (name) return _("入口", "Portal");
\r
3413 if (desc) return _("中距離のテレポートをする。", "Teleport medium distance.");
\r
3416 POSITION range = 25 + plev / 2;
\r
3418 if (info) return info_range(range);
\r
3422 teleport_player(range, 0L);
\r
3428 if (name) return _("スターダスト", "Star Dust");
\r
3429 if (desc) return _("ターゲット付近に閃光のボルトを連射する。", "Fires many bolts of light near the target.");
\r
3432 int dice = 3 + (plev - 1) / 9;
\r
3435 if (info) return info_multi_damage_dice(dice, sides);
\r
3439 if (!get_aim_dir(&dir)) return NULL;
\r
3440 fire_blast(GF_LITE, dir, dice, sides, 10, 3);
\r
3446 if (name) return _("身体浄化", "Purify");
\r
3447 if (desc) return _("傷、毒、朦朧から全快する。", "Heals all cut, stun and poison status.");
\r
3460 if (name) return _("邪悪飛ばし", "Scatter Evil");
\r
3461 if (desc) return _("邪悪なモンスター1体をテレポートさせる。抵抗されると無効。", "Attempts to teleport an evil monster away.");
\r
3464 int power = MAX_SIGHT * 5;
\r
3466 if (info) return info_power(power);
\r
3470 if (!get_aim_dir(&dir)) return NULL;
\r
3471 fire_ball(GF_AWAY_EVIL, dir, power, 0);
\r
3477 if (name) return _("聖なる光球", "Holy Orb");
\r
3478 if (desc) return _("聖なる力をもつ宝珠を放つ。邪悪なモンスターに対して大きなダメージを与えるが、善良なモンスターには効果がない。",
\r
3479 "Fires a ball with holy power. Hurts evil monsters greatly, but don't effect good monsters.");
\r
3484 int rad = (plev < 30) ? 2 : 3;
\r
3487 if (p_ptr->pclass == CLASS_PRIEST ||
\r
3488 p_ptr->pclass == CLASS_HIGH_MAGE ||
\r
3489 p_ptr->pclass == CLASS_SORCERER)
\r
3490 base = plev + plev / 2;
\r
3492 base = plev + plev / 4;
\r
3495 if (info) return info_damage(dice, sides, base);
\r
3499 if (!get_aim_dir(&dir)) return NULL;
\r
3501 fire_ball(GF_HOLY_FIRE, dir, damroll(dice, sides) + base, rad);
\r
3507 if (name) return _("悪魔払い", "Exorcism");
\r
3508 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与え、邪悪なモンスターを恐怖させる。",
\r
3509 "Damages all undead and demons in sight, and scares all evil monsters in sight.");
\r
3515 if (info) return info_damage(1, sides, 0);
\r
3519 dispel_undead(randint1(sides));
\r
3520 dispel_demons(randint1(sides));
\r
3527 if (name) return _("解呪", "Remove Curse");
\r
3528 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
\r
3533 if (remove_curse())
\r
3535 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
3542 if (name) return _("透明視認", "Sense Unseen");
\r
3543 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
\r
3548 if (info) return info_duration(base, base);
\r
3552 set_tim_invis(randint1(base) + base, FALSE);
\r
3558 if (name) return _("対邪悪結界", "Protection from Evil");
\r
3559 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");
\r
3563 int sides = 3 * plev;
\r
3565 if (info) return info_duration(base, sides);
\r
3569 set_protevil(randint1(sides) + base, FALSE);
\r
3575 if (name) return _("裁きの雷", "Judgment Thunder");
\r
3576 if (desc) return _("強力な電撃のボルトを放つ。", "Fires a powerful bolt of lightning.");
\r
3579 HIT_POINT dam = plev * 5;
\r
3581 if (info) return info_damage(0, 0, dam);
\r
3585 if (!get_aim_dir(&dir)) return NULL;
\r
3586 fire_bolt(GF_ELEC, dir, dam);
\r
3592 if (name) return _("聖なる御言葉", "Holy Word");
\r
3593 if (desc) return _("視界内の邪悪な存在に大きなダメージを与え、体力を回復し、毒、恐怖、朦朧状態、負傷から全快する。",
\r
3594 "Damages all evil monsters in sight, heals HP somewhat, and completely heals poison, fear, stun and cut status.");
\r
3597 int dam_sides = plev * 6;
\r
3600 if (info) return format(_("損:1d%d/回%d", "dam:d%d/h%d"), dam_sides, heal);
\r
3603 dispel_evil(randint1(dam_sides));
\r
3614 if (name) return _("開かれた道", "Unbarring Ways");
\r
3615 if (desc) return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");
\r
3620 if (!get_aim_dir(&dir)) return NULL;
\r
3622 destroy_door(dir);
\r
3628 if (name) return _("封魔", "Arrest");
\r
3629 if (desc) return _("邪悪なモンスターの動きを止める。", "Attempts to paralyze an evil monster.");
\r
3632 int power = plev * 2;
\r
3634 if (info) return info_power(power);
\r
3638 if (!get_aim_dir(&dir)) return NULL;
\r
3645 if (name) return _("聖なるオーラ", "Holy Aura");
\r
3646 if (desc) return _("一定時間、邪悪なモンスターを傷つける聖なるオーラを得る。",
\r
3647 "Gives aura of holy power which injures evil monsters which attacked you for a while.");
\r
3652 if (info) return info_duration(base, base);
\r
3656 set_tim_sh_holy(randint1(base) + base, FALSE);
\r
3662 if (name) return _("アンデッド&悪魔退散", "Dispel Undead & Demons");
\r
3663 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与える。", "Damages all undead and demons in sight.");
\r
3666 int sides = plev * 4;
\r
3668 if (info) return info_damage(1, sides, 0);
\r
3672 dispel_undead(randint1(sides));
\r
3673 dispel_demons(randint1(sides));
\r
3679 if (name) return _("邪悪退散", "Dispel Evil");
\r
3680 if (desc) return _("視界内の全ての邪悪なモンスターにダメージを与える。", "Damages all evil monsters in sight.");
\r
3683 int sides = plev * 4;
\r
3685 if (info) return info_damage(1, sides, 0);
\r
3689 dispel_evil(randint1(sides));
\r
3695 if (name) return _("聖なる刃", "Holy Blade");
\r
3696 if (desc) return _("通常の武器に滅邪の属性をつける。", "Makes current weapon especially deadly against evil monsters.");
\r
3707 if (name) return _("スターバースト", "Star Burst");
\r
3708 if (desc) return _("巨大な閃光の球を放つ。", "Fires a huge ball of powerful light.");
\r
3711 HIT_POINT dam = 100 + plev * 2;
\r
3714 if (info) return info_damage(0, 0, dam);
\r
3718 if (!get_aim_dir(&dir)) return NULL;
\r
3720 fire_ball(GF_LITE, dir, dam, rad);
\r
3726 if (name) return _("天使召喚", "Summon Angel");
\r
3727 if (desc) return _("天使を1体召喚する。", "Summons an angel.");
\r
3732 bool pet = !one_in_(3);
\r
3735 if (pet) flg |= PM_FORCE_PET;
\r
3736 else flg |= PM_NO_PET;
\r
3737 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
\r
3739 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_ANGEL, flg))
\r
3743 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
\r
3747 msg_print(_("「我は汝の下僕にあらず! 悪行者よ、悔い改めよ!」", "Mortal! Repent of thy impiousness."));
\r
3755 if (name) return _("士気高揚", "Heroism");
\r
3756 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
3761 if (info) return info_duration(base, base);
\r
3765 set_hero(randint1(base) + base, FALSE);
\r
3773 if (name) return _("呪い退散", "Dispel Curse");
\r
3774 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
\r
3779 if (remove_all_curse())
\r
3781 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
\r
3788 if (name) return _("邪悪追放", "Banish Evil");
\r
3789 if (desc) return _("視界内の全ての邪悪なモンスターをテレポートさせる。抵抗されると無効。",
\r
3790 "Teleports all evil monsters in sight away unless resisted.");
\r
3795 if (info) return info_power(power);
\r
3799 if (banish_evil(power))
\r
3801 msg_print(_("神聖な力が邪悪を打ち払った!", "The holy power banishes evil!"));
\r
3808 if (name) return _("ハルマゲドン", "Armageddon");
\r
3809 if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroy everything in nearby area.");
\r
3817 destroy_area(p_ptr->y, p_ptr->x, base + randint1(sides), FALSE);
\r
3823 if (name) return _("目には目を", "An Eye for an Eye");
\r
3824 if (desc) return _("一定時間、自分がダメージを受けたときに攻撃を行ったモンスターに対して同等のダメージを与える。",
\r
3825 "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
3830 if (info) return info_duration(base, base);
\r
3834 set_tim_eyeeye(randint1(base) + base, FALSE);
\r
3840 if (name) return _("神の怒り", "Wrath of the God");
\r
3841 if (desc) return _("ターゲットの周囲に分解の球を多数落とす。", "Drops many balls of disintegration near the target.");
\r
3844 HIT_POINT dam = plev * 3 + 25;
\r
3847 if (info) return info_multi_damage(dam);
\r
3851 if (!cast_wrath_of_the_god(dam, rad)) return NULL;
\r
3857 if (name) return _("神威", "Divine Intervention");
\r
3858 if (desc) return _("隣接するモンスターに聖なるダメージを与え、視界内のモンスターにダメージ、減速、朦朧、混乱、恐怖、眠りを与える。さらに体力を回復する。",
\r
3859 "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
3862 int b_dam = plev * 11;
\r
3863 int d_dam = plev * 4;
\r
3865 int power = plev * 4;
\r
3867 if (info) return format(_("回%d/損%d+%d", "h%d/dm%d+%d"), heal, d_dam, b_dam/2);
\r
3870 project(0, 1, p_ptr->y, p_ptr->x, b_dam, GF_HOLY_FIRE, PROJECT_KILL, -1);
\r
3871 dispel_monsters(d_dam);
\r
3872 slow_monsters(plev);
\r
3873 stun_monsters(power);
\r
3874 confuse_monsters(power);
\r
3875 turn_monsters(power);
\r
3876 stasis_monsters(power);
\r
3883 if (name) return _("聖戦", "Crusade");
\r
3884 if (desc) return _("視界内の善良なモンスターをペットにしようとし、ならなかった場合及び善良でないモンスターを恐怖させる。さらに多数の加速された騎士を召喚し、ヒーロー、祝福、加速、対邪悪結界を得る。",
\r
3885 "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
3891 int sp_sides = 20 + plev;
\r
3892 int sp_base = plev;
\r
3896 for (i = 0; i < 12; i++)
\r
3899 POSITION my = 0, mx = 0;
\r
3903 scatter(&my, &mx, p_ptr->y, p_ptr->x, 4, 0);
\r
3905 /* Require empty grids */
\r
3906 if (cave_empty_bold2(my, mx)) break;
\r
3908 if (attempt < 0) continue;
\r
3909 summon_specific(-1, my, mx, plev, SUMMON_KNIGHTS, (PM_ALLOW_GROUP | PM_FORCE_PET | PM_HASTE));
\r
3911 set_hero(randint1(base) + base, FALSE);
\r
3912 set_blessed(randint1(base) + base, FALSE);
\r
3913 set_fast(randint1(sp_sides) + sp_base, FALSE);
\r
3914 set_protevil(randint1(base) + base, FALSE);
\r
3927 * @param spell 歌ID
\r
3928 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP)
\r
3929 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
\r
3931 static cptr do_music_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
3933 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
3934 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
3935 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
3936 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
3937 bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
\r
3938 bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
\r
3939 bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
\r
3940 static const char s_dam[] = _("損傷:", "dam ");
\r
3943 int plev = p_ptr->lev;
\r
3948 if (name) return _("遅鈍の歌", "Song of Holding");
\r
3949 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
\r
3951 /* Stop singing before start another */
\r
3952 if (cast || fail) stop_singing();
\r
3956 msg_print(_("ゆっくりとしたメロディを口ずさみ始めた...", "You start humming a slow, steady melody..."));
\r
3957 start_singing(spell, MUSIC_SLOW);
\r
3963 if (info) return info_power(power);
\r
3967 slow_monsters(plev);
\r
3973 if (name) return _("祝福の歌", "Song of Blessing");
\r
3974 if (desc) return _("命中率とACのボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
\r
3976 /* Stop singing before start another */
\r
3977 if (cast || fail) stop_singing();
\r
3981 msg_print(_("厳かなメロディを奏で始めた...", "The holy power of the Music of the Ainur enters you..."));
\r
3982 start_singing(spell, MUSIC_BLESS);
\r
3987 if (!p_ptr->blessed)
\r
3989 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
\r
3996 if (name) return _("崩壊の音色", "Wrecking Note");
\r
3997 if (desc) return _("轟音のボルトを放つ。", "Fires a bolt of sound.");
\r
3999 /* Stop singing before start another */
\r
4000 if (cast || fail) stop_singing();
\r
4003 int dice = 4 + (plev - 1) / 5;
\r
4006 if (info) return info_damage(dice, sides, 0);
\r
4010 if (!get_aim_dir(&dir)) return NULL;
\r
4012 fire_bolt(GF_SOUND, dir, damroll(dice, sides));
\r
4018 if (name) return _("朦朧の旋律", "Stun Pattern");
\r
4019 if (desc) return _("視界内の全てのモンスターを朦朧させる。抵抗されると無効。", "Attempts to stun all monsters in sight.");
\r
4021 /* Stop singing before start another */
\r
4022 if (cast || fail) stop_singing();
\r
4026 msg_print(_("眩惑させるメロディを奏で始めた...", "You weave a pattern of sounds to bewilder and daze..."));
\r
4027 start_singing(spell, MUSIC_STUN);
\r
4031 int dice = plev / 10;
\r
4034 if (info) return info_power_dice(dice, sides);
\r
4038 stun_monsters(damroll(dice, sides));
\r
4045 if (name) return _("生命の流れ", "Flow of Life");
\r
4046 if (desc) return _("体力を少し回復させる。", "Heals HP a little.");
\r
4048 /* Stop singing before start another */
\r
4049 if (cast || fail) stop_singing();
\r
4053 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing a song of healing..."));
\r
4054 start_singing(spell, MUSIC_L_LIFE);
\r
4061 if (info) return info_heal(dice, sides, 0);
\r
4065 hp_player(damroll(dice, sides));
\r
4072 if (name) return _("太陽の歌", "Song of the Sun");
\r
4073 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
\r
4075 /* Stop singing before start another */
\r
4076 if (cast || fail) stop_singing();
\r
4080 int sides = plev / 2;
\r
4081 int rad = plev / 10 + 1;
\r
4083 if (info) return info_damage(dice, sides, 0);
\r
4087 msg_print(_("光り輝く歌が辺りを照らした。", "Your uplifting song brings brightness to dark places..."));
\r
4088 lite_area(damroll(dice, sides), rad);
\r
4094 if (name) return _("恐怖の歌", "Song of Fear");
\r
4095 if (desc) return _("視界内の全てのモンスターを恐怖させる。抵抗されると無効。", "Attempts to scare all monsters in sight.");
\r
4097 /* Stop singing before start another */
\r
4098 if (cast || fail) stop_singing();
\r
4102 msg_print(_("おどろおどろしいメロディを奏で始めた...", "You start weaving a fearful pattern..."));
\r
4103 start_singing(spell, MUSIC_FEAR);
\r
4109 if (info) return info_power(power);
\r
4113 project_hack(GF_TURN_ALL, power);
\r
4120 if (name) return _("戦いの歌", "Heroic Ballad");
\r
4121 if (desc) return _("ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
\r
4123 /* Stop singing before start another */
\r
4124 if (cast || fail) stop_singing();
\r
4128 msg_print(_("激しい戦いの歌を歌った...", "You start singing a song of intense fighting..."));
\r
4130 (void)hp_player(10);
\r
4131 (void)set_afraid(0);
\r
4133 /* Recalculate hitpoints */
\r
4134 p_ptr->update |= (PU_HP);
\r
4136 start_singing(spell, MUSIC_HERO);
\r
4143 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
\r
4144 /* Recalculate hitpoints */
\r
4145 p_ptr->update |= (PU_HP);
\r
4152 if (name) return _("霊的知覚", "Clairaudience");
\r
4153 if (desc) return _("近くの罠/扉/階段を感知する。レベル15で全てのモンスター、20で財宝とアイテムを感知できるようになる。レベル25で周辺の地形を感知し、40でその階全体を永久に照らし、ダンジョン内のすべてのアイテムを感知する。この効果は歌い続けることで順に起こる。",
\r
4154 "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
4156 /* Stop singing before start another */
\r
4157 if (cast || fail) stop_singing();
\r
4161 msg_print(_("静かな音楽が感覚を研ぎ澄まさせた...", "Your quiet music sharpens your sense of hearing..."));
\r
4162 /* Hack -- Initialize the turn count */
\r
4163 SINGING_COUNT(p_ptr) = 0;
\r
4164 start_singing(spell, MUSIC_DETECT);
\r
4168 int rad = DETECT_RAD_DEFAULT;
\r
4170 if (info) return info_radius(rad);
\r
4174 int count = SINGING_COUNT(p_ptr);
\r
4176 if (count >= 19) wiz_lite(FALSE);
\r
4180 if (plev > 39 && count < 19)
\r
4181 SINGING_COUNT(p_ptr) = count + 1;
\r
4185 /* There are too many hidden treasure. So... */
\r
4186 /* detect_treasure(rad); */
\r
4187 detect_objects_gold(rad);
\r
4188 detect_objects_normal(rad);
\r
4190 if (plev > 24 && count < 11)
\r
4191 SINGING_COUNT(p_ptr) = count + 1;
\r
4195 detect_monsters_invis(rad);
\r
4196 detect_monsters_normal(rad);
\r
4198 if (plev > 19 && count < 6)
\r
4199 SINGING_COUNT(p_ptr) = count + 1;
\r
4201 detect_traps(rad, TRUE);
\r
4202 detect_doors(rad);
\r
4203 detect_stairs(rad);
\r
4205 if (plev > 14 && count < 3)
\r
4206 SINGING_COUNT(p_ptr) = count + 1;
\r
4213 if (name) return _("魂の歌", "Soul Shriek");
\r
4214 if (desc) return _("視界内の全てのモンスターに対して精神攻撃を行う。", "Damages all monsters in sight with PSI damages.");
\r
4216 /* Stop singing before start another */
\r
4217 if (cast || fail) stop_singing();
\r
4221 msg_print(_("精神を捻じ曲げる歌を歌った...", "You start singing a song of soul in pain..."));
\r
4222 start_singing(spell, MUSIC_PSI);
\r
4227 int sides = plev * 3 / 2;
\r
4229 if (info) return info_damage(dice, sides, 0);
\r
4233 project_hack(GF_PSI, damroll(dice, sides));
\r
4240 if (name) return _("知識の歌", "Song of Lore");
\r
4241 if (desc) return _("自分のいるマスと隣りのマスに落ちているアイテムを鑑定する。", "Identifies all items which are in the adjacent squares.");
\r
4243 /* Stop singing before start another */
\r
4244 if (cast || fail) stop_singing();
\r
4248 msg_print(_("この世界の知識が流れ込んできた...", "You recall the rich lore of the world..."));
\r
4249 start_singing(spell, MUSIC_ID);
\r
4255 if (info) return info_radius(rad);
\r
4259 * MP不足で鑑定が発動される前に歌が中断してしまうのを防止。
\r
4263 project(0, rad, p_ptr->y, p_ptr->x, 0, GF_IDENTIFY, PROJECT_ITEM, -1);
\r
4270 if (name) return _("隠遁の歌", "Hiding Tune");
\r
4271 if (desc) return _("隠密行動能力を上昇させる。", "Gives improved stealth.");
\r
4273 /* Stop singing before start another */
\r
4274 if (cast || fail) stop_singing();
\r
4278 msg_print(_("あなたの姿が景色にとけこんでいった...", "Your song carries you beyond the sight of mortal eyes..."));
\r
4279 start_singing(spell, MUSIC_STEALTH);
\r
4284 if (!p_ptr->tim_stealth)
\r
4286 msg_print(_("姿がはっきりと見えるようになった。", "You are no longer hided."));
\r
4293 if (name) return _("幻影の旋律", "Illusion Pattern");
\r
4294 if (desc) return _("視界内の全てのモンスターを混乱させる。抵抗されると無効。", "Attempts to confuse all monsters in sight.");
\r
4296 /* Stop singing before start another */
\r
4297 if (cast || fail) stop_singing();
\r
4301 msg_print(_("辺り一面に幻影が現れた...", "You weave a pattern of sounds to beguile and confuse..."));
\r
4302 start_singing(spell, MUSIC_CONF);
\r
4306 int power = plev * 2;
\r
4308 if (info) return info_power(power);
\r
4312 confuse_monsters(power);
\r
4319 if (name) return _("破滅の叫び", "Doomcall");
\r
4320 if (desc) return _("視界内の全てのモンスターに対して轟音攻撃を行う。", "Damages all monsters in sight with booming sound.");
\r
4322 /* Stop singing before start another */
\r
4323 if (cast || fail) stop_singing();
\r
4327 msg_print(_("轟音が響いた...", "The fury of the Downfall of Numenor lashes out..."));
\r
4328 start_singing(spell, MUSIC_SOUND);
\r
4332 int dice = 10 + plev / 5;
\r
4335 if (info) return info_damage(dice, sides, 0);
\r
4339 project_hack(GF_SOUND, damroll(dice, sides));
\r
4346 if (name) return _("フィリエルの歌", "Firiel's Song");
\r
4347 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
\r
4350 /* Stop singing before start another */
\r
4351 if (cast || fail) stop_singing();
\r
4355 msg_print(_("生命と復活のテーマを奏で始めた...", "The themes of life and revival are woven into your song..."));
\r
4356 animate_dead(0, p_ptr->y, p_ptr->x);
\r
4362 if (name) return _("旅の仲間", "Fellowship Chant");
\r
4363 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
\r
4365 /* Stop singing before start another */
\r
4366 if (cast || fail) stop_singing();
\r
4370 msg_print(_("安らかなメロディを奏で始めた...", "You weave a slow, soothing melody of imploration..."));
\r
4371 start_singing(spell, MUSIC_CHARM);
\r
4375 int dice = 10 + plev / 15;
\r
4378 if (info) return info_power_dice(dice, sides);
\r
4382 charm_monsters(damroll(dice, sides));
\r
4389 if (name) return _("分解音波", "Sound of disintegration");
\r
4390 if (desc) return _("壁を掘り進む。自分の足元のアイテムは蒸発する。", "Makes you be able to burrow into walls. Objects under your feet evaporate.");
\r
4392 /* Stop singing before start another */
\r
4393 if (cast || fail) stop_singing();
\r
4397 msg_print(_("粉砕するメロディを奏で始めた...", "You weave a violent pattern of sounds to break wall."));
\r
4398 start_singing(spell, MUSIC_WALL);
\r
4404 * MP不足で効果が発動される前に歌が中断してしまうのを防止。
\r
4408 project(0, 0, p_ptr->y, p_ptr->x,
\r
4409 0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1);
\r
4415 if (name) return _("元素耐性", "Finrod's Resistance");
\r
4416 if (desc) return _("酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
\r
4417 "Gives resistance to fire, cold, electricity, acid and poison. These resistances can be added to which from equipment for more powerful resistances.");
\r
4419 /* Stop singing before start another */
\r
4420 if (cast || fail) stop_singing();
\r
4424 msg_print(_("元素の力に対する忍耐の歌を歌った。", "You sing a song of perseverance against powers..."));
\r
4425 start_singing(spell, MUSIC_RESIST);
\r
4430 if (!p_ptr->oppose_acid)
\r
4432 msg_print(_("酸への耐性が薄れた気がする。", "You feel less resistant to acid."));
\r
4435 if (!p_ptr->oppose_elec)
\r
4437 msg_print(_("電撃への耐性が薄れた気がする。", "You feel less resistant to elec."));
\r
4440 if (!p_ptr->oppose_fire)
\r
4442 msg_print(_("火への耐性が薄れた気がする。", "You feel less resistant to fire."));
\r
4445 if (!p_ptr->oppose_cold)
\r
4447 msg_print(_("冷気への耐性が薄れた気がする。", "You feel less resistant to cold."));
\r
4450 if (!p_ptr->oppose_pois)
\r
4452 msg_print(_("毒への耐性が薄れた気がする。", "You feel less resistant to pois."));
\r
4459 if (name) return _("ホビットのメロディ", "Hobbit Melodies");
\r
4460 if (desc) return _("加速する。", "Hastes you.");
\r
4462 /* Stop singing before start another */
\r
4463 if (cast || fail) stop_singing();
\r
4467 msg_print(_("軽快な歌を口ずさみ始めた...", "You start singing joyful pop song..."));
\r
4468 start_singing(spell, MUSIC_SPEED);
\r
4475 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
\r
4482 if (name) return _("歪んだ世界", "World Contortion");
\r
4483 if (desc) return _("近くのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all nearby monsters away unless resisted.");
\r
4486 int rad = plev / 15 + 1;
\r
4487 int power = plev * 3 + 1;
\r
4489 if (info) return info_radius(rad);
\r
4491 /* Stop singing before start another */
\r
4492 if (cast || fail) stop_singing();
\r
4496 msg_print(_("歌が空間を歪めた...", "Reality whirls wildly as you sing a dizzying melody..."));
\r
4497 project(0, rad, p_ptr->y, p_ptr->x, power, GF_AWAY_ALL, PROJECT_KILL, -1);
\r
4503 if (name) return _("退散の歌", "Dispelling chant");
\r
4504 if (desc) return _("視界内の全てのモンスターにダメージを与える。邪悪なモンスターに特に大きなダメージを与える。",
\r
4505 "Damages all monsters in sight. Hurts evil monsters greatly.");
\r
4507 /* Stop singing before start another */
\r
4508 if (cast || fail) stop_singing();
\r
4512 msg_print(_("耐えられない不協和音が敵を責め立てた...", "You cry out in an ear-wracking voice..."));
\r
4513 start_singing(spell, MUSIC_DISPEL);
\r
4517 int m_sides = plev * 3;
\r
4518 int e_sides = plev * 3;
\r
4520 if (info) return format("%s1d%d+1d%d", s_dam, m_sides, e_sides);
\r
4524 dispel_monsters(randint1(m_sides));
\r
4525 dispel_evil(randint1(e_sides));
\r
4531 if (name) return _("サルマンの甘言", "The Voice of Saruman");
\r
4532 if (desc) return _("視界内の全てのモンスターを減速させ、眠らせようとする。抵抗されると無効。", "Attempts to slow and sleep all monsters in sight.");
\r
4534 /* Stop singing before start another */
\r
4535 if (cast || fail) stop_singing();
\r
4539 msg_print(_("優しく、魅力的な歌を口ずさみ始めた...", "You start humming a gentle and attractive song..."));
\r
4540 start_singing(spell, MUSIC_SARUMAN);
\r
4546 if (info) return info_power(power);
\r
4550 slow_monsters(plev);
\r
4551 sleep_monsters(plev);
\r
4558 if (name) return _("嵐の音色", "Song of the Tempest");
\r
4559 if (desc) return _("轟音のビームを放つ。", "Fires a beam of sound.");
\r
4562 int dice = 15 + (plev - 1) / 2;
\r
4565 if (info) return info_damage(dice, sides, 0);
\r
4567 /* Stop singing before start another */
\r
4568 if (cast || fail) stop_singing();
\r
4572 if (!get_aim_dir(&dir)) return NULL;
\r
4574 fire_beam(GF_SOUND, dir, damroll(dice, sides));
\r
4580 if (name) return _("もう一つの世界", "Ambarkanta");
\r
4581 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
\r
4587 if (info) return info_delay(base, sides);
\r
4589 /* Stop singing before start another */
\r
4590 if (cast || fail) stop_singing();
\r
4594 msg_print(_("周囲が変化し始めた...", "You sing of the primeval shaping of Middle-earth..."));
\r
4601 if (name) return _("破壊の旋律", "Wrecking Pattern");
\r
4602 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
\r
4603 "Shakes dungeon structure, and results in random swapping of floors and walls.");
\r
4605 /* Stop singing before start another */
\r
4606 if (cast || fail) stop_singing();
\r
4610 msg_print(_("破壊的な歌が響きわたった...", "You weave a pattern of sounds to contort and shatter..."));
\r
4611 start_singing(spell, MUSIC_QUAKE);
\r
4617 if (info) return info_radius(rad);
\r
4621 earthquake(p_ptr->y, p_ptr->x, 10);
\r
4629 if (name) return _("停滞の歌", "Stationary Shriek");
\r
4630 if (desc) return _("視界内の全てのモンスターを麻痺させようとする。抵抗されると無効。", "Attempts to freeze all monsters in sight.");
\r
4632 /* Stop singing before start another */
\r
4633 if (cast || fail) stop_singing();
\r
4637 msg_print(_("ゆっくりとしたメロディを奏で始めた...", "You weave a very slow pattern which is almost likely to stop..."));
\r
4638 start_singing(spell, MUSIC_STASIS);
\r
4642 int power = plev * 4;
\r
4644 if (info) return info_power(power);
\r
4648 stasis_monsters(power);
\r
4655 if (name) return _("守りの歌", "Endurance");
\r
4656 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。",
\r
4657 "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
4660 /* Stop singing before start another */
\r
4661 if (cast || fail) stop_singing();
\r
4665 msg_print(_("歌が神聖な場を作り出した...", "The holy power of the Music is creating sacred field..."));
\r
4672 if (name) return _("英雄の詩", "The Hero's Poem");
\r
4673 if (desc) return _("加速し、ヒーロー気分になり、視界内の全てのモンスターにダメージを与える。",
\r
4674 "Hastes you. Gives heroism. Damages all monsters in sight.");
\r
4676 /* Stop singing before start another */
\r
4677 if (cast || fail) stop_singing();
\r
4681 msg_print(_("英雄の歌を口ずさんだ...", "You chant a powerful, heroic call to arms..."));
\r
4682 (void)hp_player(10);
\r
4683 (void)set_afraid(0);
\r
4685 /* Recalculate hitpoints */
\r
4686 p_ptr->update |= (PU_HP);
\r
4688 start_singing(spell, MUSIC_SHERO);
\r
4695 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
\r
4696 /* Recalculate hitpoints */
\r
4697 p_ptr->update |= (PU_HP);
\r
4702 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
\r
4708 int sides = plev * 3;
\r
4710 if (info) return info_damage(dice, sides, 0);
\r
4714 dispel_monsters(damroll(dice, sides));
\r
4720 if (name) return _("ヤヴァンナの助け", "Relief of Yavanna");
\r
4721 if (desc) return _("強力な回復の歌で、負傷と朦朧状態も全快する。", "Powerful healing song. Also heals cut and stun completely.");
\r
4723 /* Stop singing before start another */
\r
4724 if (cast || fail) stop_singing();
\r
4728 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing the song..."));
\r
4729 start_singing(spell, MUSIC_H_LIFE);
\r
4736 if (info) return info_heal(dice, sides, 0);
\r
4740 hp_player(damroll(dice, sides));
\r
4749 if (name) return _("再生の歌", "Goddess' rebirth");
\r
4750 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
\r
4753 /* Stop singing before start another */
\r
4754 if (cast || fail) stop_singing();
\r
4758 msg_print(_("暗黒の中に光と美をふりまいた。体が元の活力を取り戻した。",
\r
4759 "You strewed light and beauty in the dark as you sing. You feel refreshed."));
\r
4760 (void)do_res_stat(A_STR);
\r
4761 (void)do_res_stat(A_INT);
\r
4762 (void)do_res_stat(A_WIS);
\r
4763 (void)do_res_stat(A_DEX);
\r
4764 (void)do_res_stat(A_CON);
\r
4765 (void)do_res_stat(A_CHR);
\r
4766 (void)restore_level();
\r
4772 if (name) return _("サウロンの魔術", "Wizardry of Sauron");
\r
4773 if (desc) return _("非常に強力でごく小さい轟音の球を放つ。", "Fires an extremely powerful tiny ball of sound.");
\r
4776 int dice = 50 + plev;
\r
4780 if (info) return info_damage(dice, sides, 0);
\r
4782 /* Stop singing before start another */
\r
4783 if (cast || fail) stop_singing();
\r
4787 if (!get_aim_dir(&dir)) return NULL;
\r
4789 fire_ball(GF_SOUND, dir, damroll(dice, sides), rad);
\r
4795 if (name) return _("フィンゴルフィンの挑戦", "Fingolfin's Challenge");
\r
4796 if (desc) return _("ダメージを受けなくなるバリアを張る。",
\r
4797 "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks.");
\r
4799 /* Stop singing before start another */
\r
4800 if (cast || fail) stop_singing();
\r
4804 msg_print(_("フィンゴルフィンの冥王への挑戦を歌った...",
\r
4805 "You recall the valor of Fingolfin's challenge to the Dark Lord..."));
\r
4808 p_ptr->redraw |= (PR_MAP);
\r
4810 /* Update monsters */
\r
4811 p_ptr->update |= (PU_MONSTERS);
\r
4813 /* Window stuff */
\r
4814 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
\r
4816 start_singing(spell, MUSIC_INVULN);
\r
4821 if (!p_ptr->invuln)
\r
4823 msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));
\r
4825 p_ptr->redraw |= (PR_MAP);
\r
4827 /* Update monsters */
\r
4828 p_ptr->update |= (PU_MONSTERS);
\r
4830 /* Window stuff */
\r
4831 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
\r
4842 * @brief 剣術の各処理を行う
\r
4843 * @param spell 剣術ID
\r
4844 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_CAST)
\r
4845 * @return SPELL_NAME / SPELL_DESC 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
4847 static cptr do_hissatsu_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
4849 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
4850 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
4851 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
4854 int plev = p_ptr->lev;
\r
4859 if (name) return _("飛飯綱", "Tobi-Izuna");
\r
4860 if (desc) return _("2マス離れたところにいるモンスターを攻撃する。", "Attacks a two squares distant monster.");
\r
4864 project_length = 2;
\r
4865 if (!get_aim_dir(&dir)) return NULL;
\r
4867 project_hook(GF_ATTACK, dir, HISSATSU_2, PROJECT_STOP | PROJECT_KILL);
\r
4872 if (name) return _("五月雨斬り", "3-Way Attack");
\r
4873 if (desc) return _("3方向に対して攻撃する。", "Attacks in 3 directions in one time.");
\r
4880 if (!get_rep_dir2(&dir)) return NULL;
\r
4881 if (dir == 5) return NULL;
\r
4883 for (cdir = 0;cdir < 8; cdir++)
\r
4885 if (cdd[cdir] == dir) break;
\r
4888 if (cdir == 8) return NULL;
\r
4890 y = p_ptr->y + ddy_cdd[cdir];
\r
4891 x = p_ptr->x + ddx_cdd[cdir];
\r
4892 if (cave[y][x].m_idx)
\r
4893 py_attack(y, x, 0);
\r
4895 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
\r
4897 y = p_ptr->y + ddy_cdd[(cdir + 7) % 8];
\r
4898 x = p_ptr->x + ddx_cdd[(cdir + 7) % 8];
\r
4899 if (cave[y][x].m_idx)
\r
4900 py_attack(y, x, 0);
\r
4902 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
\r
4904 y = p_ptr->y + ddy_cdd[(cdir + 1) % 8];
\r
4905 x = p_ptr->x + ddx_cdd[(cdir + 1) % 8];
\r
4906 if (cave[y][x].m_idx)
\r
4907 py_attack(y, x, 0);
\r
4909 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
\r
4914 if (name) return _("ブーメラン", "Boomerang");
\r
4915 if (desc) return _("武器を手元に戻ってくるように投げる。戻ってこないこともある。",
\r
4916 "Throws current weapon. And it'll return to your hand unless failed.");
\r
4920 if (!do_cmd_throw(1, TRUE, -1)) return NULL;
\r
4925 if (name) return _("焔霊", "Burning Strike");
\r
4926 if (desc) return _("火炎耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to fire.");
\r
4932 if (!get_rep_dir2(&dir)) return NULL;
\r
4933 if (dir == 5) return NULL;
\r
4935 y = p_ptr->y + ddy[dir];
\r
4936 x = p_ptr->x + ddx[dir];
\r
4938 if (cave[y][x].m_idx)
\r
4939 py_attack(y, x, HISSATSU_FIRE);
\r
4942 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
4949 if (name) return _("殺気感知", "Detect Ferocity");
\r
4950 if (desc) return _("近くの思考することができるモンスターを感知する。", "Detects all monsters except mindless in your vicinity.");
\r
4954 detect_monsters_mind(DETECT_RAD_DEFAULT);
\r
4959 if (name) return _("みね打ち", "Strike to Stun");
\r
4960 if (desc) return _("相手にダメージを与えないが、朦朧とさせる。", "Attempts to stun a monster in the adjacent.");
\r
4966 if (!get_rep_dir2(&dir)) return NULL;
\r
4967 if (dir == 5) return NULL;
\r
4969 y = p_ptr->y + ddy[dir];
\r
4970 x = p_ptr->x + ddx[dir];
\r
4972 if (cave[y][x].m_idx)
\r
4973 py_attack(y, x, HISSATSU_MINEUCHI);
\r
4976 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
4983 if (name) return _("カウンター", "Counter");
\r
4984 if (desc) return _("相手に攻撃されたときに反撃する。反撃するたびにMPを消費。",
\r
4985 "Prepares to counterattack. When attack by a monster, strikes back using SP each time.");
\r
4989 if (p_ptr->riding)
\r
4991 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
\r
4994 msg_print(_("相手の攻撃に対して身構えた。", "You prepare to counter blow."));
\r
4995 p_ptr->counter = TRUE;
\r
5000 if (name) return _("払い抜け", "Harainuke");
\r
5001 if (desc) return _("攻撃した後、反対側に抜ける。",
\r
5002 "Attacks monster with your weapons normally, then move through counter side of the monster.");
\r
5008 if (p_ptr->riding)
\r
5010 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
\r
5014 if (!get_rep_dir2(&dir)) return NULL;
\r
5016 if (dir == 5) return NULL;
\r
5017 y = p_ptr->y + ddy[dir];
\r
5018 x = p_ptr->x + ddx[dir];
\r
5020 if (!cave[y][x].m_idx)
\r
5022 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
5026 py_attack(y, x, 0);
\r
5028 if (!player_can_enter(cave[y][x].feat, 0) || is_trap(cave[y][x].feat))
\r
5034 if (player_can_enter(cave[y][x].feat, 0) && !is_trap(cave[y][x].feat) && !cave[y][x].m_idx)
\r
5038 /* Move the player */
\r
5039 (void)move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);
\r
5045 if (name) return _("サーペンツタン", "Serpent's Tongue");
\r
5046 if (desc) return _("毒耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to poison.");
\r
5052 if (!get_rep_dir2(&dir)) return NULL;
\r
5053 if (dir == 5) return NULL;
\r
5055 y = p_ptr->y + ddy[dir];
\r
5056 x = p_ptr->x + ddx[dir];
\r
5058 if (cave[y][x].m_idx)
\r
5059 py_attack(y, x, HISSATSU_POISON);
\r
5062 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
5069 if (name) return _("斬魔剣弐の太刀", "Zammaken");
\r
5070 if (desc) return _("生命のない邪悪なモンスターに大ダメージを与えるが、他のモンスターには全く効果がない。",
\r
5071 "Attacks an evil unliving monster with great damage. No effect to other monsters.");
\r
5077 if (!get_rep_dir2(&dir)) return NULL;
\r
5078 if (dir == 5) return NULL;
\r
5080 y = p_ptr->y + ddy[dir];
\r
5081 x = p_ptr->x + ddx[dir];
\r
5083 if (cave[y][x].m_idx)
\r
5084 py_attack(y, x, HISSATSU_ZANMA);
\r
5087 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
5094 if (name) return _("裂風剣", "Wind Blast");
\r
5095 if (desc) return _("攻撃した相手を後方へ吹き飛ばす。", "Attacks an adjacent monster, and blow it away.");
\r
5101 if (!get_rep_dir2(&dir)) return NULL;
\r
5102 if (dir == 5) return NULL;
\r
5104 y = p_ptr->y + ddy[dir];
\r
5105 x = p_ptr->x + ddx[dir];
\r
5107 if (cave[y][x].m_idx)
\r
5108 py_attack(y, x, 0);
\r
5111 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
5114 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
\r
5118 if (cave[y][x].m_idx)
\r
5121 POSITION ty = y, tx = x;
\r
5122 POSITION oy = y, ox = x;
\r
5123 MONSTER_IDX m_idx = cave[y][x].m_idx;
\r
5124 monster_type *m_ptr = &m_list[m_idx];
\r
5127 monster_desc(m_name, m_ptr, 0);
\r
5129 for (i = 0; i < 5; i++)
\r
5133 if (cave_empty_bold(y, x))
\r
5140 if ((ty != oy) || (tx != ox))
\r
5142 msg_format(_("%sを吹き飛ばした!", "You blow %s away!"), m_name);
\r
5143 cave[oy][ox].m_idx = 0;
\r
5144 cave[ty][tx].m_idx = m_idx;
\r
5148 update_mon(m_idx, TRUE);
\r
5149 lite_spot(oy, ox);
\r
5150 lite_spot(ty, tx);
\r
5152 if (r_info[m_ptr->r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))
\r
5153 p_ptr->update |= (PU_MON_LITE);
\r
5160 if (name) return _("刀匠の目利き", "Judge");
\r
5161 if (desc) return _("武器・防具を1つ識別する。レベル45以上で武器・防具の能力を完全に知ることができる。",
\r
5162 "Identifies a weapon or armor. Or *identifies* these at level 45.");
\r
5168 if (!identify_fully(TRUE)) return NULL;
\r
5172 if (!ident_spell(TRUE)) return NULL;
\r
5178 if (name) return _("破岩斬", "Rock Smash");
\r
5179 if (desc) return _("岩を壊し、岩石系のモンスターに大ダメージを与える。", "Breaks rock. Or greatly damage a monster made by rocks.");
\r
5185 if (!get_rep_dir2(&dir)) return NULL;
\r
5186 if (dir == 5) return NULL;
\r
5188 y = p_ptr->y + ddy[dir];
\r
5189 x = p_ptr->x + ddx[dir];
\r
5191 if (cave[y][x].m_idx)
\r
5192 py_attack(y, x, HISSATSU_HAGAN);
\r
5194 if (!cave_have_flag_bold(y, x, FF_HURT_ROCK)) break;
\r
5196 /* Destroy the feature */
\r
5197 cave_alter_feat(y, x, FF_HURT_ROCK);
\r
5199 /* Update some things */
\r
5200 p_ptr->update |= (PU_FLOW);
\r
5205 if (name) return _("乱れ雪月花", "Midare-Setsugekka");
\r
5206 if (desc) return _("攻撃回数が増え、冷気耐性のないモンスターに大ダメージを与える。",
\r
5207 "Attacks a monster with increased number of attacks and more damage unless it has resistance to cold.");
\r
5213 if (!get_rep_dir2(&dir)) return NULL;
\r
5214 if (dir == 5) return NULL;
\r
5216 y = p_ptr->y + ddy[dir];
\r
5217 x = p_ptr->x + ddx[dir];
\r
5219 if (cave[y][x].m_idx)
\r
5220 py_attack(y, x, HISSATSU_COLD);
\r
5223 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
5230 if (name) return _("急所突き", "Spot Aiming");
\r
5231 if (desc) return _("モンスターを一撃で倒す攻撃を繰り出す。失敗すると1点しかダメージを与えられない。",
\r
5232 "Attempts to kill a monster instantly. If failed cause only 1HP of damage.");
\r
5238 if (!get_rep_dir2(&dir)) return NULL;
\r
5239 if (dir == 5) return NULL;
\r
5241 y = p_ptr->y + ddy[dir];
\r
5242 x = p_ptr->x + ddx[dir];
\r
5244 if (cave[y][x].m_idx)
\r
5245 py_attack(y, x, HISSATSU_KYUSHO);
\r
5248 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
5255 if (name) return _("魔神斬り", "Majingiri");
\r
5256 if (desc) return _("会心の一撃で攻撃する。攻撃がかわされやすい。",
\r
5257 "Attempts to attack with critical hit. But this attack is easy to evade for a monster.");
\r
5263 if (!get_rep_dir2(&dir)) return NULL;
\r
5264 if (dir == 5) return NULL;
\r
5266 y = p_ptr->y + ddy[dir];
\r
5267 x = p_ptr->x + ddx[dir];
\r
5269 if (cave[y][x].m_idx)
\r
5270 py_attack(y, x, HISSATSU_MAJIN);
\r
5273 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
5280 if (name) return _("捨て身", "Desperate Attack");
\r
5281 if (desc) return _("強力な攻撃を繰り出す。次のターンまでの間、食らうダメージが増える。",
\r
5282 "Attacks with all of your power. But all damages you take will be doubled for one turn.");
\r
5288 if (!get_rep_dir2(&dir)) return NULL;
\r
5289 if (dir == 5) return NULL;
\r
5291 y = p_ptr->y + ddy[dir];
\r
5292 x = p_ptr->x + ddx[dir];
\r
5294 if (cave[y][x].m_idx)
\r
5295 py_attack(y, x, HISSATSU_SUTEMI);
\r
5298 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
5301 p_ptr->sutemi = TRUE;
\r
5306 if (name) return _("雷撃鷲爪斬", "Lightning Eagle");
\r
5307 if (desc) return _("電撃耐性のないモンスターに非常に大きいダメージを与える。",
\r
5308 "Attacks a monster with more damage unless it has resistance to electricity.");
\r
5314 if (!get_rep_dir2(&dir)) return NULL;
\r
5315 if (dir == 5) return NULL;
\r
5317 y = p_ptr->y + ddy[dir];
\r
5318 x = p_ptr->x + ddx[dir];
\r
5320 if (cave[y][x].m_idx)
\r
5321 py_attack(y, x, HISSATSU_ELEC);
\r
5324 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
5331 if (name) return _("入身", "Rush Attack");
\r
5332 if (desc) return _("素早く相手に近寄り攻撃する。", "Steps close to a monster and attacks at a time.");
\r
5336 if (!rush_attack(NULL)) return NULL;
\r
5341 if (name) return _("赤流渦", "Bloody Maelstrom");
\r
5342 if (desc) return _("自分自身も傷を作りつつ、その傷が深いほど大きい威力で全方向の敵を攻撃できる。生きていないモンスターには効果がない。",
\r
5343 "Attacks all adjacent monsters with power corresponding to your cut status. Then increases your cut status. No effect to unliving monsters.");
\r
5350 monster_type *m_ptr;
\r
5352 if (p_ptr->cut < 300)
\r
5353 set_cut(p_ptr->cut + 300);
\r
5355 set_cut(p_ptr->cut * 2);
\r
5357 for (dir = 0; dir < 8; dir++)
\r
5359 y = p_ptr->y + ddy_ddd[dir];
\r
5360 x = p_ptr->x + ddx_ddd[dir];
\r
5361 c_ptr = &cave[y][x];
\r
5363 /* Get the monster */
\r
5364 m_ptr = &m_list[c_ptr->m_idx];
\r
5366 /* Hack -- attack monsters */
\r
5367 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
\r
5369 if (!monster_living(&r_info[m_ptr->r_idx]))
\r
5373 monster_desc(m_name, m_ptr, 0);
\r
5374 msg_format(_("%sには効果がない!", "%s is unharmed!"), m_name);
\r
5376 else py_attack(y, x, HISSATSU_SEKIRYUKA);
\r
5383 if (name) return _("激震撃", "Earthquake Blow");
\r
5384 if (desc) return _("地震を起こす。", "Shakes dungeon structure, and results in random swapping of floors and walls.");
\r
5390 if (!get_rep_dir2(&dir)) return NULL;
\r
5391 if (dir == 5) return NULL;
\r
5393 y = p_ptr->y + ddy[dir];
\r
5394 x = p_ptr->x + ddx[dir];
\r
5396 if (cave[y][x].m_idx)
\r
5397 py_attack(y, x, HISSATSU_QUAKE);
\r
5399 earthquake(p_ptr->y, p_ptr->x, 10);
\r
5404 if (name) return _("地走り", "Crack");
\r
5405 if (desc) return _("衝撃波のビームを放つ。", "Fires a beam of shock wave.");
\r
5409 int total_damage = 0, basedam, i;
\r
5410 u32b flgs[TR_FLAG_SIZE];
\r
5411 object_type *o_ptr;
\r
5412 if (!get_aim_dir(&dir)) return NULL;
\r
5413 msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
\r
5414 for (i = 0; i < 2; i++)
\r
5418 if (!buki_motteruka(INVEN_RARM+i)) break;
\r
5419 o_ptr = &inventory[INVEN_RARM+i];
\r
5420 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
\r
5421 damage = o_ptr->to_d * 100;
\r
5422 object_flags(o_ptr, flgs);
\r
5423 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
\r
5425 /* vorpal blade */
\r
5429 else if (have_flag(flgs, TR_VORPAL))
\r
5431 /* vorpal flag only */
\r
5435 damage += basedam;
\r
5436 damage *= p_ptr->num_blow[i];
\r
5437 total_damage += damage / 200;
\r
5438 if (i) total_damage = total_damage*7/10;
\r
5440 fire_beam(GF_FORCE, dir, total_damage);
\r
5445 if (name) return _("気迫の雄叫び", "War Cry");
\r
5446 if (desc) return _("視界内の全モンスターに対して轟音の攻撃を行う。さらに、近くにいるモンスターを怒らせる。",
\r
5447 "Damages all monsters in sight with sound. Aggravate nearby monsters.");
\r
5451 msg_print(_("雄叫びをあげた!", "You roar out!"));
\r
5452 project_hack(GF_SOUND, randint1(plev * 3));
\r
5453 aggravate_monsters(0);
\r
5458 if (name) return _("無双三段", "Musou-Sandan");
\r
5459 if (desc) return _("強力な3段攻撃を繰り出す。", "Attacks with powerful 3 strikes.");
\r
5465 if (!get_rep_dir2(&dir)) return NULL;
\r
5466 if (dir == 5) return NULL;
\r
5468 for (i = 0; i < 3; i++)
\r
5472 MONSTER_IDX m_idx;
\r
5474 monster_type *m_ptr;
\r
5476 y = p_ptr->y + ddy[dir];
\r
5477 x = p_ptr->x + ddx[dir];
\r
5478 c_ptr = &cave[y][x];
\r
5481 py_attack(y, x, HISSATSU_3DAN);
\r
5484 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
5488 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
\r
5493 /* Monster is dead? */
\r
5494 if (!c_ptr->m_idx) break;
\r
5496 ny = y + ddy[dir];
\r
5497 nx = x + ddx[dir];
\r
5498 m_idx = c_ptr->m_idx;
\r
5499 m_ptr = &m_list[m_idx];
\r
5501 /* Monster cannot move back? */
\r
5502 if (!monster_can_enter(ny, nx, &r_info[m_ptr->r_idx], 0))
\r
5505 if (i < 2) msg_print(NULL);
\r
5510 cave[ny][nx].m_idx = m_idx;
\r
5514 update_mon(m_idx, TRUE);
\r
5516 /* Redraw the old spot */
\r
5519 /* Redraw the new spot */
\r
5520 lite_spot(ny, nx);
\r
5522 /* Player can move forward? */
\r
5523 if (player_can_enter(c_ptr->feat, 0))
\r
5525 /* Move the player */
\r
5526 if (!move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP)) break;
\r
5534 if (i < 2) msg_print(NULL);
\r
5540 if (name) return _("吸血鬼の牙", "Vampire's Fang");
\r
5541 if (desc) return _("攻撃した相手の体力を吸いとり、自分の体力を回復させる。生命を持たないモンスターには通じない。",
\r
5542 "Attacks with vampiric strikes which absorbs HP from a monster and gives them to you. No effect to unliving monsters.");
\r
5548 if (!get_rep_dir2(&dir)) return NULL;
\r
5549 if (dir == 5) return NULL;
\r
5551 y = p_ptr->y + ddy[dir];
\r
5552 x = p_ptr->x + ddx[dir];
\r
5554 if (cave[y][x].m_idx)
\r
5555 py_attack(y, x, HISSATSU_DRAIN);
\r
5558 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
5565 if (name) return _("幻惑", "Moon Dazzling");
\r
5566 if (desc) return _("視界内の起きている全モンスターに朦朧、混乱、眠りを与えようとする。", "Attempts to stun, confuse and sleep all waking monsters.");
\r
5570 msg_print(_("武器を不規則に揺らした...", "You irregularly wave your weapon..."));
\r
5571 project_hack(GF_ENGETSU, plev * 4);
\r
5572 project_hack(GF_ENGETSU, plev * 4);
\r
5573 project_hack(GF_ENGETSU, plev * 4);
\r
5578 if (name) return _("百人斬り", "Hundred Slaughter");
\r
5579 if (desc) return _("連続して入身でモンスターを攻撃する。攻撃するたびにMPを消費。MPがなくなるか、モンスターを倒せなかったら百人斬りは終了する。",
\r
5580 "Performs a series of rush attacks. The series continues while killing each monster in a time and SP remains.");
\r
5584 const int mana_cost_per_monster = 8;
\r
5585 bool is_new = TRUE;
\r
5590 if (!rush_attack(&mdeath)) break;
\r
5593 /* Reserve needed mana point */
\r
5594 p_ptr->csp -= technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
\r
5598 p_ptr->csp -= mana_cost_per_monster;
\r
5600 if (!mdeath) break;
\r
5603 p_ptr->redraw |= PR_MANA;
\r
5606 while (p_ptr->csp > mana_cost_per_monster);
\r
5608 if (is_new) return NULL;
\r
5610 /* Restore reserved mana */
\r
5611 p_ptr->csp += technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
\r
5616 if (name) return _("天翔龍閃", "Dragonic Flash");
\r
5617 if (desc) return _("視界内の場所を指定して、その場所と自分の間にいる全モンスターを攻撃し、その場所に移動する。",
\r
5618 "Runs toward given location while attacking all monsters on the path.");
\r
5624 if (!tgt_pt(&x, &y)) return NULL;
\r
5626 if (!cave_player_teleportable_bold(y, x, 0L) ||
\r
5627 (distance(y, x, p_ptr->y, p_ptr->x) > MAX_SIGHT / 2) ||
\r
5628 !projectable(p_ptr->y, p_ptr->x, y, x))
\r
5630 msg_print(_("失敗!", "You cannot move to that place!"));
\r
5633 if (p_ptr->anti_tele)
\r
5635 msg_print(_("不思議な力がテレポートを防いだ!", "A mysterious force prevents you from teleporting!"));
\r
5638 project(0, 0, y, x, HISSATSU_ISSEN, GF_ATTACK, PROJECT_BEAM | PROJECT_KILL, -1);
\r
5639 teleport_player_to(y, x, 0L);
\r
5644 if (name) return _("二重の剣撃", "Twin Slash");
\r
5645 if (desc) return _("1ターンで2度攻撃を行う。", "double attacks at a time.");
\r
5651 if (!get_rep_dir(&dir, FALSE)) return NULL;
\r
5653 y = p_ptr->y + ddy[dir];
\r
5654 x = p_ptr->x + ddx[dir];
\r
5656 if (cave[y][x].m_idx)
\r
5658 py_attack(y, x, 0);
\r
5659 if (cave[y][x].m_idx)
\r
5662 py_attack(y, x, 0);
\r
5667 msg_print(_("その方向にはモンスターはいません。", "You don't see any monster in this direction"));
\r
5674 if (name) return _("虎伏絶刀勢", "Kofuku-Zettousei");
\r
5675 if (desc) return _("強力な攻撃を行い、近くの場所にも効果が及ぶ。", "Performs a powerful attack which even effect nearby monsters.");
\r
5679 int total_damage = 0, basedam, i;
\r
5681 u32b flgs[TR_FLAG_SIZE];
\r
5682 object_type *o_ptr;
\r
5684 if (!get_rep_dir2(&dir)) return NULL;
\r
5685 if (dir == 5) return NULL;
\r
5687 y = p_ptr->y + ddy[dir];
\r
5688 x = p_ptr->x + ddx[dir];
\r
5690 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
\r
5692 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));
\r
5695 msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
\r
5696 for (i = 0; i < 2; i++)
\r
5699 if (!buki_motteruka(INVEN_RARM+i)) break;
\r
5700 o_ptr = &inventory[INVEN_RARM+i];
\r
5701 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
\r
5702 damage = o_ptr->to_d * 100;
\r
5703 object_flags(o_ptr, flgs);
\r
5704 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
\r
5706 /* vorpal blade */
\r
5710 else if (have_flag(flgs, TR_VORPAL))
\r
5712 /* vorpal flag only */
\r
5716 damage += basedam;
\r
5717 damage += p_ptr->to_d[i] * 100;
\r
5718 damage *= p_ptr->num_blow[i];
\r
5719 total_damage += (damage / 100);
\r
5721 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
5726 if (name) return _("慶雲鬼忍剣", "Keiun-Kininken");
\r
5727 if (desc) return _("自分もダメージをくらうが、相手に非常に大きなダメージを与える。アンデッドには特に効果がある。",
\r
5728 "Attacks a monster with extremely powerful damage. But you also takes some damages. Hurts a undead monster greatly.");
\r
5734 if (!get_rep_dir2(&dir)) return NULL;
\r
5735 if (dir == 5) return NULL;
\r
5737 y = p_ptr->y + ddy[dir];
\r
5738 x = p_ptr->x + ddx[dir];
\r
5740 if (cave[y][x].m_idx)
\r
5741 py_attack(y, x, HISSATSU_UNDEAD);
\r
5744 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
\r
5747 take_hit(DAMAGE_NOESCAPE, 100 + randint1(100), _("慶雲鬼忍剣を使った衝撃", "exhaustion on using Keiun-Kininken"), -1);
\r
5752 if (name) return _("切腹", "Harakiri");
\r
5753 if (desc) return _("「武士道とは、死ぬことと見つけたり。」", "'Busido is found in death'");
\r
5758 if (!get_check(_("本当に自殺しますか?", "Do you really want to commit suicide? "))) return NULL;
\r
5759 /* Special Verification for suicide */
\r
5760 prt(_("確認のため '@' を押して下さい。", "Please verify SUICIDE by typing the '@' sign: "), 0, 0);
\r
5765 if (i != '@') return NULL;
\r
5766 if (p_ptr->total_winner)
\r
5768 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
\r
5769 p_ptr->total_winner = TRUE;
\r
5773 msg_print(_("武士道とは、死ぬことと見つけたり。", "Meaning of Bushi-do is found in the death."));
\r
5774 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
\r
5784 * @brief 呪術領域の武器呪縛の対象にできる武器かどうかを返す。 / An "item_tester_hook" for offer
\r
5785 * @param o_ptr オブジェクト構造体の参照ポインタ
\r
5786 * @return 呪縛可能な武器ならばTRUEを返す
\r
5788 static bool item_tester_hook_weapon_except_bow(object_type *o_ptr)
\r
5790 switch (o_ptr->tval)
\r
5805 * @brief 呪術領域の各処理に使える呪われた装備かどうかを返す。 / An "item_tester_hook" for offer
\r
5806 * @param o_ptr オブジェクト構造体の参照ポインタ
\r
5807 * @return 使える装備ならばTRUEを返す
\r
5809 static bool item_tester_hook_cursed(object_type *o_ptr)
\r
5811 return (bool)(object_is_cursed(o_ptr));
\r
5815 * @brief 呪術領域魔法の各処理を行う
\r
5816 * @param spell 魔法ID
\r
5817 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_CONT / SPELL_STOP)
\r
5818 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
\r
5820 static cptr do_hex_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
5822 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
5823 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
5824 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
5825 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
5826 bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
\r
5827 bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
\r
5831 PLAYER_LEVEL plev = p_ptr->lev;
\r
5836 /*** 1st book (0-7) ***/
\r
5838 if (name) return _("邪なる祝福", "Evily blessing");
\r
5839 if (desc) return _("祝福により攻撃精度と防御力が上がる。", "Attempts to increase +to_hit of a weapon and AC");
\r
5842 if (!p_ptr->blessed)
\r
5844 msg_print(_("高潔な気分になった!", "You feel righteous!"));
\r
5849 if (!p_ptr->blessed)
\r
5851 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
\r
5857 if (name) return _("軽傷の治癒", "Cure light wounds");
\r
5858 if (desc) return _("HPや傷を少し回復させる。", "Heals cut and HP a little.");
\r
5859 if (info) return info_heal(1, 10, 0);
\r
5862 msg_print(_("気分が良くなってくる。", "You feel better and better."));
\r
5866 hp_player(damroll(1, 10));
\r
5867 set_cut(p_ptr->cut - 10);
\r
5872 if (name) return _("悪魔のオーラ", "Demonic aura");
\r
5873 if (desc) return _("炎のオーラを身にまとい、回復速度が速くなる。", "Gives fire aura and regeneration.");
\r
5876 msg_print(_("体が炎のオーラで覆われた。", "You have enveloped by fiery aura!"));
\r
5880 msg_print(_("炎のオーラが消え去った。", "Fiery aura disappeared."));
\r
5885 if (name) return _("悪臭霧", "Stinking mist");
\r
5886 if (desc) return _("視界内のモンスターに微弱量の毒のダメージを与える。", "Deals few damages of poison to all monsters in your sight.");
\r
5887 power = plev / 2 + 5;
\r
5888 if (info) return info_damage(1, power, 0);
\r
5891 project_hack(GF_POIS, randint1(power));
\r
5896 if (name) return _("腕力強化", "Extra might");
\r
5897 if (desc) return _("術者の腕力を上昇させる。", "Attempts to increase your strength.");
\r
5900 msg_print(_("何だか力が湧いて来る。", "You feel you get stronger."));
\r
5905 if (name) return _("武器呪縛", "Curse weapon");
\r
5906 if (desc) return _("装備している武器を呪う。", "Curses your weapon.");
\r
5911 char o_name[MAX_NLEN];
\r
5912 object_type *o_ptr;
\r
5913 u32b f[TR_FLAG_SIZE];
\r
5915 item_tester_hook = item_tester_hook_weapon_except_bow;
\r
5916 q = _("どれを呪いますか?", "Which weapon do you curse?");
\r
5917 s = _("武器を装備していない。", "You wield no weapons.");
\r
5919 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
\r
5921 o_ptr = &inventory[item];
\r
5922 object_desc(o_name, o_ptr, OD_NAME_ONLY);
\r
5923 object_flags(o_ptr, f);
\r
5925 if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
\r
5927 if (!one_in_(3) &&
\r
5928 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
\r
5930 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
\r
5933 if (o_ptr->to_d > 0)
\r
5935 o_ptr->to_d -= randint1(3) % 2;
\r
5936 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
\r
5938 if (o_ptr->to_h > 0)
\r
5940 o_ptr->to_h -= randint1(3) % 2;
\r
5941 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
\r
5943 if (o_ptr->to_a > 0)
\r
5945 o_ptr->to_a -= randint1(3) % 2;
\r
5946 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
\r
5948 msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
\r
5953 int curse_rank = 0;
\r
5954 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
\r
5955 o_ptr->curse_flags |= (TRC_CURSED);
\r
5957 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
\r
5960 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
\r
5963 o_ptr->curse_flags |= (TRC_TY_CURSE);
\r
5964 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
\r
5966 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
\r
5967 add_flag(o_ptr->art_flags, TR_VORPAL);
\r
5968 add_flag(o_ptr->art_flags, TR_VAMPIRIC);
\r
5969 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
\r
5974 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);
\r
5977 p_ptr->update |= (PU_BONUS);
\r
5983 if (name) return _("邪悪感知", "Evil detection");
\r
5984 if (desc) return _("周囲の邪悪なモンスターを感知する。", "Detects evil monsters.");
\r
5985 if (info) return info_range(MAX_SIGHT);
\r
5988 msg_print(_("邪悪な生物の存在を感じ取ろうとした。", "You attend to the presence of evil creatures."));
\r
5993 if (name) return _("我慢", "Patience");
\r
5994 if (desc) return _("数ターン攻撃を耐えた後、受けたダメージを地獄の業火として周囲に放出する。",
\r
5995 "Bursts hell fire strongly after patients any damage while few turns.");
\r
5996 power = MIN(200, (HEX_REVENGE_POWER(p_ptr) * 2));
\r
5997 if (info) return info_damage(0, 0, power);
\r
6000 int a = 3 - (p_ptr->pspeed - 100) / 10;
\r
6001 MAGIC_NUM2 r = 3 + randint1(3) + MAX(0, MIN(3, a));
\r
6003 if (HEX_REVENGE_TURN(p_ptr) > 0)
\r
6005 msg_print(_("すでに我慢をしている。", "You are already patienting."));
\r
6009 HEX_REVENGE_TYPE(p_ptr) = 1;
\r
6010 HEX_REVENGE_TURN(p_ptr) = r;
\r
6011 HEX_REVENGE_POWER(p_ptr) = 0;
\r
6012 msg_print(_("じっと耐えることにした。", "You decide to patient all damages."));
\r
6017 int rad = 2 + (power / 50);
\r
6019 HEX_REVENGE_TURN(p_ptr)--;
\r
6021 if ((HEX_REVENGE_TURN(p_ptr) <= 0) || (power >= 200))
\r
6023 msg_print(_("我慢が解かれた!", "Time for end of patioence!"));
\r
6026 project(0, rad, p_ptr->y, p_ptr->x, power, GF_HELL_FIRE,
\r
6027 (PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);
\r
6029 if (p_ptr->wizard)
\r
6031 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
\r
6035 HEX_REVENGE_TYPE(p_ptr) = 0;
\r
6036 HEX_REVENGE_TURN(p_ptr) = 0;
\r
6037 HEX_REVENGE_POWER(p_ptr) = 0;
\r
6042 /*** 2nd book (8-15) ***/
\r
6044 if (name) return _("氷の鎧", "Ice armor");
\r
6045 if (desc) return _("氷のオーラを身にまとい、防御力が上昇する。", "Gives fire aura and bonus to AC.");
\r
6048 msg_print(_("体が氷の鎧で覆われた。", "You have enveloped by ice armor!"));
\r
6052 msg_print(_("氷の鎧が消え去った。", "Ice armor disappeared."));
\r
6057 if (name) return _("重傷の治癒", "Cure serious wounds");
\r
6058 if (desc) return _("体力や傷を多少回復させる。", "Heals cut and HP more.");
\r
6059 if (info) return info_heal(2, 10, 0);
\r
6062 msg_print(_("気分が良くなってくる。", "You feel better and better."));
\r
6066 hp_player(damroll(2, 10));
\r
6067 set_cut((p_ptr->cut / 2) - 10);
\r
6072 if (name) return _("薬品吸入", "Inhail potion");
\r
6073 if (desc) return _("呪文詠唱を中止することなく、薬の効果を得ることができる。", "Quaffs a potion without canceling of casting a spell.");
\r
6076 CASTING_HEX_FLAGS(p_ptr) |= (1L << HEX_INHAIL);
\r
6077 do_cmd_quaff_potion();
\r
6078 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_INHAIL);
\r
6084 if (name) return _("衰弱の霧", "Hypodynamic mist");
\r
6085 if (desc) return _("視界内のモンスターに微弱量の衰弱属性のダメージを与える。",
\r
6086 "Deals few damages of hypodynamia to all monsters in your sight.");
\r
6087 power = (plev / 2) + 5;
\r
6088 if (info) return info_damage(1, power, 0);
\r
6091 project_hack(GF_HYPODYNAMIA, randint1(power));
\r
6096 if (name) return _("魔剣化", "Swords to runeswords");
\r
6097 if (desc) return _("武器の攻撃力を上げる。切れ味を得、呪いに応じて与えるダメージが上昇し、善良なモンスターに対するダメージが2倍になる。",
\r
6098 "Gives vorpal ability to your weapon. Increases damages by your weapon acccording to curse of your weapon.");
\r
6102 msg_print("あなたの武器が黒く輝いた。");
\r
6104 if (!empty_hands(FALSE))
\r
6105 msg_print("Your weapons glow bright black.");
\r
6107 msg_print("Your weapon glows bright black.");
\r
6113 msg_print("武器の輝きが消え去った。");
\r
6115 msg_format("Brightness of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
\r
6121 if (name) return _("混乱の手", "Touch of confusion");
\r
6122 if (desc) return _("攻撃した際モンスターを混乱させる。", "Confuses a monster when you attack.");
\r
6125 msg_print(_("あなたの手が赤く輝き始めた。", "Your hands glow bright red."));
\r
6129 msg_print(_("手の輝きがなくなった。", "Brightness on your hands disappeard."));
\r
6134 if (name) return _("肉体強化", "Building up");
\r
6135 if (desc) return _("術者の腕力、器用さ、耐久力を上昇させる。攻撃回数の上限を 1 増加させる。",
\r
6136 "Attempts to increases your strength, dexterity and constitusion.");
\r
6139 msg_print(_("身体が強くなった気がした。", "You feel your body is developed more now."));
\r
6144 if (name) return _("反テレポート結界", "Anti teleport barrier");
\r
6145 if (desc) return _("視界内のモンスターのテレポートを阻害するバリアを張る。", "Obstructs all teleportations by monsters in your sight.");
\r
6146 power = plev * 3 / 2;
\r
6147 if (info) return info_power(power);
\r
6150 msg_print(_("テレポートを防ぐ呪いをかけた。", "You feel anyone can not teleport except you."));
\r
6154 /*** 3rd book (16-23) ***/
\r
6156 if (name) return _("衝撃のクローク", "Cloak of shock");
\r
6157 if (desc) return _("電気のオーラを身にまとい、動きが速くなる。", "Gives lightning aura and a bonus to speed.");
\r
6160 msg_print(_("体が稲妻のオーラで覆われた。", "You have enveloped by electrical aura!"));
\r
6164 msg_print(_("稲妻のオーラが消え去った。", "Electrical aura disappeared."));
\r
6169 if (name) return _("致命傷の治癒", "Cure critical wounds");
\r
6170 if (desc) return _("体力や傷を回復させる。", "Heals cut and HP greatry.");
\r
6171 if (info) return info_heal(4, 10, 0);
\r
6174 msg_print(_("気分が良くなってくる。", "You feel better and better."));
\r
6178 hp_player(damroll(4, 10));
\r
6186 if (name) return _("呪力封入", "Recharging");
\r
6187 if (desc) return _("魔法の道具に魔力を再充填する。", "Recharges a magic device.");
\r
6189 if (info) return info_power(power);
\r
6192 if (!recharge(power)) return NULL;
\r
6198 if (name) return _("死者復活", "Animate Dead");
\r
6199 if (desc) return _("死体を蘇らせてペットにする。", "Raises corpses and skeletons from dead.");
\r
6202 msg_print(_("死者への呼びかけを始めた。", "You start to call deads.!"));
\r
6206 animate_dead(0, p_ptr->y, p_ptr->x);
\r
6211 if (name) return _("防具呪縛", "Curse armor");
\r
6212 if (desc) return _("装備している防具に呪いをかける。", "Curse a piece of armour that you wielding.");
\r
6217 char o_name[MAX_NLEN];
\r
6218 object_type *o_ptr;
\r
6219 u32b f[TR_FLAG_SIZE];
\r
6221 item_tester_hook = object_is_armour;
\r
6222 q = _("どれを呪いますか?", "Which piece of armour do you curse?");
\r
6223 s = _("防具を装備していない。", "You wield no piece of armours.");
\r
6225 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
\r
6227 o_ptr = &inventory[item];
\r
6228 object_desc(o_name, o_ptr, OD_NAME_ONLY);
\r
6229 object_flags(o_ptr, f);
\r
6231 if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
\r
6233 if (!one_in_(3) &&
\r
6234 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
\r
6236 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
\r
6239 if (o_ptr->to_d > 0)
\r
6241 o_ptr->to_d -= randint1(3) % 2;
\r
6242 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
\r
6244 if (o_ptr->to_h > 0)
\r
6246 o_ptr->to_h -= randint1(3) % 2;
\r
6247 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
\r
6249 if (o_ptr->to_a > 0)
\r
6251 o_ptr->to_a -= randint1(3) % 2;
\r
6252 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
\r
6254 msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
\r
6259 int curse_rank = 0;
\r
6260 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
\r
6261 o_ptr->curse_flags |= (TRC_CURSED);
\r
6263 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
\r
6266 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
\r
6269 o_ptr->curse_flags |= (TRC_TY_CURSE);
\r
6270 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
\r
6272 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
\r
6273 add_flag(o_ptr->art_flags, TR_RES_POIS);
\r
6274 add_flag(o_ptr->art_flags, TR_RES_DARK);
\r
6275 add_flag(o_ptr->art_flags, TR_RES_NETHER);
\r
6276 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
\r
6281 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);
\r
6284 p_ptr->update |= (PU_BONUS);
\r
6290 if (name) return _("影のクローク", "Cloak of shadow");
\r
6291 if (desc) return _("影のオーラを身にまとい、敵に影のダメージを与える。", "Gives aura of shadow.");
\r
6294 object_type *o_ptr = &inventory[INVEN_OUTER];
\r
6296 if (!o_ptr->k_idx)
\r
6298 msg_print(_("クロークを身につけていない!", "You don't ware any cloak."));
\r
6301 else if (!object_is_cursed(o_ptr))
\r
6303 msg_print(_("クロークは呪われていない!", "Your cloak is not cursed."));
\r
6308 msg_print(_("影のオーラを身にまとった。", "You have enveloped by shadow aura!"));
\r
6313 object_type *o_ptr = &inventory[INVEN_OUTER];
\r
6315 if ((!o_ptr->k_idx) || (!object_is_cursed(o_ptr)))
\r
6317 do_spell(REALM_HEX, spell, SPELL_STOP);
\r
6318 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << spell);
\r
6319 CASTING_HEX_NUM(p_ptr)--;
\r
6320 if (!SINGING_SONG_ID(p_ptr)) set_action(ACTION_NONE);
\r
6325 msg_print(_("影のオーラが消え去った。", "Shadow aura disappeared."));
\r
6330 if (name) return _("苦痛を魔力に", "Pains to mana");
\r
6331 if (desc) return _("視界内のモンスターに精神ダメージ与え、魔力を吸い取る。", "Deals psychic damages to all monsters in sight, and drains some mana.");
\r
6332 power = plev * 3 / 2;
\r
6333 if (info) return info_damage(1, power, 0);
\r
6336 project_hack(GF_PSI_DRAIN, randint1(power));
\r
6341 if (name) return _("目には目を", "Eye for an eye");
\r
6342 if (desc) return _("打撃や魔法で受けたダメージを、攻撃元のモンスターにも与える。", "Returns same damage which you got to the monster which damaged you.");
\r
6345 msg_print(_("復讐したい欲望にかられた。", "You wish strongly you want to revenge anything."));
\r
6349 /*** 4th book (24-31) ***/
\r
6351 if (name) return _("反増殖結界", "Anti multiply barrier");
\r
6352 if (desc) return _("その階の増殖するモンスターの増殖を阻止する。", "Obstructs all multiplying by monsters in entire floor.");
\r
6355 msg_print(_("増殖を阻止する呪いをかけた。", "You feel anyone can not already multiply."));
\r
6360 if (name) return _("全復活", "Restoration");
\r
6361 if (desc) return _("経験値を徐々に復活し、減少した能力値を回復させる。", "Restores experience and status.");
\r
6364 msg_print(_("体が元の活力を取り戻し始めた。", "You feel your lost status starting to return."));
\r
6368 bool flag = FALSE;
\r
6369 int d = (p_ptr->max_exp - p_ptr->exp);
\r
6370 int r = (p_ptr->exp / 20);
\r
6376 p_ptr->exp = p_ptr->max_exp;
\r
6380 /* Check the experience */
\r
6381 check_experience();
\r
6385 for (i = A_STR; i < 6; i ++)
\r
6387 if (p_ptr->stat_cur[i] < p_ptr->stat_max[i])
\r
6389 if (p_ptr->stat_cur[i] < 18)
\r
6390 p_ptr->stat_cur[i]++;
\r
6392 p_ptr->stat_cur[i] += 10;
\r
6394 if (p_ptr->stat_cur[i] > p_ptr->stat_max[i])
\r
6395 p_ptr->stat_cur[i] = p_ptr->stat_max[i];
\r
6397 /* Recalculate bonuses */
\r
6398 p_ptr->update |= (PU_BONUS);
\r
6406 msg_format(_("%sの呪文の詠唱をやめた。", "Finish casting '%^s'."), do_spell(REALM_HEX, HEX_RESTORE, SPELL_NAME));
\r
6407 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_RESTORE);
\r
6408 if (cont) CASTING_HEX_NUM(p_ptr)--;
\r
6409 if (CASTING_HEX_NUM(p_ptr)) p_ptr->action = ACTION_NONE;
\r
6411 /* Redraw status */
\r
6412 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
\r
6413 p_ptr->redraw |= (PR_EXTRA);
\r
6421 if (name) return _("呪力吸収", "Drain curse power");
\r
6422 if (desc) return _("呪われた武器の呪いを吸収して魔力を回復する。", "Drains curse on your weapon and heals SP a little.");
\r
6427 u32b f[TR_FLAG_SIZE];
\r
6428 object_type *o_ptr;
\r
6430 item_tester_hook = item_tester_hook_cursed;
\r
6431 q = _("どの装備品から吸収しますか?", "Which cursed equipment do you drain mana from?");
\r
6432 s = _("呪われたアイテムを装備していない。", "You have no cursed equipment.");
\r
6434 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
\r
6436 o_ptr = &inventory[item];
\r
6437 object_flags(o_ptr, f);
\r
6439 p_ptr->csp += (p_ptr->lev / 5) + randint1(p_ptr->lev / 5);
\r
6440 if (have_flag(f, TR_TY_CURSE) || (o_ptr->curse_flags & TRC_TY_CURSE)) p_ptr->csp += randint1(5);
\r
6441 if (p_ptr->csp > p_ptr->msp) p_ptr->csp = p_ptr->msp;
\r
6443 if (o_ptr->curse_flags & TRC_PERMA_CURSE)
\r
6447 else if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
\r
6451 msg_print(_("呪いを全て吸い取った。", "Heavy curse vanished away."));
\r
6452 o_ptr->curse_flags = 0L;
\r
6455 else if ((o_ptr->curse_flags & (TRC_CURSED)) && one_in_(3))
\r
6457 msg_print(_("呪いを全て吸い取った。", "Curse vanished away."));
\r
6458 o_ptr->curse_flags = 0L;
\r
6466 if (name) return _("吸血の刃", "Swords to vampires");
\r
6467 if (desc) return _("吸血属性で攻撃する。", "Gives vampiric ability to your weapon.");
\r
6471 msg_print("あなたの武器が血を欲している。");
\r
6473 if (!empty_hands(FALSE))
\r
6474 msg_print("Your weapons want more blood now.");
\r
6476 msg_print("Your weapon wants more blood now.");
\r
6482 msg_print("武器の渇望が消え去った。");
\r
6484 msg_format("Thirsty of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
\r
6490 if (name) return _("朦朧の言葉", "Word of stun");
\r
6491 if (desc) return _("視界内のモンスターを朦朧とさせる。", "Stuns all monsters in your sight.");
\r
6493 if (info) return info_power(power);
\r
6496 stun_monsters(power);
\r
6501 if (name) return _("影移動", "Moving into shadow");
\r
6502 if (desc) return _("モンスターの隣のマスに瞬間移動する。", "Teleports you close to a monster.");
\r
6509 for (i = 0; i < 3; i++)
\r
6511 if (!tgt_pt(&x, &y)) return FALSE;
\r
6515 for (dir = 0; dir < 8; dir++)
\r
6517 int dy = y + ddy_ddd[dir];
\r
6518 int dx = x + ddx_ddd[dir];
\r
6519 if (dir == 5) continue;
\r
6520 if(cave[dy][dx].m_idx) flag = TRUE;
\r
6523 if (!cave_empty_bold(y, x) || (cave[y][x].info & CAVE_ICKY) ||
\r
6524 (distance(y, x, p_ptr->y, p_ptr->x) > plev + 2))
\r
6526 msg_print(_("そこには移動できない。", "Can not teleport to there."));
\r
6532 if (flag && randint0(plev * plev / 2))
\r
6534 teleport_player_to(y, x, 0L);
\r
6538 msg_print(_("おっと!", "Oops!"));
\r
6539 teleport_player(30, 0L);
\r
6547 if (name) return _("反魔法結界", "Anti magic barrier");
\r
6548 if (desc) return _("視界内のモンスターの魔法を阻害するバリアを張る。", "Obstructs all magic spell of monsters in your sight.");
\r
6549 power = plev * 3 / 2;
\r
6550 if (info) return info_power(power);
\r
6553 msg_print(_("魔法を防ぐ呪いをかけた。", "You feel anyone can not cast spells except you."));
\r
6558 if (name) return _("復讐の宣告", "Revenge sentence");
\r
6559 if (desc) return _("数ターン後にそれまで受けたダメージに応じた威力の地獄の劫火の弾を放つ。",
\r
6560 "Fires a ball of hell fire to try revenging after few turns.");
\r
6561 power = HEX_REVENGE_POWER(p_ptr);
\r
6562 if (info) return info_damage(0, 0, power);
\r
6566 int a = 3 - (p_ptr->pspeed - 100) / 10;
\r
6567 r = 1 + randint1(2) + MAX(0, MIN(3, a));
\r
6569 if (HEX_REVENGE_TURN(p_ptr) > 0)
\r
6571 msg_print(_("すでに復讐は宣告済みだ。", "You already pronounced your revenge."));
\r
6575 HEX_REVENGE_TYPE(p_ptr) = 2;
\r
6576 HEX_REVENGE_TURN(p_ptr) = r;
\r
6577 msg_format(_("あなたは復讐を宣告した。あと %d ターン。", "You pronounce your revenge. %d turns left."), r);
\r
6582 HEX_REVENGE_TURN(p_ptr)--;
\r
6584 if (HEX_REVENGE_TURN(p_ptr) <= 0)
\r
6594 msg_print(_("復讐の時だ!", "Time to revenge!"));
\r
6596 while (!get_aim_dir(&dir));
\r
6598 fire_ball(GF_HELL_FIRE, dir, power, 1);
\r
6600 if (p_ptr->wizard)
\r
6602 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
\r
6607 msg_print(_("復讐する気が失せた。", "You are not a mood to revenge."));
\r
6609 HEX_REVENGE_POWER(p_ptr) = 0;
\r
6615 /* start casting */
\r
6616 if ((cast) && (add))
\r
6619 CASTING_HEX_FLAGS(p_ptr) |= 1L << (spell);
\r
6620 CASTING_HEX_NUM(p_ptr)++;
\r
6622 if (p_ptr->action != ACTION_SPELL) set_action(ACTION_SPELL);
\r
6625 /* Redraw status */
\r
6628 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
\r
6629 p_ptr->redraw |= (PR_EXTRA | PR_HP | PR_MANA);
\r
6637 * @brief 魔法処理のメインルーチン
\r
6638 * @param realm 魔法領域のID
\r
6639 * @param spell 各領域の魔法ID
\r
6640 * @param mode 求める処理
\r
6641 * @return 各領域魔法に各種テキストを求めた場合は文字列参照ポインタ、そうでない場合はNULLポインタを返す。
\r
6643 cptr do_spell(REALM_IDX realm, SPELL_IDX spell, BIT_FLAGS mode)
\r
6647 case REALM_LIFE: return do_life_spell(spell, mode);
\r
6648 case REALM_SORCERY: return do_sorcery_spell(spell, mode);
\r
6649 case REALM_NATURE: return do_nature_spell(spell, mode);
\r
6650 case REALM_CHAOS: return do_chaos_spell(spell, mode);
\r
6651 case REALM_DEATH: return do_death_spell(spell, mode);
\r
6652 case REALM_TRUMP: return do_trump_spell(spell, mode);
\r
6653 case REALM_ARCANE: return do_arcane_spell(spell, mode);
\r
6654 case REALM_CRAFT: return do_craft_spell(spell, mode);
\r
6655 case REALM_DAEMON: return do_daemon_spell(spell, mode);
\r
6656 case REALM_CRUSADE: return do_crusade_spell(spell, mode);
\r
6657 case REALM_MUSIC: return do_music_spell(spell, mode);
\r
6658 case REALM_HISSATSU: return do_hissatsu_spell(spell, mode);
\r
6659 case REALM_HEX: return do_hex_spell(spell, mode);
\r