3 @brief 魔法のインターフェイスと発動 / Purpose: Do everything for each spell
6 2013 Deskull rearranged comment for Doxygen.
14 * 魔法の効果を「キャプション:ダイス+定数値」のフォーマットで出力する / Generate dice info string such as "foo 2d10"
19 * @return フォーマットに従い整形された文字列
21 static cptr info_string_dice(cptr str, int dice, int sides, int base)
25 return format("%s%d", str, base);
29 return format("%s%dd%d", str, dice, sides);
31 /* Dice plus base value */
33 return format("%s%dd%d%+d", str, dice, sides, base);
38 * @brief 魔法によるダメージを出力する / Generate damage-dice info string such as "dam 2d10"
42 * @return フォーマットに従い整形された文字列
44 static cptr info_damage(int dice, int sides, int base)
46 return info_string_dice(_("損傷:", "dam "), dice, sides, base);
50 * @brief 魔法の効果時間を出力する / Generate duration info string such as "dur 20+1d20"
53 * @return フォーマットに従い整形された文字列
55 static cptr info_duration(int base, int sides)
57 return format(_("期間:%d+1d%d", "dur %d+1d%d"), base, sides);
61 * @brief 魔法の効果範囲を出力する / Generate range info string such as "range 5"
63 * @return フォーマットに従い整形された文字列
65 static cptr info_range(POSITION range)
67 return format(_("範囲:%d", "range %d"), range);
71 * @brief 魔法による回復量を出力する / Generate heal info string such as "heal 2d8"
75 * @return フォーマットに従い整形された文字列
77 static cptr info_heal(int dice, int sides, int base)
79 return info_string_dice(_("回復:", "heal "), dice, sides, base);
83 * @brief 魔法効果発動までの遅延ターンを出力する / Generate delay info string such as "delay 15+1d15"
86 * @return フォーマットに従い整形された文字列
88 static cptr info_delay(int base, int sides)
90 return format(_("遅延:%d+1d%d", "delay %d+1d%d"), base, sides);
95 * @brief 魔法によるダメージを出力する(固定値&複数回処理) / Generate multiple-damage info string such as "dam 25 each"
97 * @return フォーマットに従い整形された文字列
99 static cptr info_multi_damage(HIT_POINT dam)
101 return format(_("損傷:各%d", "dam %d each"), dam);
106 * @brief 魔法によるダメージを出力する(ダイスのみ&複数回処理) / Generate multiple-damage-dice info string such as "dam 5d2 each"
109 * @return フォーマットに従い整形された文字列
111 static cptr info_multi_damage_dice(int dice, int sides)
113 return format(_("損傷:各%dd%d", "dam %dd%d each"), dice, sides);
117 * @brief 魔法による一般的な効力値を出力する(固定値) / Generate power info string such as "power 100"
119 * @return フォーマットに従い整形された文字列
121 static cptr info_power(int power)
123 return format(_("効力:%d", "power %d"), power);
128 * @brief 魔法による一般的な効力値を出力する(ダイス値) / Generate power info string such as "power 100"
131 * @return フォーマットに従い整形された文字列
134 * Generate power info string such as "power 1d100"
136 static cptr info_power_dice(int dice, int sides)
138 return format(_("効力:%dd%d", "power %dd%d"), dice, sides);
143 * @brief 魔法の効果半径を出力する / Generate radius info string such as "rad 100"
145 * @return フォーマットに従い整形された文字列
147 static cptr info_radius(int rad)
149 return format(_("半径:%d", "rad %d"), rad);
154 * @brief 魔法効果の限界重量を出力する / Generate weight info string such as "max wgt 15"
156 * @return フォーマットに従い整形された文字列
158 static cptr info_weight(int weight)
161 return format("最大重量:%d.%dkg", lbtokg1(weight), lbtokg2(weight));
163 return format("max wgt %d", weight/10);
169 * @brief 一部ボルト魔法のビーム化確率を算出する / Prepare standard probability to become beam for fire_bolt_or_beam()
172 * ハードコーティングによる実装が行われている。
173 * メイジは(レベル)%、ハイメイジ、スペルマスターは(レベル)%、それ以外の職業は(レベル/2)%
175 static int beam_chance(void)
177 if (p_ptr->pclass == CLASS_MAGE)
179 if (p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER)
180 return p_ptr->lev + 10;
182 return p_ptr->lev / 2;
186 * @brief トランプ魔法独自の召喚処理を行う / Handle summoning and failure of trump spells
187 * @param num summon_specific()関数を呼び出す回数
188 * @param pet ペット化として召喚されるか否か
193 * @param mode モンスター生成条件フラグ
194 * @return モンスターが(敵対も含めて)召還されたならばTRUEを返す。
196 static bool trump_summoning(int num, bool pet, POSITION y, POSITION x, DEPTH lev, int type, BIT_FLAGS mode)
198 PLAYER_LEVEL plev = p_ptr->lev;
202 bool success = FALSE;
205 if (!lev) lev = plev * 2 / 3 + randint1(plev / 2);
210 mode |= PM_FORCE_PET;
212 /* Only sometimes allow unique monster */
213 if (mode & PM_ALLOW_UNIQUE)
216 if (randint1(50 + plev) >= plev / 10)
217 mode &= ~PM_ALLOW_UNIQUE;
220 /* Player is who summons */
225 /* Prevent taming, allow unique monster */
228 /* Behave as if they appear by themselfs */
232 for (i = 0; i < num; i++)
234 if (summon_specific(who, y, x, lev, type, mode))
240 msg_print(_("誰もあなたのカードの呼び声に答えない。", "Nobody answers to your Trump call."));
248 * @brief 「ワンダー」のランダムな効果を決定して処理する。
252 * This spell should become more useful (more controlled) as the\n
253 * player gains experience levels. Thus, add 1/5 of the player's\n
254 * level to the die roll. This eliminates the worst effects later on,\n
255 * while keeping the results quite random. It also allows some potent\n
256 * effects only at high level.
258 static void cast_wonder(int dir)
260 int plev = p_ptr->lev;
261 int die = randint1(100) + plev / 5;
262 int vir = virtue_number(V_CHANCE);
266 if (p_ptr->virtues[vir - 1] > 0)
268 while (randint1(400) < p_ptr->virtues[vir - 1]) die++;
272 while (randint1(400) < (0-p_ptr->virtues[vir - 1])) die--;
277 chg_virtue(V_CHANCE, 1);
281 msg_print(_("あなたは力がみなぎるのを感じた!", "You feel a surge of power!"));
284 if (die < 8) clone_monster(dir);
285 else if (die < 14) speed_monster(dir, plev);
286 else if (die < 26) heal_monster(dir, damroll(4, 6));
287 else if (die < 31) poly_monster(dir, plev);
289 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir,
290 damroll(3 + ((plev - 1) / 5), 4));
291 else if (die < 41) confuse_monster(dir, plev);
292 else if (die < 46) fire_ball(GF_POIS, dir, 20 + (plev / 2), 3);
293 else if (die < 51) (void)lite_line(dir, damroll(6, 8));
295 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir,
296 damroll(3 + ((plev - 5) / 4), 8));
298 fire_bolt_or_beam(beam_chance() - 10, GF_COLD, dir,
299 damroll(5 + ((plev - 5) / 4), 8));
301 fire_bolt_or_beam(beam_chance(), GF_ACID, dir,
302 damroll(6 + ((plev - 5) / 4), 8));
304 fire_bolt_or_beam(beam_chance(), GF_FIRE, dir,
305 damroll(8 + ((plev - 5) / 4), 8));
306 else if (die < 76) drain_life(dir, 75);
307 else if (die < 81) fire_ball(GF_ELEC, dir, 30 + plev / 2, 2);
308 else if (die < 86) fire_ball(GF_ACID, dir, 40 + plev, 2);
309 else if (die < 91) fire_ball(GF_ICE, dir, 70 + plev, 3);
310 else if (die < 96) fire_ball(GF_FIRE, dir, 80 + plev, 3);
311 else if (die < 101) drain_life(dir, 100 + plev);
314 earthquake(p_ptr->y, p_ptr->x, 12);
318 (void)destroy_area(p_ptr->y, p_ptr->x, 13 + randint0(5), FALSE);
322 symbol_genocide(plev+50, TRUE);
324 else if (die < 110) dispel_monsters(120);
327 dispel_monsters(150);
329 sleep_monsters(plev);
336 * @brief 「悪霊召喚」のランダムな効果を決定して処理する。
340 static void cast_invoke_spirits(int dir)
342 int plev = p_ptr->lev;
343 int die = randint1(100) + plev / 5;
344 int vir = virtue_number(V_CHANCE);
348 if (p_ptr->virtues[vir - 1] > 0)
350 while (randint1(400) < p_ptr->virtues[vir - 1]) die++;
354 while (randint1(400) < (0-p_ptr->virtues[vir - 1])) die--;
358 msg_print(_("あなたは死者たちの力を招集した...", "You call on the power of the dead..."));
360 chg_virtue(V_CHANCE, 1);
364 msg_print(_("あなたはおどろおどろしい力のうねりを感じた!", "You feel a surge of eldritch force!"));
370 msg_print(_("なんてこった!あなたの周りの地面から朽ちた人影が立ち上がってきた!",
371 "Oh no! Mouldering forms rise from the earth around you!"));
373 (void)summon_specific(0, p_ptr->y, p_ptr->x, dun_level, SUMMON_UNDEAD, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
374 chg_virtue(V_UNLIFE, 1);
378 msg_print(_("名状し難い邪悪な存在があなたの心を通り過ぎて行った...", "An unnamable evil brushes against your mind..."));
380 set_afraid(p_ptr->afraid + randint1(4) + 4);
384 msg_print(_("あなたの頭に大量の幽霊たちの騒々しい声が押し寄せてきた...",
385 "Your head is invaded by a horde of gibbering spectral voices..."));
387 set_confused(p_ptr->confused + randint1(4) + 4);
391 poly_monster(dir, plev);
395 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir,
396 damroll(3 + ((plev - 1) / 5), 4));
400 confuse_monster (dir, plev);
404 fire_ball(GF_POIS, dir, 20 + (plev / 2), 3);
408 (void)lite_line(dir, damroll(6, 8));
412 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir,
413 damroll(3+((plev-5)/4),8));
417 fire_bolt_or_beam(beam_chance() - 10, GF_COLD, dir,
418 damroll(5+((plev-5)/4),8));
422 fire_bolt_or_beam(beam_chance(), GF_ACID, dir,
423 damroll(6+((plev-5)/4),8));
427 fire_bolt_or_beam(beam_chance(), GF_FIRE, dir,
428 damroll(8+((plev-5)/4),8));
436 fire_ball(GF_ELEC, dir, 30 + plev / 2, 2);
440 fire_ball(GF_ACID, dir, 40 + plev, 2);
444 fire_ball(GF_ICE, dir, 70 + plev, 3);
448 fire_ball(GF_FIRE, dir, 80 + plev, 3);
452 drain_life(dir, 100 + plev);
456 earthquake(p_ptr->y, p_ptr->x, 12);
460 (void)destroy_area(p_ptr->y, p_ptr->x, 13 + randint0(5), FALSE);
464 symbol_genocide(plev+50, TRUE);
468 dispel_monsters(120);
472 dispel_monsters(150);
474 sleep_monsters(plev);
480 msg_print(_("陰欝な声がクスクス笑う。「もうすぐおまえは我々の仲間になるだろう。弱き者よ。」",
481 "Sepulchral voices chuckle. 'Soon you will join us, mortal.'"));
486 * @brief カオス的効果あるいは及びシャッフルの「運命の輪」効果を引数基準に処理する。
487 * @param spell 基準となる引数ID
490 static void wild_magic(SPELL_IDX spell)
493 int type = SUMMON_MOLD + randint0(6);
495 if (type < SUMMON_MOLD) type = SUMMON_MOLD;
496 else if (type > SUMMON_MIMIC) type = SUMMON_MIMIC;
498 switch (randint1(spell) + randint1(8) + 1)
503 teleport_player(10, TELEPORT_PASSIVE);
508 teleport_player(100, TELEPORT_PASSIVE);
512 teleport_player(200, TELEPORT_PASSIVE);
522 lite_area(damroll(2, 3), 2);
525 destroy_doors_touch();
531 sleep_monsters_touch();
535 trap_creation(p_ptr->y, p_ptr->x);
544 aggravate_monsters(0);
547 earthquake(p_ptr->y, p_ptr->x, 5);
551 (void)gain_random_mutation(0);
561 fire_ball(GF_CHAOS, 0, spell + 5, 1 + (spell / 10));
568 while (counter++ < 8)
570 (void)summon_specific(0, p_ptr->y, p_ptr->x, (dun_level * 3) / 2, type, (PM_ALLOW_GROUP | PM_NO_PET));
575 activate_hi_summon(p_ptr->y, p_ptr->x, FALSE);
578 (void)summon_cyber(-1, p_ptr->y, p_ptr->x);
583 (void)activate_ty_curse(FALSE, &count);
590 * @brief トランプ領域の「シャッフル」の効果をランダムに決めて処理する。
593 static void cast_shuffle(void)
595 int plev = p_ptr->lev;
598 int vir = virtue_number(V_CHANCE);
601 /* Card sharks and high mages get a level bonus */
602 if ((p_ptr->pclass == CLASS_ROGUE) ||
603 (p_ptr->pclass == CLASS_HIGH_MAGE) ||
604 (p_ptr->pclass == CLASS_SORCERER))
605 die = (randint1(110)) + plev / 5;
612 if (p_ptr->virtues[vir - 1] > 0)
614 while (randint1(400) < p_ptr->virtues[vir - 1]) die++;
618 while (randint1(400) < (0-p_ptr->virtues[vir - 1])) die--;
622 msg_print(_("あなたはカードを切って一枚引いた...", "You shuffle the deck and draw a card..."));
625 chg_virtue(V_CHANCE, 1);
629 msg_print(_("なんてこった!《死》だ!", "Oh no! It's Death!"));
631 for (i = 0; i < randint1(3); i++)
632 activate_hi_summon(p_ptr->y, p_ptr->x, FALSE);
636 msg_print(_("なんてこった!《悪魔》だ!", "Oh no! It's the Devil!"));
637 summon_specific(0, p_ptr->y, p_ptr->x, dun_level, SUMMON_DEMON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
642 msg_print(_("なんてこった!《吊られた男》だ!", "Oh no! It's the Hanged Man."));
643 activate_ty_curse(FALSE, &count);
647 msg_print(_("《不調和の剣》だ。", "It's the swords of discord."));
648 aggravate_monsters(0);
652 msg_print(_("《愚者》だ。", "It's the Fool."));
658 msg_print(_("奇妙なモンスターの絵だ。", "It's the picture of a strange monster."));
659 trump_summoning(1, FALSE, p_ptr->y, p_ptr->x, (dun_level * 3 / 2), (32 + randint1(6)), PM_ALLOW_GROUP | PM_ALLOW_UNIQUE);
663 msg_print(_("《月》だ。", "It's the Moon."));
668 msg_print(_("《運命の輪》だ。", "It's the Wheel of Fortune."));
669 wild_magic(randint0(32));
673 msg_print(_("テレポート・カードだ。", "It's a teleport trump card."));
674 teleport_player(10, TELEPORT_PASSIVE);
678 msg_print(_("《正義》だ。", "It's Justice."));
679 set_blessed(p_ptr->lev, FALSE);
683 msg_print(_("テレポート・カードだ。", "It's a teleport trump card."));
684 teleport_player(100, TELEPORT_PASSIVE);
688 msg_print(_("テレポート・カードだ。", "It's a teleport trump card."));
689 teleport_player(200, TELEPORT_PASSIVE);
693 msg_print(_("《塔》だ。", "It's the Tower."));
698 msg_print(_("《節制》だ。", "It's Temperance."));
699 sleep_monsters_touch();
703 msg_print(_("《塔》だ。", "It's the Tower."));
705 earthquake(p_ptr->y, p_ptr->x, 5);
709 msg_print(_("友好的なモンスターの絵だ。", "It's the picture of a friendly monster."));
710 trump_summoning(1, TRUE, p_ptr->y, p_ptr->x, (dun_level * 3 / 2), SUMMON_MOLD, 0L);
714 msg_print(_("友好的なモンスターの絵だ。", "It's the picture of a friendly monster."));
715 trump_summoning(1, TRUE, p_ptr->y, p_ptr->x, (dun_level * 3 / 2), SUMMON_BAT, 0L);
719 msg_print(_("友好的なモンスターの絵だ。", "It's the picture of a friendly monster."));
720 trump_summoning(1, TRUE, p_ptr->y, p_ptr->x, (dun_level * 3 / 2), SUMMON_VORTEX, 0L);
724 msg_print(_("友好的なモンスターの絵だ。", "It's the picture of a friendly monster."));
725 trump_summoning(1, TRUE, p_ptr->y, p_ptr->x, (dun_level * 3 / 2), SUMMON_COIN_MIMIC, 0L);
729 msg_print(_("《恋人》だ。", "It's the Lovers."));
731 if (get_aim_dir(&dir))
732 charm_monster(dir, MIN(p_ptr->lev, 20));
736 msg_print(_("《隠者》だ。", "It's the Hermit."));
741 msg_print(_("《審判》だ。", "It's the Judgement."));
742 do_cmd_rerate(FALSE);
743 lose_all_mutations();
747 msg_print(_("《太陽》だ。", "It's the Sun."));
748 chg_virtue(V_KNOWLEDGE, 1);
749 chg_virtue(V_ENLIGHTEN, 1);
754 msg_print(_("《世界》だ。", "It's the World."));
755 if (p_ptr->exp < PY_MAX_EXP)
757 s32b ee = (p_ptr->exp / 25) + 1;
758 if (ee > 5000) ee = 5000;
759 msg_print(_("更に経験を積んだような気がする。", "You feel more experienced."));
766 * @brief カオス魔法「流星群」の処理としてプレイヤーを中心に隕石落下処理を10+1d10回繰り返す。
767 * / Drop 10+1d10 meteor ball at random places near the player
772 static void cast_meteor(HIT_POINT dam, int rad)
775 int b = 10 + randint1(10);
777 for (i = 0; i < b; i++)
779 POSITION y = 0, x = 0;
782 for (count = 0; count <= 20; count++)
786 x = p_ptr->x - 8 + randint0(17);
787 y = p_ptr->y - 8 + randint0(17);
789 dx = (p_ptr->x > x) ? (p_ptr->x - x) : (x - p_ptr->x);
790 dy = (p_ptr->y > y) ? (p_ptr->y - y) : (y - p_ptr->y);
792 /* Approximate distance */
793 d = (dy > dx) ? (dy + (dx >> 1)) : (dx + (dy >> 1));
795 if (d >= 9) continue;
797 if (!in_bounds(y, x) || !projectable(p_ptr->y, p_ptr->x, y, x)
798 || !cave_have_flag_bold(y, x, FF_PROJECT)) continue;
804 if (count > 20) continue;
806 project(0, rad, y, x, dam, GF_METEOR, PROJECT_KILL | PROJECT_JUMP | PROJECT_ITEM, -1);
812 * @brief 破邪魔法「神の怒り」の処理としてターゲットを指定した後分解のボールを最大20回発生させる。
815 * @return ターゲットを指定し、実行したならばTRUEを返す。
817 static bool cast_wrath_of_the_god(HIT_POINT dam, int rad)
822 int b = 10 + randint1(10);
824 if (!get_aim_dir(&dir)) return FALSE;
826 /* Use the given direction */
827 tx = p_ptr->x + 99 * ddx[dir];
828 ty = p_ptr->y + 99 * ddy[dir];
830 /* Hack -- Use an actual "target" */
831 if ((dir == 5) && target_okay())
842 /* Hack -- Stop at the target */
843 if ((y == ty) && (x == tx)) break;
847 mmove2(&ny, &nx, p_ptr->y, p_ptr->x, ty, tx);
849 /* Stop at maximum range */
850 if (MAX_RANGE <= distance(p_ptr->y, p_ptr->x, ny, nx)) break;
852 /* Stopped by walls/doors */
853 if (!cave_have_flag_bold(ny, nx, FF_PROJECT)) break;
855 /* Stopped by monsters */
856 if ((dir != 5) && cave[ny][nx].m_idx != 0) break;
858 /* Save the new location */
865 for (i = 0; i < b; i++)
867 int count = 20, d = 0;
873 x = tx - 5 + randint0(11);
874 y = ty - 5 + randint0(11);
876 dx = (tx > x) ? (tx - x) : (x - tx);
877 dy = (ty > y) ? (ty - y) : (y - ty);
879 /* Approximate distance */
880 d = (dy > dx) ? (dy + (dx >> 1)) : (dx + (dy >> 1));
881 /* Within the radius */
885 if (count < 0) continue;
887 /* Cannot penetrate perm walls */
888 if (!in_bounds(y,x) ||
889 cave_stop_disintegration(y,x) ||
890 !in_disintegration_range(ty, tx, y, x))
893 project(0, rad, y, x, dam, GF_DISINTEGRATE, PROJECT_JUMP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL, -1);
900 * @brief 悪魔領域のグレーターデーモン召喚に利用可能な死体かどうかを返す。 / An "item_tester_hook" for offer
901 * @param o_ptr オブジェクト構造体の参照ポインタ
902 * @return 生贄に使用可能な死体ならばTRUEを返す。
904 static bool item_tester_offer(object_type *o_ptr)
906 /* Flasks of oil are okay */
907 if (o_ptr->tval != TV_CORPSE) return (FALSE);
909 if (o_ptr->sval != SV_CORPSE) return (FALSE);
911 if (my_strchr("pht", r_info[o_ptr->pval].d_char)) return (TRUE);
913 /* Assume not okay */
918 * @brief 悪魔領域のグレーターデーモン召喚を処理する / Daemon spell Summon Greater Demon
919 * @return 処理を実行したならばTRUEを返す。
921 static bool cast_summon_greater_demon(void)
923 PLAYER_LEVEL plev = p_ptr->lev;
929 item_tester_hook = item_tester_offer;
930 q = _("どの死体を捧げますか? ", "Sacrifice which corpse? ");
931 s = _("捧げられる死体を持っていない。", "You have nothing to scrifice.");
932 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return FALSE;
934 /* Get the item (in the pack) */
937 o_ptr = &inventory[item];
940 /* Get the item (on the floor) */
943 o_ptr = &o_list[0 - item];
946 summon_lev = plev * 2 / 3 + r_info[o_ptr->pval].level;
948 if (summon_specific(-1, p_ptr->y, p_ptr->x, summon_lev, SUMMON_HI_DEMON, (PM_ALLOW_GROUP | PM_FORCE_PET)))
950 msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));
951 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
953 /* Decrease the item (from the pack) */
956 inven_item_increase(item, -1);
957 inven_item_describe(item);
958 inven_item_optimize(item);
961 /* Decrease the item (from the floor) */
964 floor_item_increase(0 - item, -1);
965 floor_item_describe(0 - item);
966 floor_item_optimize(0 - item);
971 msg_print(_("悪魔は現れなかった。", "No Greater Demon arrive."));
978 * @brief 歌の開始を処理する / Start singing if the player is a Bard
979 * @param spell 領域魔法としてのID
980 * @param song 魔法効果のID
983 static void start_singing(SPELL_IDX spell, MAGIC_NUM1 song)
985 /* Remember the song index */
986 SINGING_SONG_EFFECT(p_ptr) = (MAGIC_NUM1)song;
988 /* Remember the index of the spell which activated the song */
989 SINGING_SONG_ID(p_ptr) = (MAGIC_NUM2)spell;
992 /* Now the player is singing */
993 set_action(ACTION_SING);
996 /* Recalculate bonuses */
997 p_ptr->update |= (PU_BONUS);
999 /* Redraw status bar */
1000 p_ptr->redraw |= (PR_STATUS);
1004 * @brief 歌の停止を処理する / Stop singing if the player is a Bard
1007 void stop_singing(void)
1009 if (p_ptr->pclass != CLASS_BARD) return;
1011 /* Are there interupted song? */
1012 if (INTERUPTING_SONG_EFFECT(p_ptr))
1014 /* Forget interupted song */
1015 INTERUPTING_SONG_EFFECT(p_ptr) = MUSIC_NONE;
1019 /* The player is singing? */
1020 if (!SINGING_SONG_EFFECT(p_ptr)) return;
1022 /* Hack -- if called from set_action(), avoid recursive loop */
1023 if (p_ptr->action == ACTION_SING) set_action(ACTION_NONE);
1025 /* Message text of each song or etc. */
1026 do_spell(REALM_MUSIC, SINGING_SONG_ID(p_ptr), SPELL_STOP);
1028 SINGING_SONG_EFFECT(p_ptr) = MUSIC_NONE;
1029 SINGING_SONG_ID(p_ptr) = 0;
1031 /* Recalculate bonuses */
1032 p_ptr->update |= (PU_BONUS);
1034 /* Redraw status bar */
1035 p_ptr->redraw |= (PR_STATUS);
1040 * @brief 生命領域魔法の各処理を行う
1042 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
1043 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
1045 static cptr do_life_spell(SPELL_IDX spell, BIT_FLAGS mode)
1047 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
1048 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
1049 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
1050 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
1053 int plev = p_ptr->lev;
1058 if (name) return _("軽傷の治癒", "Cure Light Wounds");
1059 if (desc) return _("怪我と体力を少し回復させる。", "Heals cut and HP a little.");
1064 if (info) return info_heal(dice, sides, 0);
1068 hp_player(damroll(dice, sides));
1069 set_cut(p_ptr->cut - 10);
1075 if (name) return _("祝福", "Bless");
1076 if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
1080 if (info) return info_duration(base, base);
1084 set_blessed(randint1(base) + base, FALSE);
1090 if (name) return _("軽傷", "Cause Light Wounds");
1091 if (desc) return _("1体のモンスターに小ダメージを与える。抵抗されると無効。", "Wounds a monster a little unless resisted.");
1093 int dice = 3 + (plev - 1) / 5;
1096 if (info) return info_damage(dice, sides, 0);
1100 if (!get_aim_dir(&dir)) return NULL;
1101 fire_ball_hide(GF_WOUNDS, dir, damroll(dice, sides), 0);
1107 if (name) return _("光の召喚", "Call Light");
1108 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
1111 int sides = plev / 2;
1112 int rad = plev / 10 + 1;
1114 if (info) return info_damage(dice, sides, 0);
1118 lite_area(damroll(dice, sides), rad);
1124 if (name) return _("罠 & 隠し扉感知", "Detect Doors & Traps");
1125 if (desc) return _("近くの全ての罠と扉と階段を感知する。", "Detects traps, doors, and stairs in your vicinity.");
1127 int rad = DETECT_RAD_DEFAULT;
1129 if (info) return info_radius(rad);
1133 detect_traps(rad, TRUE);
1141 if (name) return _("重傷の治癒", "Cure Medium Wounds");
1142 if (desc) return _("怪我と体力を中程度回復させる。", "Heals cut and HP more.");
1147 if (info) return info_heal(dice, sides, 0);
1151 hp_player(damroll(dice, sides));
1152 set_cut((p_ptr->cut / 2) - 20);
1158 if (name) return _("解毒", "Cure Poison");
1159 if (desc) return _("体内の毒を取り除く。", "Cure poison status.");
1169 if (name) return _("空腹充足", "Satisfy Hunger");
1170 if (desc) return _("満腹にする。", "Satisfies hunger.");
1174 set_food(PY_FOOD_MAX - 1);
1180 if (name) return _("解呪", "Remove Curse");
1181 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
1187 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
1194 if (name) return _("重傷", "Cause Medium Wounds");
1195 if (desc) return _("1体のモンスターに中ダメージを与える。抵抗されると無効。", "Wounds a monster unless resisted.");
1197 int sides = 8 + (plev - 5) / 4;
1200 if (info) return info_damage(dice, sides, 0);
1204 if (!get_aim_dir(&dir)) return NULL;
1205 fire_ball_hide(GF_WOUNDS, dir, damroll(dice, sides), 0);
1211 if (name) return _("致命傷の治癒", "Cure Critical Wounds");
1212 if (desc) return _("体力を大幅に回復させ、負傷と朦朧状態も全快する。", "Heals cut, stun and HP greatly.");
1217 if (info) return info_heal(dice, sides, 0);
1221 hp_player(damroll(dice, sides));
1229 if (name) return _("耐熱耐寒", "Resist Heat and Cold");
1230 if (desc) return _("一定時間、火炎と冷気に対する耐性を得る。装備による耐性に累積する。",
1231 "Gives resistance to fire and cold. These resistances can be added to which from equipment for more powerful resistances.");
1236 if (info) return info_duration(base, base);
1240 set_oppose_cold(randint1(base) + base, FALSE);
1241 set_oppose_fire(randint1(base) + base, FALSE);
1247 if (name) return _("周辺感知", "Sense Surroundings");
1248 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
1251 int rad = DETECT_RAD_MAP;
1253 if (info) return info_radius(rad);
1263 if (name) return _("パニック・アンデッド", "Turn Undead");
1264 if (desc) return _("視界内のアンデッドを恐怖させる。抵抗されると無効。", "Attempts to scare undead monsters in sight.");
1275 if (name) return _("体力回復", "Healing");
1276 if (desc) return _("極めて強力な回復呪文で、負傷と朦朧状態も全快する。", "Much powerful healing magic, and heals cut and stun completely.");
1281 if (info) return info_heal(0, 0, heal);
1293 if (name) return _("結界の紋章", "Glyph of Warding");
1294 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。",
1295 "Sets a glyph on the floor beneath you. Monsters cannot attack you if you are on a glyph, but can try to break glyph.");
1306 if (name) return _("*解呪*", "Dispel Curse");
1307 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
1312 if (remove_all_curse())
1314 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
1321 if (name) return _("鑑識", "Perception");
1322 if (desc) return _("アイテムを識別する。", "Identifies an item.");
1327 if (!ident_spell(FALSE)) return NULL;
1333 if (name) return _("アンデッド退散", "Dispel Undead");
1334 if (desc) return _("視界内の全てのアンデッドにダメージを与える。", "Damages all undead monsters in sight.");
1338 int sides = plev * 5;
1340 if (info) return info_damage(dice, sides, 0);
1344 dispel_undead(damroll(dice, sides));
1350 if (name) return _("凪の刻", "Day of the Dove");
1351 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
1354 int power = plev * 2;
1356 if (info) return info_power(power);
1360 charm_monsters(power);
1366 if (name) return _("致命傷", "Cause Critical Wounds");
1367 if (desc) return _("1体のモンスターに大ダメージを与える。抵抗されると無効。", "Wounds a monster critically unless resisted.");
1370 int dice = 5 + (plev - 5) / 3;
1373 if (info) return info_damage(dice, sides, 0);
1377 if (!get_aim_dir(&dir)) return NULL;
1378 fire_ball_hide(GF_WOUNDS, dir, damroll(dice, sides), 0);
1384 if (name) return _("帰還の詔", "Word of Recall");
1385 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。", "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
1391 if (info) return info_delay(base, sides);
1395 if (!word_of_recall()) return NULL;
1401 if (name) return _("真実の祭壇", "Alter Reality");
1402 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
1408 if (info) return info_delay(base, sides);
1418 if (name) return _("真・結界", "Warding True");
1419 if (desc) return _("自分のいる床と周囲8マスの床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。", "Creates glyphs in all adjacent squares and under you.");
1424 if (info) return info_radius(rad);
1435 if (name) return _("不毛化", "Sterilization");
1436 if (desc) return _("この階の増殖するモンスターが増殖できなくなる。", "Prevents any breeders on current level from breeding.");
1441 num_repro += MAX_REPRO;
1447 if (name) return _("全感知", "Detection");
1448 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。", "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
1451 int rad = DETECT_RAD_DEFAULT;
1453 if (info) return info_radius(rad);
1463 if (name) return _("アンデッド消滅", "Annihilate Undead");
1464 if (desc) return _("自分の周囲にいるアンデッドを現在の階から消し去る。抵抗されると無効。",
1465 "Eliminates all nearby undead monsters, exhausting you. Powerful or unique monsters may be able to resist.");
1468 int power = plev + 50;
1470 if (info) return info_power(power);
1474 mass_genocide_undead(power, TRUE);
1480 if (name) return _("千里眼", "Clairvoyance");
1481 if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。", "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");
1492 if (name) return _("全復活", "Restoration");
1493 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
1510 if (name) return _("*体力回復*", "Healing True");
1511 if (desc) return _("最強の治癒の魔法で、負傷と朦朧状態も全快する。", "The greatest healing magic. Heals all HP, cut and stun.");
1516 if (info) return info_heal(0, 0, heal);
1528 if (name) return _("聖なるビジョン", "Holy Vision");
1529 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
1534 if (!identify_fully(FALSE)) return NULL;
1540 if (name) return _("究極の耐性", "Ultimate Resistance");
1541 if (desc) return _("一定時間、あらゆる耐性を付け、ACと魔法防御能力を上昇させる。", "Gives ultimate resistance, bonus to AC and speed.");
1544 TIME_EFFECT base = (TIME_EFFECT)plev / 2;
1546 if (info) return info_duration(base, base);
1550 TIME_EFFECT v = randint1(base) + base;
1552 set_oppose_acid(v, FALSE);
1553 set_oppose_elec(v, FALSE);
1554 set_oppose_fire(v, FALSE);
1555 set_oppose_cold(v, FALSE);
1556 set_oppose_pois(v, FALSE);
1557 set_ultimate_res(v, FALSE);
1567 * @brief 仙術領域魔法の各処理を行う
1569 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
1570 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
1572 static cptr do_sorcery_spell(SPELL_IDX spell, BIT_FLAGS mode)
1574 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
1575 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
1576 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
1577 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
1580 int plev = p_ptr->lev;
1585 if (name) return _("モンスター感知", "Detect Monsters");
1586 if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
1589 int rad = DETECT_RAD_DEFAULT;
1591 if (info) return info_radius(rad);
1595 detect_monsters_normal(rad);
1601 if (name) return _("ショート・テレポート", "Phase Door");
1602 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");
1605 POSITION range = 10;
1607 if (info) return info_range(range);
1611 teleport_player(range, 0L);
1617 if (name) return _("罠と扉感知", "Detect Doors and Traps");
1618 if (desc) return _("近くの全ての扉と罠を感知する。", "Detects traps, doors, and stairs in your vicinity.");
1621 int rad = DETECT_RAD_DEFAULT;
1623 if (info) return info_radius(rad);
1627 detect_traps(rad, TRUE);
1635 if (name) return _("ライト・エリア", "Light Area");
1636 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
1640 int sides = plev / 2;
1641 int rad = plev / 10 + 1;
1643 if (info) return info_damage(dice, sides, 0);
1647 lite_area(damroll(dice, sides), rad);
1653 if (name) return _("パニック・モンスター", "Confuse Monster");
1654 if (desc) return _("モンスター1体を混乱させる。抵抗されると無効。", "Attempts to confuse a monster.");
1657 int power = (plev * 3) / 2;
1659 if (info) return info_power(power);
1663 if (!get_aim_dir(&dir)) return NULL;
1665 confuse_monster(dir, power);
1671 if (name) return _("テレポート", "Teleport");
1672 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
1675 POSITION range = plev * 5;
1677 if (info) return info_range(range);
1681 teleport_player(range, 0L);
1687 if (name) return _("スリープ・モンスター", "Sleep Monster");
1688 if (desc) return _("モンスター1体を眠らせる。抵抗されると無効。", "Attempts to sleep a monster.");
1693 if (info) return info_power(power);
1697 if (!get_aim_dir(&dir)) return NULL;
1699 sleep_monster(dir, plev);
1705 if (name) return _("魔力充填", "Recharging");
1706 if (desc) return _("杖/魔法棒の充填回数を増やすか、充填中のロッドの充填時間を減らす。", "Recharges staffs, wands or rods.");
1709 int power = plev * 4;
1711 if (info) return info_power(power);
1715 if (!recharge(power)) return NULL;
1721 if (name) return _("魔法の地図", "Magic Mapping");
1722 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
1725 int rad = DETECT_RAD_MAP;
1727 if (info) return info_radius(rad);
1737 if (name) return _("鑑定", "Identify");
1738 if (desc) return _("アイテムを識別する。", "Identifies an item.");
1743 if (!ident_spell(FALSE)) return NULL;
1749 if (name) return _("スロウ・モンスター", "Slow Monster");
1750 if (desc) return _("モンスター1体を減速さる。抵抗されると無効。", "Attempts to slow a monster.");
1755 if (info) return info_power(power);
1759 if (!get_aim_dir(&dir)) return NULL;
1761 slow_monster(dir, plev);
1767 if (name) return _("周辺スリープ", "Mass Sleep");
1768 if (desc) return _("視界内の全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep all monsters in sight.");
1773 if (info) return info_power(power);
1777 sleep_monsters(plev);
1783 if (name) return _("テレポート・モンスター", "Teleport Away");
1784 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
1789 if (info) return info_power(power);
1793 if (!get_aim_dir(&dir)) return NULL;
1795 fire_beam(GF_AWAY_ALL, dir, power);
1801 if (name) return _("スピード", "Haste Self");
1802 if (desc) return _("一定時間、加速する。", "Hastes you for a while.");
1806 int sides = 20 + plev;
1808 if (info) return info_duration(base, sides);
1812 set_fast(randint1(sides) + base, FALSE);
1818 if (name) return _("真・感知", "Detection True");
1819 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
1820 "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
1823 int rad = DETECT_RAD_DEFAULT;
1825 if (info) return info_radius(rad);
1835 if (name) return _("真・鑑定", "Identify True");
1836 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
1841 if (!identify_fully(FALSE)) return NULL;
1847 if (name) return _("物体と財宝感知", "Detect items and Treasure");
1848 if (desc) return _("近くの全てのアイテムと財宝を感知する。", "Detects all treasures and items in your vicinity.");
1851 int rad = DETECT_RAD_DEFAULT;
1853 if (info) return info_radius(rad);
1857 detect_objects_normal(rad);
1858 detect_treasure(rad);
1859 detect_objects_gold(rad);
1865 if (name) return _("チャーム・モンスター", "Charm Monster");
1866 if (desc) return _("モンスター1体を魅了する。抵抗されると無効。", "Attempts to charm a monster.");
1871 if (info) return info_power(power);
1875 if (!get_aim_dir(&dir)) return NULL;
1877 charm_monster(dir, power);
1883 if (name) return _("精神感知", "Sense Minds");
1884 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
1890 if (info) return info_duration(base, sides);
1894 set_tim_esp(randint1(sides) + base, FALSE);
1900 if (name) return _("街移動", "Teleport to town");
1901 if (desc) return _("街へ移動する。地上にいるときしか使えない。", "Teleport to a town which you choose in a moment. Can only be used outdoors.");
1906 if (!tele_town()) return NULL;
1912 if (name) return _("自己分析", "Self Knowledge");
1913 if (desc) return _("現在の自分の状態を完全に知る。",
1914 "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");
1925 if (name) return _("テレポート・レベル", "Teleport Level");
1926 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");
1931 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
1938 if (name) return _("帰還の呪文", "Word of Recall");
1939 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
1940 "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
1946 if (info) return info_delay(base, sides);
1950 if (!word_of_recall()) return NULL;
1956 if (name) return _("次元の扉", "Dimension Door");
1957 if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleport to given location.");
1960 POSITION range = plev / 2 + 10;
1962 if (info) return info_range(range);
1966 msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));
1967 if (!dimension_door()) return NULL;
1973 if (name) return _("調査", "Probing");
1974 if (desc) return _("モンスターの属性、残り体力、最大体力、スピード、正体を知る。",
1975 "Proves all monsters' alignment, HP, speed and their true character.");
1986 if (name) return _("爆発のルーン", "Explosive Rune");
1987 if (desc) return _("自分のいる床の上に、モンスターが通ると爆発してダメージを与えるルーンを描く。",
1988 "Sets a glyph under you. The glyph will explode when a monster moves on it.");
1995 if (info) return info_damage(dice, sides, base);
2005 if (name) return _("念動力", "Telekinesis");
2006 if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");
2009 int weight = plev * 15;
2011 if (info) return info_weight(weight);
2015 if (!get_aim_dir(&dir)) return NULL;
2017 fetch(dir, weight, FALSE);
2023 if (name) return _("千里眼", "Clairvoyance");
2024 if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。さらに、一定時間テレパシー能力を得る。",
2025 "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");
2031 if (info) return info_duration(base, sides);
2035 chg_virtue(V_KNOWLEDGE, 1);
2036 chg_virtue(V_ENLIGHTEN, 1);
2040 if (!p_ptr->telepathy)
2042 set_tim_esp(randint1(sides) + base, FALSE);
2049 if (name) return _("魅了の視線", "Charm monsters");
2050 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
2053 int power = plev * 2;
2055 if (info) return info_power(power);
2059 charm_monsters(power);
2065 if (name) return _("錬金術", "Alchemy");
2066 if (desc) return _("アイテム1つをお金に変える。", "Turns an item into 1/3 of its value in gold.");
2071 if (!alchemy()) return NULL;
2077 if (name) return _("怪物追放", "Banishment");
2078 if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");
2081 int power = plev * 4;
2083 if (info) return info_power(power);
2087 banish_monsters(power);
2093 if (name) return _("無傷の球", "Globe of Invulnerability");
2094 if (desc) return _("一定時間、ダメージを受けなくなるバリアを張る。切れた瞬間に少しターンを消費するので注意。",
2095 "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks or duration time is exceeded.");
2100 if (info) return info_duration(base, base);
2104 set_invuln(randint1(base) + base, FALSE);
2115 * @brief 自然領域魔法の各処理を行う
2117 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
2118 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
2120 static cptr do_nature_spell(SPELL_IDX spell, BIT_FLAGS mode)
2122 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
2123 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
2124 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
2125 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
2127 static const char s_dam[] = _("損傷:", "dam ");
2128 static const char s_rng[] = _("射程", "rng ");
2131 int plev = p_ptr->lev;
2136 if (name) return _("モンスター感知", "Detect Creatures");
2137 if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
2140 int rad = DETECT_RAD_DEFAULT;
2142 if (info) return info_radius(rad);
2146 detect_monsters_normal(rad);
2152 if (name) return _("稲妻", "Lightning");
2153 if (desc) return _("電撃の短いビームを放つ。", "Fires a short beam of lightning.");
2156 int dice = 3 + (plev - 1) / 5;
2158 POSITION range = plev / 6 + 2;
2160 if (info) return format("%s%dd%d %s%d", s_dam, dice, sides, s_rng, range);
2164 project_length = range;
2166 if (!get_aim_dir(&dir)) return NULL;
2168 fire_beam(GF_ELEC, dir, damroll(dice, sides));
2174 if (name) return _("罠と扉感知", "Detect Doors and Traps");
2175 if (desc) return _("近くの全ての罠と扉を感知する。", "Detects traps, doors, and stairs in your vicinity.");
2178 int rad = DETECT_RAD_DEFAULT;
2180 if (info) return info_radius(rad);
2184 detect_traps(rad, TRUE);
2192 if (name) return _("食糧生成", "Produce Food");
2193 if (desc) return _("食料を一つ作り出す。", "Produces a Ration of Food.");
2198 object_type forge, *q_ptr = &forge;
2199 msg_print(_("食料を生成した。", "A food ration is produced."));
2201 /* Create the food ration */
2202 object_prep(q_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION));
2204 /* Drop the object from heaven */
2205 drop_near(q_ptr, -1, p_ptr->y, p_ptr->x);
2211 if (name) return _("日の光", "Daylight");
2212 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
2216 int sides = plev / 2;
2217 int rad = (plev / 10) + 1;
2219 if (info) return info_damage(dice, sides, 0);
2223 lite_area(damroll(dice, sides), rad);
2225 if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)
2227 msg_print(_("日の光があなたの肉体を焦がした!", "The daylight scorches your flesh!"));
2228 take_hit(DAMAGE_NOESCAPE, damroll(2, 2), _("日の光", "daylight"), -1);
2235 if (name) return _("動物習し", "Animal Taming");
2236 if (desc) return _("動物1体を魅了する。抵抗されると無効。", "Attempts to charm an animal.");
2241 if (info) return info_power(power);
2245 if (!get_aim_dir(&dir)) return NULL;
2247 charm_animal(dir, power);
2253 if (name) return _("環境への耐性", "Resist Environment");
2254 if (desc) return _("一定時間、冷気、炎、電撃に対する耐性を得る。装備による耐性に累積する。",
2255 "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");
2260 if (info) return info_duration(base, base);
2264 set_oppose_cold(randint1(base) + base, FALSE);
2265 set_oppose_fire(randint1(base) + base, FALSE);
2266 set_oppose_elec(randint1(base) + base, FALSE);
2272 if (name) return _("傷と毒治療", "Cure Wounds & Poison");
2273 if (desc) return _("怪我を全快させ、毒を体から完全に取り除き、体力を少し回復させる。", "Heals all cut and poison status. Heals HP a little.");
2279 if (info) return info_heal(dice, sides, 0);
2283 hp_player(damroll(dice, sides));
2291 if (name) return _("岩石溶解", "Stone to Mud");
2292 if (desc) return _("壁を溶かして床にする。", "Turns one rock square to mud.");
2299 if (info) return info_damage(dice, sides, base);
2303 if (!get_aim_dir(&dir)) return NULL;
2305 wall_to_mud(dir, 20 + randint1(30));
2311 if (name) return _("アイス・ボルト", "Frost Bolt");
2312 if (desc) return _("冷気のボルトもしくはビームを放つ。", "Fires a bolt or beam of cold.");
2315 int dice = 3 + (plev - 5) / 4;
2318 if (info) return info_damage(dice, sides, 0);
2322 if (!get_aim_dir(&dir)) return NULL;
2323 fire_bolt_or_beam(beam_chance() - 10, GF_COLD, dir, damroll(dice, sides));
2329 if (name) return _("自然の覚醒", "Nature Awareness");
2330 if (desc) return _("周辺の地形を感知し、近くの罠、扉、階段、全てのモンスターを感知する。",
2331 "Maps nearby area. Detects all monsters, traps, doors and stairs.");
2334 int rad1 = DETECT_RAD_MAP;
2335 int rad2 = DETECT_RAD_DEFAULT;
2337 if (info) return info_radius(MAX(rad1, rad2));
2342 detect_traps(rad2, TRUE);
2344 detect_stairs(rad2);
2345 detect_monsters_normal(rad2);
2351 if (name) return _("ファイア・ボルト", "Fire Bolt");
2352 if (desc) return _("火炎のボルトもしくはビームを放つ。", "Fires a bolt or beam of fire.");
2355 int dice = 5 + (plev - 5) / 4;
2358 if (info) return info_damage(dice, sides, 0);
2362 if (!get_aim_dir(&dir)) return NULL;
2363 fire_bolt_or_beam(beam_chance() - 10, GF_FIRE, dir, damroll(dice, sides));
2369 if (name) return _("太陽光線", "Ray of Sunlight");
2370 if (desc) return _("光線を放つ。光りを嫌うモンスターに効果がある。", "Fires a beam of light which damages to light-sensitive monsters.");
2376 if (info) return info_damage(dice, sides, 0);
2380 if (!get_aim_dir(&dir)) return NULL;
2381 msg_print(_("太陽光線が現れた。", "A line of sunlight appears."));
2382 lite_line(dir, damroll(6, 8));
2388 if (name) return _("足かせ", "Entangle");
2389 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
2394 if (info) return info_power(power);
2398 slow_monsters(plev);
2404 if (name) return _("動物召喚", "Summon Animal");
2405 if (desc) return _("動物を1体召喚する。", "Summons an animal.");
2410 if (!(summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_ANIMAL_RANGER, (PM_ALLOW_GROUP | PM_FORCE_PET))))
2412 msg_print(_("動物は現れなかった。", "No animals arrive."));
2420 if (name) return _("薬草治療", "Herbal Healing");
2421 if (desc) return _("体力を大幅に回復させ、負傷、朦朧状態、毒から全快する。", "Heals HP greatly. And heals cut, stun and poison completely.");
2426 if (info) return info_heal(0, 0, heal);
2439 if (name) return _("階段生成", "Stair Building");
2440 if (desc) return _("自分のいる位置に階段を作る。", "Creates a stair which goes down or up.");
2451 if (name) return _("肌石化", "Stone Skin");
2452 if (desc) return _("一定時間、ACを上昇させる。", "Gives bonus to AC for a while.");
2458 if (info) return info_duration(base, sides);
2462 set_shield(randint1(sides) + base, FALSE);
2468 if (name) return _("真・耐性", "Resistance True");
2469 if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
2470 "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.");
2475 if (info) return info_duration(base, base);
2479 set_oppose_acid(randint1(base) + base, FALSE);
2480 set_oppose_elec(randint1(base) + base, FALSE);
2481 set_oppose_fire(randint1(base) + base, FALSE);
2482 set_oppose_cold(randint1(base) + base, FALSE);
2483 set_oppose_pois(randint1(base) + base, FALSE);
2489 if (name) return _("森林創造", "Forest Creation");
2490 if (desc) return _("周囲に木を作り出す。", "Creates trees in all adjacent squares.");
2501 if (name) return _("動物友和", "Animal Friendship");
2502 if (desc) return _("視界内の全ての動物を魅了する。抵抗されると無効。", "Attempts to charm all animals in sight.");
2505 int power = plev * 2;
2507 if (info) return info_power(power);
2511 charm_animals(power);
2517 if (name) return _("試金石", "Stone Tell");
2518 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
2523 if (!identify_fully(FALSE)) return NULL;
2529 if (name) return _("石の壁", "Wall of Stone");
2530 if (desc) return _("自分の周囲に花崗岩の壁を作る。", "Creates granite walls in all adjacent squares.");
2541 if (name) return _("腐食防止", "Protect from Corrosion");
2542 if (desc) return _("アイテムを酸で傷つかないよう加工する。", "Makes an equipment acid-proof.");
2547 if (!rustproof()) return NULL;
2553 if (name) return _("地震", "Earthquake");
2554 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
2555 "Shakes dungeon structure, and results in random swapping of floors and walls.");
2560 if (info) return info_radius(rad);
2564 earthquake(p_ptr->y, p_ptr->x, rad);
2570 if (name) return _("カマイタチ", "Cyclone");
2571 if (desc) return _("全方向に向かって攻撃する。", "Attacks all adjacent monsters.");
2578 monster_type *m_ptr;
2580 for (dir = 0; dir < 8; dir++)
2582 y = p_ptr->y + ddy_ddd[dir];
2583 x = p_ptr->x + ddx_ddd[dir];
2584 c_ptr = &cave[y][x];
2586 /* Get the monster */
2587 m_ptr = &m_list[c_ptr->m_idx];
2589 /* Hack -- attack monsters */
2590 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
2598 if (name) return _("ブリザード", "Blizzard");
2599 if (desc) return _("巨大な冷気の球を放つ。", "Fires a huge ball of cold.");
2602 HIT_POINT dam = 70 + plev * 3 / 2;
2603 int rad = plev / 12 + 1;
2605 if (info) return info_damage(0, 0, dam);
2609 if (!get_aim_dir(&dir)) return NULL;
2611 fire_ball(GF_COLD, dir, dam, rad);
2617 if (name) return _("稲妻嵐", "Lightning Storm");
2618 if (desc) return _("巨大な電撃の球を放つ。", "Fires a huge electric ball.");
2621 HIT_POINT dam = 90 + plev * 3 / 2;
2622 int rad = plev / 12 + 1;
2624 if (info) return info_damage(0, 0, dam);
2628 if (!get_aim_dir(&dir)) return NULL;
2629 fire_ball(GF_ELEC, dir, dam, rad);
2636 if (name) return _("渦潮", "Whirlpool");
2637 if (desc) return _("巨大な水の球を放つ。", "Fires a huge ball of water.");
2640 HIT_POINT dam = 100 + plev * 3 / 2;
2641 int rad = plev / 12 + 1;
2643 if (info) return info_damage(0, 0, dam);
2647 if (!get_aim_dir(&dir)) return NULL;
2648 fire_ball(GF_WATER, dir, dam, rad);
2654 if (name) return _("陽光召喚", "Call Sunlight");
2655 if (desc) return _("自分を中心とした光の球を発生させる。さらに、その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。",
2656 "Generates ball of light centered on you. Maps and lights whole dungeon level. Knows all objects location.");
2659 HIT_POINT dam = 150;
2662 if (info) return info_damage(0, 0, dam/2);
2666 fire_ball(GF_LITE, 0, dam, rad);
2667 chg_virtue(V_KNOWLEDGE, 1);
2668 chg_virtue(V_ENLIGHTEN, 1);
2671 if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)
2673 msg_print(_("日光があなたの肉体を焦がした!", "The sunlight scorches your flesh!"));
2674 take_hit(DAMAGE_NOESCAPE, 50, _("日光", "sunlight"), -1);
2681 if (name) return _("精霊の刃", "Elemental Branding");
2682 if (desc) return _("武器に炎か冷気の属性をつける。", "Makes current weapon fire or frost branded.");
2687 brand_weapon(randint0(2));
2693 if (name) return _("自然の脅威", "Nature's Wrath");
2694 if (desc) return _("近くの全てのモンスターにダメージを与え、地震を起こし、自分を中心とした分解の球を発生させる。",
2695 "Damages all monsters in sight. Makes quake. Generates disintegration ball centered on you.");
2698 int d_dam = 4 * plev;
2699 int b_dam = (100 + plev) * 2;
2700 int b_rad = 1 + plev / 12;
2701 int q_rad = 20 + plev / 2;
2703 if (info) return format("%s%d+%d", s_dam, d_dam, b_dam/2);
2707 dispel_monsters(d_dam);
2708 earthquake(p_ptr->y, p_ptr->x, q_rad);
2709 project(0, b_rad, p_ptr->y, p_ptr->x, b_dam, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM, -1);
2720 * @brief カオス領域魔法の各処理を行う
2722 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
2723 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
2725 static cptr do_chaos_spell(SPELL_IDX spell, BIT_FLAGS mode)
2727 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
2728 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
2729 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
2730 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
2732 static const char s_dam[] = _("損傷:", "dam ");
2733 static const char s_random[] = _("ランダム", "random");
2736 int plev = p_ptr->lev;
2741 if (name) return _("マジック・ミサイル", "Magic Missile");
2742 if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");
2745 int dice = 3 + ((plev - 1) / 5);
2748 if (info) return info_damage(dice, sides, 0);
2752 if (!get_aim_dir(&dir)) return NULL;
2754 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));
2760 if (name) return _("トラップ/ドア破壊", "Trap / Door Destruction");
2761 if (desc) return _("隣接する罠と扉を破壊する。", "Destroys all traps in adjacent squares.");
2766 if (info) return info_radius(rad);
2770 destroy_doors_touch();
2776 if (name) return _("閃光", "Flash of Light");
2777 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
2781 int sides = plev / 2;
2782 int rad = (plev / 10) + 1;
2784 if (info) return info_damage(dice, sides, 0);
2788 lite_area(damroll(dice, sides), rad);
2794 if (name) return _("混乱の手", "Touch of Confusion");
2795 if (desc) return _("相手を混乱させる攻撃をできるようにする。", "Attempts to confuse the next monster that you hit.");
2800 if (!(p_ptr->special_attack & ATTACK_CONFUSE))
2802 msg_print(_("あなたの手は光り始めた。", "Your hands start glowing."));
2803 p_ptr->special_attack |= ATTACK_CONFUSE;
2804 p_ptr->redraw |= (PR_STATUS);
2811 if (name) return _("魔力炸裂", "Mana Burst");
2812 if (desc) return _("魔法の球を放つ。", "Fires a ball of magic.");
2817 int rad = (plev < 30) ? 2 : 3;
2820 if (p_ptr->pclass == CLASS_MAGE ||
2821 p_ptr->pclass == CLASS_HIGH_MAGE ||
2822 p_ptr->pclass == CLASS_SORCERER)
2823 base = plev + plev / 2;
2825 base = plev + plev / 4;
2828 if (info) return info_damage(dice, sides, base);
2832 if (!get_aim_dir(&dir)) return NULL;
2834 fire_ball(GF_MISSILE, dir, damroll(dice, sides) + base, rad);
2837 * Shouldn't actually use GF_MANA, as
2838 * it will destroy all items on the
2846 if (name) return _("ファイア・ボルト", "Fire Bolt");
2847 if (desc) return _("炎のボルトもしくはビームを放つ。", "Fires a bolt or beam of fire.");
2850 int dice = 8 + (plev - 5) / 4;
2853 if (info) return info_damage(dice, sides, 0);
2857 if (!get_aim_dir(&dir)) return NULL;
2859 fire_bolt_or_beam(beam_chance(), GF_FIRE, dir, damroll(dice, sides));
2865 if (name) return _("力の拳", "Fist of Force");
2866 if (desc) return _("ごく小さな分解の球を放つ。", "Fires a tiny ball of disintegration.");
2869 int dice = 8 + ((plev - 5) / 4);
2872 if (info) return info_damage(dice, sides, 0);
2876 if (!get_aim_dir(&dir)) return NULL;
2878 fire_ball(GF_DISINTEGRATE, dir,
2879 damroll(dice, sides), 0);
2885 if (name) return _("テレポート", "Teleport Self");
2886 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
2889 POSITION range = plev * 5;
2891 if (info) return info_range(range);
2895 teleport_player(range, 0L);
2901 if (name) return _("ワンダー", "Wonder");
2902 if (desc) return _("モンスターにランダムな効果を与える。", "Fires something with random effects.");
2905 if (info) return s_random;
2910 if (!get_aim_dir(&dir)) return NULL;
2918 if (name) return _("カオス・ボルト", "Chaos Bolt");
2919 if (desc) return _("カオスのボルトもしくはビームを放つ。", "Fires a bolt or ball of chaos.");
2922 int dice = 10 + (plev - 5) / 4;
2925 if (info) return info_damage(dice, sides, 0);
2929 if (!get_aim_dir(&dir)) return NULL;
2931 fire_bolt_or_beam(beam_chance(), GF_CHAOS, dir, damroll(dice, sides));
2937 if (name) return _("ソニック・ブーム", "Sonic Boom");
2938 if (desc) return _("自分を中心とした轟音の球を発生させる。", "Generates a ball of sound centered on you.");
2941 HIT_POINT dam = 60 + plev;
2942 int rad = plev / 10 + 2;
2944 if (info) return info_damage(0, 0, dam/2);
2948 msg_print(_("ドーン!部屋が揺れた!", "BOOM! Shake the room!"));
2949 project(0, rad, p_ptr->y, p_ptr->x, dam, GF_SOUND, PROJECT_KILL | PROJECT_ITEM, -1);
2955 if (name) return _("破滅の矢", "Doom Bolt");
2956 if (desc) return _("純粋な魔力のビームを放つ。", "Fires a beam of pure mana.");
2959 int dice = 11 + (plev - 5) / 4;
2962 if (info) return info_damage(dice, sides, 0);
2966 if (!get_aim_dir(&dir)) return NULL;
2968 fire_beam(GF_MANA, dir, damroll(dice, sides));
2974 if (name) return _("ファイア・ボール", "Fire Ball");
2975 if (desc) return _("炎の球を放つ。", "Fires a ball of fire.");
2978 HIT_POINT dam = plev + 55;
2981 if (info) return info_damage(0, 0, dam);
2985 if (!get_aim_dir(&dir)) return NULL;
2987 fire_ball(GF_FIRE, dir, dam, rad);
2993 if (name) return _("テレポート・アウェイ", "Teleport Other");
2994 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
2999 if (info) return info_power(power);
3003 if (!get_aim_dir(&dir)) return NULL;
3005 fire_beam(GF_AWAY_ALL, dir, power);
3011 if (name) return _("破壊の言葉", "Word of Destruction");
3012 if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroy everything in nearby area.");
3020 destroy_area(p_ptr->y, p_ptr->x, base + randint1(sides), FALSE);
3026 if (name) return _("ログルス発動", "Invoke Logrus");
3027 if (desc) return _("巨大なカオスの球を放つ。", "Fires a huge ball of chaos.");
3030 HIT_POINT dam = plev * 2 + 99;
3033 if (info) return info_damage(0, 0, dam);
3037 if (!get_aim_dir(&dir)) return NULL;
3039 fire_ball(GF_CHAOS, dir, dam, rad);
3045 if (name) return _("他者変容", "Polymorph Other");
3046 if (desc) return _("モンスター1体を変身させる。抵抗されると無効。", "Attempts to polymorph a monster.");
3051 if (info) return info_power(power);
3055 if (!get_aim_dir(&dir)) return NULL;
3057 poly_monster(dir, plev);
3063 if (name) return _("連鎖稲妻", "Chain Lightning");
3064 if (desc) return _("全方向に対して電撃のビームを放つ。", "Fires lightning beams in all directions.");
3067 int dice = 5 + plev / 10;
3070 if (info) return info_damage(dice, sides, 0);
3074 for (dir = 0; dir <= 9; dir++)
3075 fire_beam(GF_ELEC, dir, damroll(dice, sides));
3081 if (name) return _("魔力封入", "Arcane Binding");
3082 if (desc) return _("杖/魔法棒の充填回数を増やすか、充填中のロッドの充填時間を減らす。", "Recharges staffs, wands or rods.");
3087 if (info) return info_power(power);
3091 if (!recharge(power)) return NULL;
3097 if (name) return _("原子分解", "Disintegrate");
3098 if (desc) return _("巨大な分解の球を放つ。", "Fires a huge ball of disintegration.");
3101 HIT_POINT dam = plev + 70;
3102 int rad = 3 + plev / 40;
3104 if (info) return info_damage(0, 0, dam);
3108 if (!get_aim_dir(&dir)) return NULL;
3110 fire_ball(GF_DISINTEGRATE, dir, dam, rad);
3116 if (name) return _("現実変容", "Alter Reality");
3117 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
3123 if (info) return info_delay(base, sides);
3133 if (name) return _("マジック・ロケット", "Magic Rocket");
3134 if (desc) return _("ロケットを発射する。", "Fires a magic rocket.");
3137 HIT_POINT dam = 120 + plev * 2;
3140 if (info) return info_damage(0, 0, dam);
3144 if (!get_aim_dir(&dir)) return NULL;
3146 msg_print(_("ロケット発射!", "You launch a rocket!"));
3147 fire_rocket(GF_ROCKET, dir, dam, rad);
3153 if (name) return _("混沌の刃", "Chaos Branding");
3154 if (desc) return _("武器にカオスの属性をつける。", "Makes current weapon a Chaotic weapon.");
3165 if (name) return _("悪魔召喚", "Summon Demon");
3166 if (desc) return _("悪魔を1体召喚する。", "Summons a demon.");
3172 bool pet = !one_in_(3);
3174 if (pet) flg |= PM_FORCE_PET;
3175 else flg |= PM_NO_PET;
3176 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
3178 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_DEMON, flg))
3180 msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));
3183 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
3187 msg_print(_("「卑しき者よ、我は汝の下僕にあらず! お前の魂を頂くぞ!」",
3188 "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));
3196 if (name) return _("重力光線", "Beam of Gravity");
3197 if (desc) return _("重力のビームを放つ。", "Fires a beam of gravity.");
3200 int dice = 9 + (plev - 5) / 4;
3203 if (info) return info_damage(dice, sides, 0);
3207 if (!get_aim_dir(&dir)) return NULL;
3209 fire_beam(GF_GRAVITY, dir, damroll(dice, sides));
3215 if (name) return _("流星群", "Meteor Swarm");
3216 if (desc) return _("自分の周辺に隕石を落とす。", "Makes meteor balls fall down to nearby random locations.");
3219 HIT_POINT dam = plev * 2;
3222 if (info) return info_multi_damage(dam);
3226 cast_meteor(dam, rad);
3232 if (name) return _("焔の一撃", "Flame Strike");
3233 if (desc) return _("自分を中心とした超巨大な炎の球を発生させる。", "Generate a huge ball of fire centered on you.");
3236 HIT_POINT dam = 300 + 3 * plev;
3239 if (info) return info_damage(0, 0, dam/2);
3243 fire_ball(GF_FIRE, 0, dam, rad);
3249 if (name) return _("混沌召来", "Call Chaos");
3250 if (desc) return _("ランダムな属性の球やビームを発生させる。", "Generate random kind of balls or beams.");
3253 if (info) return format("%s150 / 250", s_dam);
3263 if (name) return _("自己変容", "Polymorph Self");
3264 if (desc) return _("自分を変身させようとする。", "Polymorphs yourself.");
3269 if (!get_check(_("変身します。よろしいですか?", "You will polymorph yourself. Are you sure? "))) return NULL;
3276 if (name) return _("魔力の嵐", "Mana Storm");
3277 if (desc) return _("非常に強力で巨大な純粋な魔力の球を放つ。", "Fires an extremely powerful huge ball of pure mana.");
3280 HIT_POINT dam = 300 + plev * 4;
3283 if (info) return info_damage(0, 0, dam);
3287 if (!get_aim_dir(&dir)) return NULL;
3289 fire_ball(GF_MANA, dir, dam, rad);
3295 if (name) return _("ログルスのブレス", "Breathe Logrus");
3296 if (desc) return _("非常に強力なカオスの球を放つ。", "Fires an extremely powerful ball of chaos.");
3299 HIT_POINT dam = p_ptr->chp;
3302 if (info) return info_damage(0, 0, dam);
3306 if (!get_aim_dir(&dir)) return NULL;
3308 fire_ball(GF_CHAOS, dir, dam, rad);
3314 if (name) return _("虚無召来", "Call the Void");
3315 if (desc) return _("自分に周囲に向かって、ロケット、純粋な魔力の球、放射性廃棄物の球を放つ。ただし、壁に隣接して使用すると広範囲を破壊する。",
3316 "Fires rockets, mana balls and nuclear waste balls in all directions each unless you are not adjacent to any walls. Otherwise *destroys* huge area.");
3319 if (info) return format("%s3 * 175", s_dam);
3333 * @brief 暗黒領域魔法の各処理を行う
3335 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
3336 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
3338 static cptr do_death_spell(SPELL_IDX spell, BIT_FLAGS mode)
3340 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
3341 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
3342 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
3343 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
3345 static const char s_dam[] = _("損傷:", "dam ");
3346 static const char s_random[] = _("ランダム", "random");
3349 int plev = p_ptr->lev;
3354 if (name) return _("無生命感知", "Detect Unlife");
3355 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
3358 int rad = DETECT_RAD_DEFAULT;
3360 if (info) return info_radius(rad);
3364 detect_monsters_nonliving(rad);
3370 if (name) return _("呪殺弾", "Malediction");
3371 if (desc) return _("ごく小さな邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",
3372 "Fires a tiny ball of evil power which hurts good monsters greatly.");
3375 int dice = 3 + (plev - 1) / 5;
3379 if (info) return info_damage(dice, sides, 0);
3383 if (!get_aim_dir(&dir)) return NULL;
3386 * A radius-0 ball may (1) be aimed at
3387 * objects etc., and will affect them;
3388 * (2) may be aimed at ANY visible
3389 * monster, unlike a 'bolt' which must
3390 * travel to the monster.
3393 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides), rad);
3397 /* Special effect first */
3398 int effect = randint1(1000);
3401 fire_ball_hide(GF_DEATH_RAY, dir, plev * 200, 0);
3402 else if (effect < 500)
3403 fire_ball_hide(GF_TURN_ALL, dir, plev, 0);
3404 else if (effect < 800)
3405 fire_ball_hide(GF_OLD_CONF, dir, plev, 0);
3407 fire_ball_hide(GF_STUN, dir, plev, 0);
3414 if (name) return _("邪悪感知", "Detect Evil");
3415 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
3418 int rad = DETECT_RAD_DEFAULT;
3420 if (info) return info_radius(rad);
3424 detect_monsters_evil(rad);
3430 if (name) return _("悪臭雲", "Stinking Cloud");
3431 if (desc) return _("毒の球を放つ。", "Fires a ball of poison.");
3434 HIT_POINT dam = 10 + plev / 2;
3437 if (info) return info_damage(0, 0, dam);
3441 if (!get_aim_dir(&dir)) return NULL;
3443 fire_ball(GF_POIS, dir, dam, rad);
3449 if (name) return _("黒い眠り", "Black Sleep");
3450 if (desc) return _("1体のモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep a monster.");
3455 if (info) return info_power(power);
3459 if (!get_aim_dir(&dir)) return NULL;
3461 sleep_monster(dir, plev);
3467 if (name) return _("耐毒", "Resist Poison");
3468 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",
3469 "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");
3474 if (info) return info_duration(base, base);
3478 set_oppose_pois(randint1(base) + base, FALSE);
3484 if (name) return _("恐慌", "Horrify");
3485 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
3490 if (info) return info_power(power);
3494 if (!get_aim_dir(&dir)) return NULL;
3496 fear_monster(dir, power);
3497 stun_monster(dir, power);
3503 if (name) return _("アンデッド従属", "Enslave Undead");
3504 if (desc) return _("アンデッド1体を魅了する。抵抗されると無効。", "Attempts to charm an undead monster.");
3509 if (info) return info_power(power);
3513 if (!get_aim_dir(&dir)) return NULL;
3515 control_one_undead(dir, power);
3521 if (name) return _("エントロピーの球", "Orb of Entropy");
3522 if (desc) return _("生命のある者のHPと最大HP双方にダメージを与える効果のある球を放つ。", "Fires a ball which damages to both HP and MaxHP of living monsters.");
3527 int rad = (plev < 30) ? 2 : 3;
3530 if (p_ptr->pclass == CLASS_MAGE ||
3531 p_ptr->pclass == CLASS_HIGH_MAGE ||
3532 p_ptr->pclass == CLASS_SORCERER)
3533 base = plev + plev / 2;
3535 base = plev + plev / 4;
3538 if (info) return info_damage(dice, sides, base);
3542 if (!get_aim_dir(&dir)) return NULL;
3544 fire_ball(GF_HYPODYNAMIA, dir, damroll(dice, sides) + base, rad);
3550 if (name) return _("地獄の矢", "Nether Bolt");
3551 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
3554 int dice = 8 + (plev - 5) / 4;
3557 if (info) return info_damage(dice, sides, 0);
3561 if (!get_aim_dir(&dir)) return NULL;
3563 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
3569 if (name) return _("殺戮雲", "Cloud kill");
3570 if (desc) return _("自分を中心とした毒の球を発生させる。", "Generate a ball of poison centered on you.");
3573 HIT_POINT dam = (30 + plev) * 2;
3574 int rad = plev / 10 + 2;
3576 if (info) return info_damage(0, 0, dam/2);
3580 project(0, rad, p_ptr->y, p_ptr->x, dam, GF_POIS, PROJECT_KILL | PROJECT_ITEM, -1);
3586 if (name) return _("モンスター消滅", "Genocide One");
3587 if (desc) return _("モンスター1体を消し去る。経験値やアイテムは手に入らない。抵抗されると無効。", "Attempts to vanish a monster.");
3590 int power = plev + 50;
3592 if (info) return info_power(power);
3596 if (!get_aim_dir(&dir)) return NULL;
3598 fire_ball_hide(GF_GENOCIDE, dir, power, 0);
3604 if (name) return _("毒の刃", "Poison Branding");
3605 if (desc) return _("武器に毒の属性をつける。", "Makes current weapon poison branded.");
3616 if (name) return _("吸血ドレイン", "Vampiric Drain");
3617 if (desc) return _("モンスター1体から生命力を吸いとる。吸いとった生命力によって満腹度が上がる。",
3618 "Absorbs some HP from a monster and gives them to you. You will also gain nutritional sustenance from this.");
3622 int sides = plev * 2;
3623 int base = plev * 2;
3625 if (info) return info_damage(dice, sides, base);
3629 HIT_POINT dam = base + damroll(dice, sides);
3631 if (!get_aim_dir(&dir)) return NULL;
3633 if (drain_life(dir, dam))
3635 chg_virtue(V_SACRIFICE, -1);
3636 chg_virtue(V_VITALITY, -1);
3641 * Gain nutritional sustenance:
3644 * A Food ration gives 5000
3645 * food points (by contrast)
3646 * Don't ever get more than
3647 * "Full" this way But if we
3648 * ARE Gorged, it won't cure
3651 dam = p_ptr->food + MIN(5000, 100 * dam);
3653 /* Not gorged already */
3654 if (p_ptr->food < PY_FOOD_MAX)
3655 set_food(dam >= PY_FOOD_MAX ? PY_FOOD_MAX - 1 : dam);
3662 if (name) return _("反魂の術", "Animate dead");
3663 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
3668 animate_dead(0, p_ptr->y, p_ptr->x);
3674 if (name) return _("抹殺", "Genocide");
3675 if (desc) return _("指定した文字のモンスターを現在の階から消し去る。抵抗されると無効。",
3676 "Eliminates an entire class of monster, exhausting you. Powerful or unique monsters may resist.");
3679 int power = plev+50;
3681 if (info) return info_power(power);
3685 symbol_genocide(power, TRUE);
3691 if (name) return _("狂戦士化", "Berserk");
3692 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");
3697 if (info) return info_duration(base, base);
3701 set_shero(randint1(base) + base, FALSE);
3709 if (name) return _("悪霊召喚", "Invoke Spirits");
3710 if (desc) return _("ランダムで様々な効果が起こる。", "Causes random effects.");
3713 if (info) return s_random;
3717 if (!get_aim_dir(&dir)) return NULL;
3719 cast_invoke_spirits(dir);
3725 if (name) return _("暗黒の矢", "Dark Bolt");
3726 if (desc) return _("暗黒のボルトもしくはビームを放つ。", "Fires a bolt or beam of darkness.");
3729 int dice = 4 + (plev - 5) / 4;
3732 if (info) return info_damage(dice, sides, 0);
3736 if (!get_aim_dir(&dir)) return NULL;
3738 fire_bolt_or_beam(beam_chance(), GF_DARK, dir, damroll(dice, sides));
3744 if (name) return _("狂乱戦士", "Battle Frenzy");
3745 if (desc) return _("狂戦士化し、恐怖を除去し、加速する。",
3746 "Gives another bonus to hit and HP, immunity to fear for a while. Hastes you. But decreases AC.");
3750 int sp_base = plev / 2;
3751 int sp_sides = 20 + plev / 2;
3753 if (info) return info_duration(b_base, b_base);
3757 set_shero(randint1(25) + 25, FALSE);
3760 set_fast(randint1(sp_sides) + sp_base, FALSE);
3766 if (name) return _("吸血の刃", "Vampiric Branding");
3767 if (desc) return _("武器に吸血の属性をつける。", "Makes current weapon Vampiric.");
3778 if (name) return _("真・吸血", "Vampirism True");
3779 if (desc) return _("モンスター1体から生命力を吸いとる。吸いとった生命力によって体力が回復する。",
3780 "Fires 3 bolts. Each of the bolts absorbs some HP from a monster and gives them to you.");
3783 HIT_POINT dam = 100;
3785 if (info) return format("%s3*%d", s_dam, dam);
3791 if (!get_aim_dir(&dir)) return NULL;
3793 chg_virtue(V_SACRIFICE, -1);
3794 chg_virtue(V_VITALITY, -1);
3796 for (i = 0; i < 3; i++)
3798 if (drain_life(dir, dam))
3806 if (name) return _("死の言魂", "Nether Wave");
3807 if (desc) return _("視界内の生命のあるモンスターにダメージを与える。", "Damages all living monsters in sight.");
3810 int sides = plev * 3;
3812 if (info) return info_damage(1, sides, 0);
3816 dispel_living(randint1(sides));
3822 if (name) return _("暗黒の嵐", "Darkness Storm");
3823 if (desc) return _("巨大な暗黒の球を放つ。", "Fires a huge ball of darkness.");
3826 HIT_POINT dam = 100 + plev * 2;
3829 if (info) return info_damage(0, 0, dam);
3833 if (!get_aim_dir(&dir)) return NULL;
3835 fire_ball(GF_DARK, dir, dam, rad);
3841 if (name) return _("死の光線", "Death Ray");
3842 if (desc) return _("死の光線を放つ。", "Fires a beam of death.");
3847 if (!get_aim_dir(&dir)) return NULL;
3849 death_ray(dir, plev);
3855 if (name) return _("死者召喚", "Raise the Dead");
3856 if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");
3862 bool pet = one_in_(3);
3865 type = (plev > 47 ? SUMMON_HI_UNDEAD : SUMMON_UNDEAD);
3867 if (!pet || (pet && (plev > 24) && one_in_(3)))
3868 flg |= PM_ALLOW_GROUP;
3870 if (pet) flg |= PM_FORCE_PET;
3871 else flg |= (PM_ALLOW_UNIQUE | PM_NO_PET);
3873 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, type, flg))
3875 msg_print(_("冷たい風があなたの周りに吹き始めた。それは腐敗臭を運んでいる...",
3876 "Cold winds begin to blow around you, carrying with them the stench of decay..."));
3881 msg_print(_("古えの死せる者共があなたに仕えるため土から甦った!",
3882 "Ancient, long-dead forms arise from the ground to serve you!"));
3886 msg_print(_("死者が甦った。眠りを妨げるあなたを罰するために!",
3887 "'The dead arise... to punish you for disturbing them!'"));
3890 chg_virtue(V_UNLIFE, 1);
3897 if (name) return _("死者の秘伝", "Esoteria");
3898 if (desc) return _("アイテムを1つ識別する。レベルが高いとアイテムの能力を完全に知ることができる。",
3899 "Identifies an item. Or *identifies* an item at higher level.");
3904 if (randint1(50) > plev)
3906 if (!ident_spell(FALSE)) return NULL;
3910 if (!identify_fully(FALSE)) return NULL;
3917 if (name) return _("吸血鬼変化", "Polymorph Vampire");
3918 if (desc) return _("一定時間、吸血鬼に変化する。変化している間は本来の種族の能力を失い、代わりに吸血鬼としての能力を得る。",
3919 "Mimic a vampire for a while. Loses abilities of original race and gets abilities as a vampire.");
3922 int base = 10 + plev / 2;
3924 if (info) return info_duration(base, base);
3928 set_mimic(base + randint1(base), MIMIC_VAMPIRE, FALSE);
3934 if (name) return _("経験値復活", "Restore Life");
3935 if (desc) return _("失った経験値を回復する。", "Restore lost experience.");
3946 if (name) return _("周辺抹殺", "Mass Genocide");
3947 if (desc) return _("自分の周囲にいるモンスターを現在の階から消し去る。抵抗されると無効。",
3948 "Eliminates all nearby monsters, exhausting you. Powerful or unique monsters may be able to resist.");
3951 int power = plev + 50;
3953 if (info) return info_power(power);
3957 mass_genocide(power, TRUE);
3963 if (name) return _("地獄の劫火", "Hellfire");
3964 if (desc) return _("邪悪な力を持つ宝珠を放つ。善良なモンスターには大きなダメージを与える。",
3965 "Fires a powerful ball of evil power. Hurts good monsters greatly.");
3968 HIT_POINT dam = 666;
3971 if (info) return info_damage(0, 0, dam);
3975 if (!get_aim_dir(&dir)) return NULL;
3977 fire_ball(GF_HELL_FIRE, dir, dam, rad);
3978 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("地獄の劫火の呪文を唱えた疲労", "the strain of casting Hellfire"), -1);
3984 if (name) return _("幽体化", "Wraithform");
3985 if (desc) return _("一定時間、壁を通り抜けることができ受けるダメージが軽減される幽体の状態に変身する。",
3986 "Becomes wraith form which gives ability to pass walls and makes all damages half.");
3989 int base = plev / 2;
3991 if (info) return info_duration(base, base);
3995 set_wraith_form(randint1(base) + base, FALSE);
4006 * @brief トランプ領域魔法の各処理を行う
4008 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
4009 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
4011 static cptr do_trump_spell(SPELL_IDX spell, BIT_FLAGS mode)
4013 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
4014 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
4015 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
4016 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
4017 bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
4018 static const char s_random[] = _("ランダム", "random");
4021 int plev = p_ptr->lev;
4026 if (name) return _("ショート・テレポート", "Phase Door");
4027 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");
4030 POSITION range = 10;
4032 if (info) return info_range(range);
4036 teleport_player(range, 0L);
4042 if (name) return _("蜘蛛のカード", "Trump Spiders");
4043 if (desc) return _("蜘蛛を召喚する。", "Summons spiders.");
4048 msg_print(_("あなたは蜘蛛のカードに集中する...", "You concentrate on the trump of an spider..."));
4049 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_SPIDER, PM_ALLOW_GROUP))
4053 msg_print(_("召喚された蜘蛛は怒っている!", "The summoned spiders get angry!"));
4061 if (name) return _("シャッフル", "Shuffle");
4062 if (desc) return _("カードの占いをする。", "Causes random effects.");
4065 if (info) return s_random;
4075 if (name) return _("フロア・リセット", "Reset Recall");
4076 if (desc) return _("最深階を変更する。", "Resets the 'deepest' level for recall spell.");
4081 if (!reset_recall()) return NULL;
4087 if (name) return _("テレポート", "Teleport");
4088 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
4091 POSITION range = plev * 4;
4093 if (info) return info_range(range);
4097 teleport_player(range, 0L);
4103 if (name) return _("感知のカード", "Trump Spying");
4104 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
4110 if (info) return info_duration(base, sides);
4114 set_tim_esp(randint1(sides) + base, FALSE);
4120 if (name) return _("テレポート・モンスター", "Teleport Away");
4121 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
4126 if (info) return info_power(power);
4130 if (!get_aim_dir(&dir)) return NULL;
4132 fire_beam(GF_AWAY_ALL, dir, power);
4138 if (name) return _("動物のカード", "Trump Animals");
4139 if (desc) return _("1体の動物を召喚する。", "Summons an animal.");
4144 int type = (!fail ? SUMMON_ANIMAL_RANGER : SUMMON_ANIMAL);
4145 msg_print(_("あなたは動物のカードに集中する...", "You concentrate on the trump of an animal..."));
4146 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, type, 0L))
4150 msg_print(_("召喚された動物は怒っている!", "The summoned animal gets angry!"));
4158 if (name) return _("移動のカード", "Trump Reach");
4159 if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");
4162 int weight = plev * 15;
4164 if (info) return info_weight(weight);
4168 if (!get_aim_dir(&dir)) return NULL;
4170 fetch(dir, weight, FALSE);
4176 if (name) return _("カミカゼのカード", "Trump Kamikaze");
4177 if (desc) return _("複数の爆発するモンスターを召喚する。", "Summons monsters which explode by itself.");
4187 if (!target_set(TARGET_KILL)) return NULL;
4193 /* Summons near player when failed */
4198 if (p_ptr->pclass == CLASS_BEASTMASTER)
4199 type = SUMMON_KAMIKAZE_LIVING;
4201 type = SUMMON_KAMIKAZE;
4203 msg_print(_("あなたはカミカゼのカードに集中する...", "You concentrate on several trumps at once..."));
4204 if (trump_summoning(2 + randint0(plev / 7), !fail, y, x, 0, type, 0L))
4208 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
4216 if (name) return _("幻霊召喚", "Phantasmal Servant");
4217 if (desc) return _("1体の幽霊を召喚する。", "Summons a ghost.");
4220 /* Phantasmal Servant is not summoned as enemy when failed */
4223 int summon_lev = plev * 2 / 3 + randint1(plev / 2);
4225 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, (summon_lev * 3 / 2), SUMMON_PHANTOM, 0L))
4227 msg_print(_("御用でございますか、御主人様?", "'Your wish, master?'"));
4234 if (name) return _("スピード・モンスター", "Haste Monster");
4235 if (desc) return _("モンスター1体を加速させる。", "Hastes a monster.");
4242 /* Temporary enable target_pet option */
4243 bool old_target_pet = target_pet;
4246 result = get_aim_dir(&dir);
4248 /* Restore target_pet option */
4249 target_pet = old_target_pet;
4251 if (!result) return NULL;
4253 speed_monster(dir, plev);
4259 if (name) return _("テレポート・レベル", "Teleport Level");
4260 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");
4265 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
4272 if (name) return _("次元の扉", "Dimension Door");
4273 if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleport to given location.");
4276 POSITION range = plev / 2 + 10;
4278 if (info) return info_range(range);
4282 msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));
4283 if (!dimension_door()) return NULL;
4289 if (name) return _("帰還の呪文", "Word of Recall");
4290 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
4291 "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
4297 if (info) return info_delay(base, sides);
4301 if (!word_of_recall()) return NULL;
4307 if (name) return _("怪物追放", "Banish");
4308 if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");
4311 int power = plev * 4;
4313 if (info) return info_power(power);
4317 banish_monsters(power);
4323 if (name) return _("位置交換のカード", "Swap Position");
4324 if (desc) return _("1体のモンスターと位置を交換する。", "Swap positions of you and a monster.");
4331 /* HACK -- No range limit */
4332 project_length = -1;
4334 result = get_aim_dir(&dir);
4336 /* Restore range to default */
4339 if (!result) return NULL;
4347 if (name) return _("アンデッドのカード", "Trump Undead");
4348 if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");
4353 msg_print(_("あなたはアンデッドのカードに集中する...", "You concentrate on the trump of an undead creature..."));
4354 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_UNDEAD, 0L))
4358 msg_print(_("召喚されたアンデッドは怒っている!", "The summoned undead creature gets angry!"));
4366 if (name) return _("爬虫類のカード", "Trump Reptiles");
4367 if (desc) return _("1体のヒドラを召喚する。", "Summons a hydra.");
4372 msg_print(_("あなたは爬虫類のカードに集中する...", "You concentrate on the trump of a reptile..."));
4373 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HYDRA, 0L))
4377 msg_print(_("召喚された爬虫類は怒っている!", "The summoned reptile gets angry!"));
4385 if (name) return _("モンスターのカード", "Trump Monsters");
4386 if (desc) return _("複数のモンスターを召喚する。", "Summons some monsters.");
4392 msg_print(_("あなたはモンスターのカードに集中する...", "You concentrate on several trumps at once..."));
4393 if (p_ptr->pclass == CLASS_BEASTMASTER)
4394 type = SUMMON_LIVING;
4398 if (trump_summoning((1 + (plev - 15)/ 10), !fail, p_ptr->y, p_ptr->x, 0, type, 0L))
4402 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
4411 if (name) return _("ハウンドのカード", "Trump Hounds");
4412 if (desc) return _("1グループのハウンドを召喚する。", "Summons a group of hounds.");
4417 msg_print(_("あなたはハウンドのカードに集中する...", "You concentrate on the trump of a hound..."));
4418 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HOUND, PM_ALLOW_GROUP))
4422 msg_print(_("召喚されたハウンドは怒っている!", "The summoned hounds get angry!"));
4430 if (name) return _("トランプの刃", "Trump Branding");
4431 if (desc) return _("武器にトランプの属性をつける。", "Makes current weapon a Trump weapon.");
4442 if (name) return _("人間トランプ", "Living Trump");
4443 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",
4444 "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");
4452 /* Teleport control */
4455 /* Random teleportation (uncontrolled) */
4458 /* Gain the mutation */
4459 if (gain_random_mutation(mutation))
4461 msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));
4468 if (name) return _("サイバーデーモンのカード", "Trump Cyberdemon");
4469 if (desc) return _("1体のサイバーデーモンを召喚する。", "Summons a cyber demon.");
4474 msg_print(_("あなたはサイバーデーモンのカードに集中する...", "You concentrate on the trump of a Cyberdemon..."));
4475 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_CYBER, 0L))
4479 msg_print(_("召喚されたサイバーデーモンは怒っている!", "The summoned Cyberdemon gets angry!"));
4487 if (name) return _("予見のカード", "Trump Divination");
4488 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
4489 "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
4492 int rad = DETECT_RAD_DEFAULT;
4494 if (info) return info_radius(rad);
4504 if (name) return _("知識のカード", "Trump Lore");
4505 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
4510 if (!identify_fully(FALSE)) return NULL;
4516 if (name) return _("回復モンスター", "Heal Monster");
4517 if (desc) return _("モンスター1体の体力を回復させる。", "Heal a monster.");
4520 int heal = plev * 10 + 200;
4522 if (info) return info_heal(0, 0, heal);
4528 /* Temporary enable target_pet option */
4529 bool old_target_pet = target_pet;
4532 result = get_aim_dir(&dir);
4534 /* Restore target_pet option */
4535 target_pet = old_target_pet;
4537 if (!result) return NULL;
4539 heal_monster(dir, heal);
4545 if (name) return _("ドラゴンのカード", "Trump Dragon");
4546 if (desc) return _("1体のドラゴンを召喚する。", "Summons a dragon.");
4551 msg_print(_("あなたはドラゴンのカードに集中する...", "You concentrate on the trump of a dragon..."));
4552 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_DRAGON, 0L))
4556 msg_print(_("召喚されたドラゴンは怒っている!", "The summoned dragon gets angry!"));
4564 if (name) return _("隕石のカード", "Trump Meteor");
4565 if (desc) return _("自分の周辺に隕石を落とす。", "Makes meteor balls fall down to nearby random locations.");
4568 HIT_POINT dam = plev * 2;
4571 if (info) return info_multi_damage(dam);
4575 cast_meteor(dam, rad);
4581 if (name) return _("デーモンのカード", "Trump Demon");
4582 if (desc) return _("1体の悪魔を召喚する。", "Summons a demon.");
4587 msg_print(_("あなたはデーモンのカードに集中する...", "You concentrate on the trump of a demon..."));
4588 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_DEMON, 0L))
4592 msg_print(_("召喚されたデーモンは怒っている!", "The summoned demon gets angry!"));
4600 if (name) return _("地獄のカード", "Trump Greater Undead");
4601 if (desc) return _("1体の上級アンデッドを召喚する。", "Summons a greater undead.");
4606 msg_print(_("あなたは強力なアンデッドのカードに集中する...", "You concentrate on the trump of a greater undead being..."));
4607 /* May allow unique depend on level and dice roll */
4608 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HI_UNDEAD, PM_ALLOW_UNIQUE))
4612 msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead creature gets angry!"));
4620 if (name) return _("古代ドラゴンのカード", "Trump Ancient Dragon");
4621 if (desc) return _("1体の古代ドラゴンを召喚する。", "Summons an ancient dragon.");
4628 if (p_ptr->pclass == CLASS_BEASTMASTER)
4629 type = SUMMON_HI_DRAGON_LIVING;
4631 type = SUMMON_HI_DRAGON;
4633 msg_print(_("あなたは古代ドラゴンのカードに集中する...", "You concentrate on the trump of an ancient dragon..."));
4634 /* May allow unique depend on level and dice roll */
4635 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, type, PM_ALLOW_UNIQUE))
4639 msg_print(_("召喚された古代ドラゴンは怒っている!", "The summoned ancient dragon gets angry!"));
4652 * @brief 秘術領域魔法の各処理を行う
4654 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
4655 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
4657 static cptr do_arcane_spell(SPELL_IDX spell, BIT_FLAGS mode)
4659 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
4660 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
4661 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
4662 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
4665 int plev = p_ptr->lev;
4670 if (name) return _("電撃", "Zap");
4671 if (desc) return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");
4674 int dice = 3 + (plev - 1) / 5;
4677 if (info) return info_damage(dice, sides, 0);
4681 if (!get_aim_dir(&dir)) return NULL;
4683 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));
4689 if (name) return _("魔法の施錠", "Wizard Lock");
4690 if (desc) return _("扉に鍵をかける。", "Locks a door.");
4695 if (!get_aim_dir(&dir)) return NULL;
4703 if (name) return _("透明体感知", "Detect Invisibility");
4704 if (desc) return _("近くの透明なモンスターを感知する。", "Detects all invisible monsters in your vicinity.");
4707 int rad = DETECT_RAD_DEFAULT;
4709 if (info) return info_radius(rad);
4713 detect_monsters_invis(rad);
4719 if (name) return _("モンスター感知", "Detect Monsters");
4720 if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
4723 int rad = DETECT_RAD_DEFAULT;
4725 if (info) return info_radius(rad);
4729 detect_monsters_normal(rad);
4735 if (name) return _("ショート・テレポート", "Blink");
4736 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");
4739 POSITION range = 10;
4741 if (info) return info_range(range);
4745 teleport_player(range, 0L);
4751 if (name) return _("ライト・エリア", "Light Area");
4752 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
4756 int sides = plev / 2;
4757 int rad = plev / 10 + 1;
4759 if (info) return info_damage(dice, sides, 0);
4763 lite_area(damroll(dice, sides), rad);
4769 if (name) return _("罠と扉 破壊", "Trap & Door Destruction");
4770 if (desc) return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");
4775 if (!get_aim_dir(&dir)) return NULL;
4783 if (name) return _("軽傷の治癒", "Cure Light Wounds");
4784 if (desc) return _("怪我と体力を少し回復させる。", "Heals cut and HP a little.");
4790 if (info) return info_heal(dice, sides, 0);
4794 hp_player(damroll(dice, sides));
4795 set_cut(p_ptr->cut - 10);
4801 if (name) return _("罠と扉 感知", "Detect Doors & Traps");
4802 if (desc) return _("近くの全ての罠と扉と階段を感知する。", "Detects traps, doors, and stairs in your vicinity.");
4805 int rad = DETECT_RAD_DEFAULT;
4807 if (info) return info_radius(rad);
4811 detect_traps(rad, TRUE);
4819 if (name) return _("燃素", "Phlogiston");
4820 if (desc) return _("光源に燃料を補給する。", "Adds more turns of light to a lantern or torch.");
4831 if (name) return _("財宝感知", "Detect Treasure");
4832 if (desc) return _("近くの財宝を感知する。", "Detects all treasures in your vicinity.");
4835 int rad = DETECT_RAD_DEFAULT;
4837 if (info) return info_radius(rad);
4841 detect_treasure(rad);
4842 detect_objects_gold(rad);
4848 if (name) return _("魔法 感知", "Detect Enchantment");
4849 if (desc) return _("近くの魔法がかかったアイテムを感知する。", "Detects all magical items in your vicinity.");
4852 int rad = DETECT_RAD_DEFAULT;
4854 if (info) return info_radius(rad);
4858 detect_objects_magic(rad);
4864 if (name) return _("アイテム感知", "Detect Objects");
4865 if (desc) return _("近くの全てのアイテムを感知する。", "Detects all items in your vicinity.");
4868 int rad = DETECT_RAD_DEFAULT;
4870 if (info) return info_radius(rad);
4874 detect_objects_normal(rad);
4880 if (name) return _("解毒", "Cure Poison");
4881 if (desc) return _("毒を体内から完全に取り除く。", "Cures poison status.");
4892 if (name) return _("耐冷", "Resist Cold");
4893 if (desc) return _("一定時間、冷気への耐性を得る。装備による耐性に累積する。", "Gives resistance to cold. This resistance can be added to which from equipment for more powerful resistance.");
4898 if (info) return info_duration(base, base);
4902 set_oppose_cold(randint1(base) + base, FALSE);
4908 if (name) return _("耐火", "Resist Fire");
4909 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
4910 "Gives resistance to fire. This resistance can be added to which from equipment for more powerful resistance.");
4915 if (info) return info_duration(base, base);
4919 set_oppose_fire(randint1(base) + base, FALSE);
4925 if (name) return _("耐電", "Resist Lightning");
4926 if (desc) return _("一定時間、電撃への耐性を得る。装備による耐性に累積する。",
4927 "Gives resistance to electricity. This resistance can be added to which from equipment for more powerful resistance.");
4932 if (info) return info_duration(base, base);
4936 set_oppose_elec(randint1(base) + base, FALSE);
4942 if (name) return _("耐酸", "Resist Acid");
4943 if (desc) return _("一定時間、酸への耐性を得る。装備による耐性に累積する。",
4944 "Gives resistance to acid. This resistance can be added to which from equipment for more powerful resistance.");
4949 if (info) return info_duration(base, base);
4953 set_oppose_acid(randint1(base) + base, FALSE);
4959 if (name) return _("重傷の治癒", "Cure Medium Wounds");
4960 if (desc) return _("怪我と体力を中程度回復させる。", "Heals cut and HP more.");
4966 if (info) return info_heal(dice, sides, 0);
4970 hp_player(damroll(dice, sides));
4971 set_cut((p_ptr->cut / 2) - 50);
4977 if (name) return _("テレポート", "Teleport");
4978 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
4981 POSITION range = plev * 5;
4983 if (info) return info_range(range);
4987 teleport_player(range, 0L);
4993 if (name) return _("鑑定", "Identify");
4994 if (desc) return _("アイテムを識別する。", "Identifies an item.");
4999 if (!ident_spell(FALSE)) return NULL;
5005 if (name) return _("岩石溶解", "Stone to Mud");
5006 if (desc) return _("壁を溶かして床にする。", "Turns one rock square to mud.");
5013 if (info) return info_damage(dice, sides, base);
5017 if (!get_aim_dir(&dir)) return NULL;
5019 wall_to_mud(dir, 20 + randint1(30));
5025 if (name) return _("閃光", "Ray of Light");
5026 if (desc) return _("光線を放つ。光りを嫌うモンスターに効果がある。", "Fires a beam of light which damages to light-sensitive monsters.");
5032 if (info) return info_damage(dice, sides, 0);
5036 if (!get_aim_dir(&dir)) return NULL;
5038 msg_print(_("光線が放たれた。", "A line of light appears."));
5039 lite_line(dir, damroll(6, 8));
5045 if (name) return _("空腹充足", "Satisfy Hunger");
5046 if (desc) return _("満腹にする。", "Satisfies hunger.");
5051 set_food(PY_FOOD_MAX - 1);
5057 if (name) return _("透明視認", "See Invisible");
5058 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
5063 if (info) return info_duration(base, base);
5067 set_tim_invis(randint1(base) + base, FALSE);
5073 if (name) return _("エレメンタル召喚", "Conjure Elemental");
5074 if (desc) return _("1体のエレメンタルを召喚する。", "Summons an elemental.");
5079 if (!summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_ELEMENTAL, (PM_ALLOW_GROUP | PM_FORCE_PET)))
5081 msg_print(_("エレメンタルは現れなかった。", "No Elementals arrive."));
5088 if (name) return _("テレポート・レベル", "Teleport Level");
5089 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");
5094 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
5101 if (name) return _("テレポート・モンスター", "Teleport Away");
5102 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
5107 if (info) return info_power(power);
5111 if (!get_aim_dir(&dir)) return NULL;
5113 fire_beam(GF_AWAY_ALL, dir, power);
5119 if (name) return _("元素の球", "Elemental Ball");
5120 if (desc) return _("炎、電撃、冷気、酸のどれかの球を放つ。", "Fires a ball of some elements.");
5123 HIT_POINT dam = 75 + plev;
5126 if (info) return info_damage(0, 0, dam);
5132 if (!get_aim_dir(&dir)) return NULL;
5134 switch (randint1(4))
5136 case 1: type = GF_FIRE;break;
5137 case 2: type = GF_ELEC;break;
5138 case 3: type = GF_COLD;break;
5139 default: type = GF_ACID;break;
5142 fire_ball(type, dir, dam, rad);
5148 if (name) return _("全感知", "Detection");
5149 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
5150 "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
5153 int rad = DETECT_RAD_DEFAULT;
5155 if (info) return info_radius(rad);
5165 if (name) return _("帰還の呪文", "Word of Recall");
5166 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
5167 "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
5173 if (info) return info_delay(base, sides);
5177 if (!word_of_recall()) return NULL;
5183 if (name) return _("千里眼", "Clairvoyance");
5184 if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。さらに、一定時間テレパシー能力を得る。",
5185 "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");
5191 if (info) return info_duration(base, sides);
5195 chg_virtue(V_KNOWLEDGE, 1);
5196 chg_virtue(V_ENLIGHTEN, 1);
5200 if (!p_ptr->telepathy)
5202 set_tim_esp(randint1(sides) + base, FALSE);
5213 * @brief 匠領域魔法の各処理を行う
5215 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
5216 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
5218 static cptr do_craft_spell(SPELL_IDX spell, BIT_FLAGS mode)
5220 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
5221 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
5222 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
5223 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
5225 int plev = p_ptr->lev;
5230 if (name) return _("赤外線視力", "Infravision");
5231 if (desc) return _("一定時間、赤外線視力が増強される。", "Gives infravision for a while.");
5236 if (info) return info_duration(base, base);
5240 set_tim_infra(base + randint1(base), FALSE);
5246 if (name) return _("回復力強化", "Regeneration");
5247 if (desc) return _("一定時間、回復力が増強される。", "Gives regeneration ability for a while.");
5252 if (info) return info_duration(base, base);
5256 set_tim_regen(base + randint1(base), FALSE);
5262 if (name) return _("空腹充足", "Satisfy Hunger");
5263 if (desc) return _("満腹になる。", "Satisfies hunger.");
5268 set_food(PY_FOOD_MAX - 1);
5274 if (name) return _("耐冷気", "Resist Cold");
5275 if (desc) return _("一定時間、冷気への耐性を得る。装備による耐性に累積する。",
5276 "Gives resistance to cold. This resistance can be added to which from equipment for more powerful resistance.");
5281 if (info) return info_duration(base, base);
5285 set_oppose_cold(randint1(base) + base, FALSE);
5291 if (name) return _("耐火炎", "Resist Fire");
5292 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
5293 "Gives resistance to fire. This resistance can be added to which from equipment for more powerful resistance.");
5298 if (info) return info_duration(base, base);
5302 set_oppose_fire(randint1(base) + base, FALSE);
5308 if (name) return _("士気高揚", "Heroism");
5309 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
5314 if (info) return info_duration(base, base);
5318 set_hero(randint1(base) + base, FALSE);
5326 if (name) return _("耐電撃", "Resist Lightning");
5327 if (desc) return _("一定時間、電撃への耐性を得る。装備による耐性に累積する。",
5328 "Gives resistance to electricity. This resistance can be added to which from equipment for more powerful resistance.");
5333 if (info) return info_duration(base, base);
5337 set_oppose_elec(randint1(base) + base, FALSE);
5343 if (name) return _("耐酸", "Resist Acid");
5344 if (desc) return _("一定時間、酸への耐性を得る。装備による耐性に累積する。",
5345 "Gives resistance to acid. This resistance can be added to which from equipment for more powerful resistance.");
5350 if (info) return info_duration(base, base);
5354 set_oppose_acid(randint1(base) + base, FALSE);
5360 if (name) return _("透明視認", "See Invisibility");
5361 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
5366 if (info) return info_duration(base, base);
5370 set_tim_invis(randint1(base) + base, FALSE);
5376 if (name) return _("解呪", "Remove Curse");
5377 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
5384 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
5391 if (name) return _("耐毒", "Resist Poison");
5392 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",
5393 "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");
5398 if (info) return info_duration(base, base);
5402 set_oppose_pois(randint1(base) + base, FALSE);
5408 if (name) return _("狂戦士化", "Berserk");
5409 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");
5414 if (info) return info_duration(base, base);
5418 set_shero(randint1(base) + base, FALSE);
5426 if (name) return _("自己分析", "Self Knowledge");
5427 if (desc) return _("現在の自分の状態を完全に知る。",
5428 "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");
5439 if (name) return _("対邪悪結界", "Protection from Evil");
5440 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");
5443 int base = 3 * plev;
5446 if (info) return info_duration(base, sides);
5450 set_protevil(randint1(sides) + base, FALSE);
5456 if (name) return _("癒し", "Cure");
5457 if (desc) return _("毒、朦朧状態、負傷を全快させ、幻覚を直す。", "Heals poison, stun, cut and hallucination completely.");
5471 if (name) return _("魔法剣", "Mana Branding");
5472 if (desc) return _("一定時間、武器に冷気、炎、電撃、酸、毒のいずれかの属性をつける。武器を持たないと使えない。",
5473 "Makes current weapon some elemental branded. You must wield weapons.");
5476 int base = plev / 2;
5478 if (info) return info_duration(base, base);
5482 if (!choose_ele_attack()) return NULL;
5488 if (name) return _("テレパシー", "Telepathy");
5489 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
5495 if (info) return info_duration(base, sides);
5499 set_tim_esp(randint1(sides) + base, FALSE);
5505 if (name) return _("肌石化", "Stone Skin");
5506 if (desc) return _("一定時間、ACを上昇させる。", "Gives bonus to AC for a while.");
5512 if (info) return info_duration(base, sides);
5516 set_shield(randint1(sides) + base, FALSE);
5522 if (name) return _("全耐性", "Resistance");
5523 if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
5524 "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.");
5529 if (info) return info_duration(base, base);
5533 set_oppose_acid(randint1(base) + base, FALSE);
5534 set_oppose_elec(randint1(base) + base, FALSE);
5535 set_oppose_fire(randint1(base) + base, FALSE);
5536 set_oppose_cold(randint1(base) + base, FALSE);
5537 set_oppose_pois(randint1(base) + base, FALSE);
5543 if (name) return _("スピード", "Haste Self");
5544 if (desc) return _("一定時間、加速する。", "Hastes you for a while.");
5548 int sides = 20 + plev;
5550 if (info) return info_duration(base, sides);
5554 set_fast(randint1(sides) + base, FALSE);
5560 if (name) return _("壁抜け", "Walk through Wall");
5561 if (desc) return _("一定時間、半物質化し壁を通り抜けられるようになる。", "Gives ability to pass walls for a while.");
5564 int base = plev / 2;
5566 if (info) return info_duration(base, base);
5570 set_kabenuke(randint1(base) + base, FALSE);
5576 if (name) return _("盾磨き", "Polish Shield");
5577 if (desc) return _("盾に反射の属性をつける。", "Makes a shield a shield of reflection.");
5588 if (name) return _("ゴーレム製造", "Create Golem");
5589 if (desc) return _("1体のゴーレムを製造する。", "Creates a golem.");
5594 if (summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_GOLEM, PM_FORCE_PET))
5596 msg_print(_("ゴーレムを作った。", "You make a golem."));
5600 msg_print(_("うまくゴーレムを作れなかった。", "No Golems arrive."));
5607 if (name) return _("魔法の鎧", "Magical armor");
5608 if (desc) return _("一定時間、魔法防御力とACが上がり、混乱と盲目の耐性、反射能力、麻痺知らず、浮遊を得る。",
5609 "Gives resistance to magic, bonus to AC, resistance to confusion, blindness, reflection, free action and levitation for a while.");
5614 if (info) return info_duration(base, base);
5618 set_magicdef(randint1(base) + base, FALSE);
5624 if (name) return _("装備無力化", "Remove Enchantment");
5625 if (desc) return _("武器・防具にかけられたあらゆる魔力を完全に解除する。", "Removes all magics completely from any weapon or armor.");
5630 if (!mundane_spell(TRUE)) return NULL;
5636 if (name) return _("呪い粉砕", "Remove All Curse");
5637 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
5642 if (remove_all_curse())
5644 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
5651 if (name) return _("完全なる知識", "Knowledge True");
5652 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
5657 if (!identify_fully(FALSE)) return NULL;
5663 if (name) return _("武器強化", "Enchant Weapon");
5664 if (desc) return _("武器の命中率修正とダメージ修正を強化する。", "Attempts to increase +to-hit, +to-dam of a weapon.");
5669 if (!enchant_spell(randint0(4) + 1, randint0(4) + 1, 0)) return NULL;
5675 if (name) return _("防具強化", "Enchant Armor");
5676 if (desc) return _("鎧の防御修正を強化する。", "Attempts to increase +AC of an armor.");
5681 if (!enchant_spell(0, 0, randint0(3) + 2)) return NULL;
5687 if (name) return _("武器属性付与", "Brand Weapon");
5688 if (desc) return _("武器にランダムに属性をつける。", "Makes current weapon a random ego weapon.");
5693 brand_weapon(randint0(18));
5699 if (name) return _("人間トランプ", "Living Trump");
5700 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",
5701 "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");
5709 /* Teleport control */
5712 /* Random teleportation (uncontrolled) */
5715 /* Gain the mutation */
5716 if (gain_random_mutation(mutation))
5718 msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));
5725 if (name) return _("属性への免疫", "Immunity");
5726 if (desc) return _("一定時間、冷気、炎、電撃、酸のいずれかに対する免疫を得る。",
5727 "Gives an immunity to fire, cold, electricity or acid for a while.");
5732 if (info) return info_duration(base, base);
5736 if (!choose_ele_immune(base + randint1(base))) return NULL;
5746 * @brief 悪魔領域魔法の各処理を行う
5748 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
5749 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
5751 static cptr do_daemon_spell(SPELL_IDX spell, BIT_FLAGS mode)
5753 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
5754 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
5755 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
5756 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
5757 static const char s_dam[] = _("損傷:", "dam ");
5760 int plev = p_ptr->lev;
5765 if (name) return _("マジック・ミサイル", "Magic Missile");
5766 if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");
5769 int dice = 3 + (plev - 1) / 5;
5772 if (info) return info_damage(dice, sides, 0);
5776 if (!get_aim_dir(&dir)) return NULL;
5778 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));
5784 if (name) return _("無生命感知", "Detect Unlife");
5785 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
5788 int rad = DETECT_RAD_DEFAULT;
5790 if (info) return info_radius(rad);
5794 detect_monsters_nonliving(rad);
5800 if (name) return _("邪なる祝福", "Evil Bless");
5801 if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
5806 if (info) return info_duration(base, base);
5810 set_blessed(randint1(base) + base, FALSE);
5816 if (name) return _("耐火炎", "Resist Fire");
5817 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
5818 "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");
5823 if (info) return info_duration(base, base);
5827 set_oppose_fire(randint1(base) + base, FALSE);
5833 if (name) return _("恐慌", "Horrify");
5834 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
5839 if (info) return info_power(power);
5843 if (!get_aim_dir(&dir)) return NULL;
5845 fear_monster(dir, power);
5846 stun_monster(dir, power);
5852 if (name) return _("地獄の矢", "Nether Bolt");
5853 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
5856 int dice = 6 + (plev - 5) / 4;
5859 if (info) return info_damage(dice, sides, 0);
5863 if (!get_aim_dir(&dir)) return NULL;
5865 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
5871 if (name) return _("古代の死霊召喚", "Summon Manes");
5872 if (desc) return _("古代の死霊を召喚する。", "Summons a manes.");
5877 if (!summon_specific(-1, p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET)))
5879 msg_print(_("古代の死霊は現れなかった。", "No Manes arrive."));
5886 if (name) return _("地獄の焔", "Hellish Flame");
5887 if (desc) return _("邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",
5888 "Fires a ball of evil power. Hurts good monsters greatly.");
5893 int rad = (plev < 30) ? 2 : 3;
5896 if (p_ptr->pclass == CLASS_MAGE ||
5897 p_ptr->pclass == CLASS_HIGH_MAGE ||
5898 p_ptr->pclass == CLASS_SORCERER)
5899 base = plev + plev / 2;
5901 base = plev + plev / 4;
5904 if (info) return info_damage(dice, sides, base);
5908 if (!get_aim_dir(&dir)) return NULL;
5910 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides) + base, rad);
5916 if (name) return _("デーモン支配", "Dominate Demon");
5917 if (desc) return _("悪魔1体を魅了する。抵抗されると無効", "Attempts to charm a demon.");
5922 if (info) return info_power(power);
5926 if (!get_aim_dir(&dir)) return NULL;
5928 control_one_demon(dir, power);
5934 if (name) return _("ビジョン", "Vision");
5935 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
5938 int rad = DETECT_RAD_MAP;
5940 if (info) return info_radius(rad);
5950 if (name) return _("耐地獄", "Resist Nether");
5951 if (desc) return _("一定時間、地獄への耐性を得る。", "Gives resistance to nether for a while.");
5956 if (info) return info_duration(base, base);
5960 set_tim_res_nether(randint1(base) + base, FALSE);
5966 if (name) return _("プラズマ・ボルト", "Plasma bolt");
5967 if (desc) return _("プラズマのボルトもしくはビームを放つ。", "Fires a bolt or beam of plasma.");
5970 int dice = 11 + (plev - 5) / 4;
5973 if (info) return info_damage(dice, sides, 0);
5977 if (!get_aim_dir(&dir)) return NULL;
5979 fire_bolt_or_beam(beam_chance(), GF_PLASMA, dir, damroll(dice, sides));
5985 if (name) return _("ファイア・ボール", "Fire Ball");
5986 if (desc) return _("炎の球を放つ。", "Fires a ball of fire.");
5989 HIT_POINT dam = plev + 55;
5992 if (info) return info_damage(0, 0, dam);
5996 if (!get_aim_dir(&dir)) return NULL;
5998 fire_ball(GF_FIRE, dir, dam, rad);
6004 if (name) return _("炎の刃", "Fire Branding");
6005 if (desc) return _("武器に炎の属性をつける。", "Makes current weapon fire branded.");
6016 if (name) return _("地獄球", "Nether Ball");
6017 if (desc) return _("大きな地獄の球を放つ。", "Fires a huge ball of nether.");
6020 HIT_POINT dam = plev * 3 / 2 + 100;
6021 int rad = plev / 20 + 2;
6023 if (info) return info_damage(0, 0, dam);
6027 if (!get_aim_dir(&dir)) return NULL;
6029 fire_ball(GF_NETHER, dir, dam, rad);
6035 if (name) return _("デーモン召喚", "Summon Demon");
6036 if (desc) return _("悪魔1体を召喚する。", "Summons a demon.");
6041 bool pet = !one_in_(3);
6044 if (pet) flg |= PM_FORCE_PET;
6045 else flg |= PM_NO_PET;
6046 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
6048 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, plev*2/3+randint1(plev/2), SUMMON_DEMON, flg))
6050 msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));
6054 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
6058 msg_print(_("「卑しき者よ、我は汝の下僕にあらず! お前の魂を頂くぞ!」",
6059 "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));
6064 msg_print(_("悪魔は現れなかった。", "No demons arrive."));
6072 if (name) return _("悪魔の目", "Devilish Eye");
6073 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
6079 if (info) return info_duration(base, sides);
6083 set_tim_esp(randint1(sides) + base, FALSE);
6089 if (name) return _("悪魔のクローク", "Devil Cloak");
6090 if (desc) return _("恐怖を取り除き、一定時間、炎と冷気の耐性、炎のオーラを得る。耐性は装備による耐性に累積する。",
6091 "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.");
6094 TIME_EFFECT base = 20;
6096 if (info) return info_duration(base, base);
6100 TIME_EFFECT dur = randint1(base) + base;
6102 set_oppose_fire(dur, FALSE);
6103 set_oppose_cold(dur, FALSE);
6104 set_tim_sh_fire(dur, FALSE);
6112 if (name) return _("溶岩流", "The Flow of Lava");
6113 if (desc) return _("自分を中心とした炎の球を作り出し、床を溶岩に変える。",
6114 "Generates a ball of fire centered on you which transforms floors to magma.");
6117 HIT_POINT dam = (55 + plev) * 2;
6120 if (info) return info_damage(0, 0, dam/2);
6124 fire_ball(GF_FIRE, 0, dam, rad);
6125 fire_ball_hide(GF_LAVA_FLOW, 0, 2 + randint1(2), rad);
6131 if (name) return _("プラズマ球", "Plasma Ball");
6132 if (desc) return _("プラズマの球を放つ。", "Fires a ball of plasma.");
6135 HIT_POINT dam = plev * 3 / 2 + 80;
6136 int rad = 2 + plev / 40;
6138 if (info) return info_damage(0, 0, dam);
6142 if (!get_aim_dir(&dir)) return NULL;
6144 fire_ball(GF_PLASMA, dir, dam, rad);
6150 if (name) return _("悪魔変化", "Polymorph Demon");
6151 if (desc) return _("一定時間、悪魔に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔としての能力を得る。",
6152 "Mimic a demon for a while. Loses abilities of original race and gets abilities as a demon.");
6155 int base = 10 + plev / 2;
6157 if (info) return info_duration(base, base);
6161 set_mimic(base + randint1(base), MIMIC_DEMON, FALSE);
6167 if (name) return _("地獄の波動", "Nather Wave");
6168 if (desc) return _("視界内の全てのモンスターにダメージを与える。善良なモンスターに特に大きなダメージを与える。",
6169 "Damages all monsters in sight. Hurts good monsters greatly.");
6172 int sides1 = plev * 2;
6173 int sides2 = plev * 2;
6175 if (info) return format("%sd%d+d%d", s_dam, sides1, sides2);
6179 dispel_monsters(randint1(sides1));
6180 dispel_good(randint1(sides2));
6186 if (name) return _("サキュバスの接吻", "Kiss of Succubus");
6187 if (desc) return _("因果混乱の球を放つ。", "Fires a ball of nexus.");
6190 HIT_POINT dam = 100 + plev * 2;
6193 if (info) return info_damage(0, 0, dam);
6197 if (!get_aim_dir(&dir)) return NULL;
6198 fire_ball(GF_NEXUS, dir, dam, rad);
6204 if (name) return _("破滅の手", "Doom Hand");
6205 if (desc) return _("破滅の手を放つ。食らったモンスターはそのときのHPの半分前後のダメージを受ける。", "Attempts to make a monster's HP almost half.");
6210 if (!get_aim_dir(&dir))
6213 msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));
6215 fire_ball_hide(GF_HAND_DOOM, dir, plev * 2, 0);
6221 if (name) return _("士気高揚", "Raise the Morale");
6222 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
6227 if (info) return info_duration(base, base);
6231 set_hero(randint1(base) + base, FALSE);
6239 if (name) return _("不滅の肉体", "Immortal Body");
6240 if (desc) return _("一定時間、時間逆転への耐性を得る。", "Gives resistance to time for a while.");
6245 if (info) return info_duration(base, base);
6249 set_tim_res_time(randint1(base)+base, FALSE);
6255 if (name) return _("狂気の円環", "Insanity Circle");
6256 if (desc) return _("自分を中心としたカオスの球、混乱の球を発生させ、近くのモンスターを魅了する。",
6257 "Generate balls of chaos, confusion and charm centered on you.");
6260 HIT_POINT dam = 50 + plev;
6261 int power = 20 + plev;
6262 int rad = 3 + plev / 20;
6264 if (info) return format("%s%d+%d", s_dam, dam/2, dam/2);
6268 fire_ball(GF_CHAOS, 0, dam, rad);
6269 fire_ball(GF_CONFUSION, 0, dam, rad);
6270 fire_ball(GF_CHARM, 0, power, rad);
6276 if (name) return _("ペット爆破", "Explode Pets");
6277 if (desc) return _("全てのペットを強制的に爆破させる。", "Makes all pets explode.");
6288 if (name) return _("グレーターデーモン召喚", "Summon Greater Demon");
6289 if (desc) return _("上級デーモンを召喚する。召喚するには人間('p','h','t'で表されるモンスター)の死体を捧げなければならない。",
6290 "Summons greater demon. It need to sacrifice a corpse of human ('p','h' or 't').");
6295 if (!cast_summon_greater_demon()) return NULL;
6301 if (name) return _("地獄嵐", "Nether Storm");
6302 if (desc) return _("超巨大な地獄の球を放つ。", "Generate a huge ball of nether.");
6305 HIT_POINT dam = plev * 15;
6308 if (info) return info_damage(0, 0, dam);
6312 if (!get_aim_dir(&dir)) return NULL;
6314 fire_ball(GF_NETHER, dir, dam, rad);
6320 if (name) return _("血の呪い", "Bloody Curse");
6321 if (desc) return _("自分がダメージを受けることによって対象に呪いをかけ、ダメージを与え様々な効果を引き起こす。",
6322 "Puts blood curse which damages and causes various effects on a monster. You also take damage.");
6325 HIT_POINT dam = 600;
6328 if (info) return info_damage(0, 0, dam);
6332 if (!get_aim_dir(&dir)) return NULL;
6334 fire_ball_hide(GF_BLOOD_CURSE, dir, dam, rad);
6335 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("血の呪い", "Blood curse"), -1);
6341 if (name) return _("魔王変化", "Polymorph Demonlord");
6342 if (desc) return _("悪魔の王に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔の王としての能力を得、壁を破壊しながら歩く。",
6343 "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.");
6348 if (info) return info_duration(base, base);
6352 set_mimic(base + randint1(base), MIMIC_DEMON_LORD, FALSE);
6362 * @brief 破邪領域魔法の各処理を行う
6364 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
6365 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
6367 static cptr do_crusade_spell(SPELL_IDX spell, BIT_FLAGS mode)
6369 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
6370 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
6371 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
6372 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
6375 int plev = p_ptr->lev;
6380 if (name) return _("懲罰", "Punishment");
6381 if (desc) return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");
6384 int dice = 3 + (plev - 1) / 5;
6387 if (info) return info_damage(dice, sides, 0);
6391 if (!get_aim_dir(&dir)) return NULL;
6393 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));
6399 if (name) return _("邪悪存在感知", "Detect Evil");
6400 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
6403 int rad = DETECT_RAD_DEFAULT;
6405 if (info) return info_radius(rad);
6409 detect_monsters_evil(rad);
6415 if (name) return _("恐怖除去", "Remove Fear");
6416 if (desc) return _("恐怖を取り除く。", "Removes fear.");
6427 if (name) return _("威圧", "Scare Monster");
6428 if (desc) return _("モンスター1体を恐怖させる。抵抗されると無効。", "Attempts to scare a monster.");
6433 if (info) return info_power(power);
6437 if (!get_aim_dir(&dir)) return NULL;
6439 fear_monster(dir, power);
6445 if (name) return _("聖域", "Sanctuary");
6446 if (desc) return _("隣接した全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep monsters in the adjacent squares.");
6451 if (info) return info_power(power);
6455 sleep_monsters_touch();
6461 if (name) return _("入口", "Portal");
6462 if (desc) return _("中距離のテレポートをする。", "Teleport medium distance.");
6465 POSITION range = 25 + plev / 2;
6467 if (info) return info_range(range);
6471 teleport_player(range, 0L);
6477 if (name) return _("スターダスト", "Star Dust");
6478 if (desc) return _("ターゲット付近に閃光のボルトを連射する。", "Fires many bolts of light near the target.");
6481 int dice = 3 + (plev - 1) / 9;
6484 if (info) return info_multi_damage_dice(dice, sides);
6488 if (!get_aim_dir(&dir)) return NULL;
6489 fire_blast(GF_LITE, dir, dice, sides, 10, 3);
6495 if (name) return _("身体浄化", "Purify");
6496 if (desc) return _("傷、毒、朦朧から全快する。", "Heals all cut, stun and poison status.");
6509 if (name) return _("邪悪飛ばし", "Scatter Evil");
6510 if (desc) return _("邪悪なモンスター1体をテレポートさせる。抵抗されると無効。", "Attempts to teleport an evil monster away.");
6513 int power = MAX_SIGHT * 5;
6515 if (info) return info_power(power);
6519 if (!get_aim_dir(&dir)) return NULL;
6520 fire_ball(GF_AWAY_EVIL, dir, power, 0);
6526 if (name) return _("聖なる光球", "Holy Orb");
6527 if (desc) return _("聖なる力をもつ宝珠を放つ。邪悪なモンスターに対して大きなダメージを与えるが、善良なモンスターには効果がない。",
6528 "Fires a ball with holy power. Hurts evil monsters greatly, but don't effect good monsters.");
6533 int rad = (plev < 30) ? 2 : 3;
6536 if (p_ptr->pclass == CLASS_PRIEST ||
6537 p_ptr->pclass == CLASS_HIGH_MAGE ||
6538 p_ptr->pclass == CLASS_SORCERER)
6539 base = plev + plev / 2;
6541 base = plev + plev / 4;
6544 if (info) return info_damage(dice, sides, base);
6548 if (!get_aim_dir(&dir)) return NULL;
6550 fire_ball(GF_HOLY_FIRE, dir, damroll(dice, sides) + base, rad);
6556 if (name) return _("悪魔払い", "Exorcism");
6557 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与え、邪悪なモンスターを恐怖させる。",
6558 "Damages all undead and demons in sight, and scares all evil monsters in sight.");
6564 if (info) return info_damage(1, sides, 0);
6568 dispel_undead(randint1(sides));
6569 dispel_demons(randint1(sides));
6576 if (name) return _("解呪", "Remove Curse");
6577 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
6584 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
6591 if (name) return _("透明視認", "Sense Unseen");
6592 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
6597 if (info) return info_duration(base, base);
6601 set_tim_invis(randint1(base) + base, FALSE);
6607 if (name) return _("対邪悪結界", "Protection from Evil");
6608 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");
6612 int sides = 3 * plev;
6614 if (info) return info_duration(base, sides);
6618 set_protevil(randint1(sides) + base, FALSE);
6624 if (name) return _("裁きの雷", "Judgment Thunder");
6625 if (desc) return _("強力な電撃のボルトを放つ。", "Fires a powerful bolt of lightning.");
6628 HIT_POINT dam = plev * 5;
6630 if (info) return info_damage(0, 0, dam);
6634 if (!get_aim_dir(&dir)) return NULL;
6635 fire_bolt(GF_ELEC, dir, dam);
6641 if (name) return _("聖なる御言葉", "Holy Word");
6642 if (desc) return _("視界内の邪悪な存在に大きなダメージを与え、体力を回復し、毒、恐怖、朦朧状態、負傷から全快する。",
6643 "Damages all evil monsters in sight, heals HP somewhat, and completely heals poison, fear, stun and cut status.");
6646 int dam_sides = plev * 6;
6649 if (info) return format(_("損:1d%d/回%d", "dam:d%d/h%d"), dam_sides, heal);
6652 dispel_evil(randint1(dam_sides));
6663 if (name) return _("開かれた道", "Unbarring Ways");
6664 if (desc) return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");
6669 if (!get_aim_dir(&dir)) return NULL;
6677 if (name) return _("封魔", "Arrest");
6678 if (desc) return _("邪悪なモンスターの動きを止める。", "Attempts to paralyze an evil monster.");
6681 int power = plev * 2;
6683 if (info) return info_power(power);
6687 if (!get_aim_dir(&dir)) return NULL;
6694 if (name) return _("聖なるオーラ", "Holy Aura");
6695 if (desc) return _("一定時間、邪悪なモンスターを傷つける聖なるオーラを得る。",
6696 "Gives aura of holy power which injures evil monsters which attacked you for a while.");
6701 if (info) return info_duration(base, base);
6705 set_tim_sh_holy(randint1(base) + base, FALSE);
6711 if (name) return _("アンデッド&悪魔退散", "Dispel Undead & Demons");
6712 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与える。", "Damages all undead and demons in sight.");
6715 int sides = plev * 4;
6717 if (info) return info_damage(1, sides, 0);
6721 dispel_undead(randint1(sides));
6722 dispel_demons(randint1(sides));
6728 if (name) return _("邪悪退散", "Dispel Evil");
6729 if (desc) return _("視界内の全ての邪悪なモンスターにダメージを与える。", "Damages all evil monsters in sight.");
6732 int sides = plev * 4;
6734 if (info) return info_damage(1, sides, 0);
6738 dispel_evil(randint1(sides));
6744 if (name) return _("聖なる刃", "Holy Blade");
6745 if (desc) return _("通常の武器に滅邪の属性をつける。", "Makes current weapon especially deadly against evil monsters.");
6756 if (name) return _("スターバースト", "Star Burst");
6757 if (desc) return _("巨大な閃光の球を放つ。", "Fires a huge ball of powerful light.");
6760 HIT_POINT dam = 100 + plev * 2;
6763 if (info) return info_damage(0, 0, dam);
6767 if (!get_aim_dir(&dir)) return NULL;
6769 fire_ball(GF_LITE, dir, dam, rad);
6775 if (name) return _("天使召喚", "Summon Angel");
6776 if (desc) return _("天使を1体召喚する。", "Summons an angel.");
6781 bool pet = !one_in_(3);
6784 if (pet) flg |= PM_FORCE_PET;
6785 else flg |= PM_NO_PET;
6786 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
6788 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_ANGEL, flg))
6792 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
6796 msg_print(_("「我は汝の下僕にあらず! 悪行者よ、悔い改めよ!」", "Mortal! Repent of thy impiousness."));
6804 if (name) return _("士気高揚", "Heroism");
6805 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
6810 if (info) return info_duration(base, base);
6814 set_hero(randint1(base) + base, FALSE);
6822 if (name) return _("呪い退散", "Dispel Curse");
6823 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
6828 if (remove_all_curse())
6830 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
6837 if (name) return _("邪悪追放", "Banish Evil");
6838 if (desc) return _("視界内の全ての邪悪なモンスターをテレポートさせる。抵抗されると無効。",
6839 "Teleports all evil monsters in sight away unless resisted.");
6844 if (info) return info_power(power);
6848 if (banish_evil(power))
6850 msg_print(_("神聖な力が邪悪を打ち払った!", "The holy power banishes evil!"));
6857 if (name) return _("ハルマゲドン", "Armageddon");
6858 if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroy everything in nearby area.");
6866 destroy_area(p_ptr->y, p_ptr->x, base + randint1(sides), FALSE);
6872 if (name) return _("目には目を", "An Eye for an Eye");
6873 if (desc) return _("一定時間、自分がダメージを受けたときに攻撃を行ったモンスターに対して同等のダメージを与える。",
6874 "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.");
6879 if (info) return info_duration(base, base);
6883 set_tim_eyeeye(randint1(base) + base, FALSE);
6889 if (name) return _("神の怒り", "Wrath of the God");
6890 if (desc) return _("ターゲットの周囲に分解の球を多数落とす。", "Drops many balls of disintegration near the target.");
6893 HIT_POINT dam = plev * 3 + 25;
6896 if (info) return info_multi_damage(dam);
6900 if (!cast_wrath_of_the_god(dam, rad)) return NULL;
6906 if (name) return _("神威", "Divine Intervention");
6907 if (desc) return _("隣接するモンスターに聖なるダメージを与え、視界内のモンスターにダメージ、減速、朦朧、混乱、恐怖、眠りを与える。さらに体力を回復する。",
6908 "Damages all adjacent monsters with holy power. Damages and attempt to slow, stun, confuse, scare and freeze all monsters in sight. And heals HP.");
6911 int b_dam = plev * 11;
6912 int d_dam = plev * 4;
6914 int power = plev * 4;
6916 if (info) return format(_("回%d/損%d+%d", "h%d/dm%d+%d"), heal, d_dam, b_dam/2);
6919 project(0, 1, p_ptr->y, p_ptr->x, b_dam, GF_HOLY_FIRE, PROJECT_KILL, -1);
6920 dispel_monsters(d_dam);
6921 slow_monsters(plev);
6922 stun_monsters(power);
6923 confuse_monsters(power);
6924 turn_monsters(power);
6925 stasis_monsters(power);
6932 if (name) return _("聖戦", "Crusade");
6933 if (desc) return _("視界内の善良なモンスターをペットにしようとし、ならなかった場合及び善良でないモンスターを恐怖させる。さらに多数の加速された騎士を召喚し、ヒーロー、祝福、加速、対邪悪結界を得る。",
6934 "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.");
6940 int sp_sides = 20 + plev;
6945 for (i = 0; i < 12; i++)
6948 POSITION my = 0, mx = 0;
6952 scatter(&my, &mx, p_ptr->y, p_ptr->x, 4, 0);
6954 /* Require empty grids */
6955 if (cave_empty_bold2(my, mx)) break;
6957 if (attempt < 0) continue;
6958 summon_specific(-1, my, mx, plev, SUMMON_KNIGHTS, (PM_ALLOW_GROUP | PM_FORCE_PET | PM_HASTE));
6960 set_hero(randint1(base) + base, FALSE);
6961 set_blessed(randint1(base) + base, FALSE);
6962 set_fast(randint1(sp_sides) + sp_base, FALSE);
6963 set_protevil(randint1(base) + base, FALSE);
6977 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP)
6978 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
6980 static cptr do_music_spell(SPELL_IDX spell, BIT_FLAGS mode)
6982 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
6983 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
6984 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
6985 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
6986 bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
6987 bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
6988 bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
6989 static const char s_dam[] = _("損傷:", "dam ");
6992 int plev = p_ptr->lev;
6997 if (name) return _("遅鈍の歌", "Song of Holding");
6998 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
7000 /* Stop singing before start another */
7001 if (cast || fail) stop_singing();
7005 msg_print(_("ゆっくりとしたメロディを口ずさみ始めた...", "You start humming a slow, steady melody..."));
7006 start_singing(spell, MUSIC_SLOW);
7012 if (info) return info_power(power);
7016 slow_monsters(plev);
7022 if (name) return _("祝福の歌", "Song of Blessing");
7023 if (desc) return _("命中率とACのボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
7025 /* Stop singing before start another */
7026 if (cast || fail) stop_singing();
7030 msg_print(_("厳かなメロディを奏で始めた...", "The holy power of the Music of the Ainur enters you..."));
7031 start_singing(spell, MUSIC_BLESS);
7036 if (!p_ptr->blessed)
7038 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
7045 if (name) return _("崩壊の音色", "Wrecking Note");
7046 if (desc) return _("轟音のボルトを放つ。", "Fires a bolt of sound.");
7048 /* Stop singing before start another */
7049 if (cast || fail) stop_singing();
7052 int dice = 4 + (plev - 1) / 5;
7055 if (info) return info_damage(dice, sides, 0);
7059 if (!get_aim_dir(&dir)) return NULL;
7061 fire_bolt(GF_SOUND, dir, damroll(dice, sides));
7067 if (name) return _("朦朧の旋律", "Stun Pattern");
7068 if (desc) return _("視界内の全てのモンスターを朦朧させる。抵抗されると無効。", "Attempts to stun all monsters in sight.");
7070 /* Stop singing before start another */
7071 if (cast || fail) stop_singing();
7075 msg_print(_("眩惑させるメロディを奏で始めた...", "You weave a pattern of sounds to bewilder and daze..."));
7076 start_singing(spell, MUSIC_STUN);
7080 int dice = plev / 10;
7083 if (info) return info_power_dice(dice, sides);
7087 stun_monsters(damroll(dice, sides));
7094 if (name) return _("生命の流れ", "Flow of Life");
7095 if (desc) return _("体力を少し回復させる。", "Heals HP a little.");
7097 /* Stop singing before start another */
7098 if (cast || fail) stop_singing();
7102 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing a song of healing..."));
7103 start_singing(spell, MUSIC_L_LIFE);
7110 if (info) return info_heal(dice, sides, 0);
7114 hp_player(damroll(dice, sides));
7121 if (name) return _("太陽の歌", "Song of the Sun");
7122 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
7124 /* Stop singing before start another */
7125 if (cast || fail) stop_singing();
7129 int sides = plev / 2;
7130 int rad = plev / 10 + 1;
7132 if (info) return info_damage(dice, sides, 0);
7136 msg_print(_("光り輝く歌が辺りを照らした。", "Your uplifting song brings brightness to dark places..."));
7137 lite_area(damroll(dice, sides), rad);
7143 if (name) return _("恐怖の歌", "Song of Fear");
7144 if (desc) return _("視界内の全てのモンスターを恐怖させる。抵抗されると無効。", "Attempts to scare all monsters in sight.");
7146 /* Stop singing before start another */
7147 if (cast || fail) stop_singing();
7151 msg_print(_("おどろおどろしいメロディを奏で始めた...", "You start weaving a fearful pattern..."));
7152 start_singing(spell, MUSIC_FEAR);
7158 if (info) return info_power(power);
7162 project_hack(GF_TURN_ALL, power);
7169 if (name) return _("戦いの歌", "Heroic Ballad");
7170 if (desc) return _("ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
7172 /* Stop singing before start another */
7173 if (cast || fail) stop_singing();
7177 msg_print(_("激しい戦いの歌を歌った...", "You start singing a song of intense fighting..."));
7179 (void)hp_player(10);
7180 (void)set_afraid(0);
7182 /* Recalculate hitpoints */
7183 p_ptr->update |= (PU_HP);
7185 start_singing(spell, MUSIC_HERO);
7192 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
7193 /* Recalculate hitpoints */
7194 p_ptr->update |= (PU_HP);
7201 if (name) return _("霊的知覚", "Clairaudience");
7202 if (desc) return _("近くの罠/扉/階段を感知する。レベル15で全てのモンスター、20で財宝とアイテムを感知できるようになる。レベル25で周辺の地形を感知し、40でその階全体を永久に照らし、ダンジョン内のすべてのアイテムを感知する。この効果は歌い続けることで順に起こる。",
7203 "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.");
7205 /* Stop singing before start another */
7206 if (cast || fail) stop_singing();
7210 msg_print(_("静かな音楽が感覚を研ぎ澄まさせた...", "Your quiet music sharpens your sense of hearing..."));
7211 /* Hack -- Initialize the turn count */
7212 SINGING_COUNT(p_ptr) = 0;
7213 start_singing(spell, MUSIC_DETECT);
7217 int rad = DETECT_RAD_DEFAULT;
7219 if (info) return info_radius(rad);
7223 int count = SINGING_COUNT(p_ptr);
7225 if (count >= 19) wiz_lite(FALSE);
7229 if (plev > 39 && count < 19)
7230 SINGING_COUNT(p_ptr) = count + 1;
7234 /* There are too many hidden treasure. So... */
7235 /* detect_treasure(rad); */
7236 detect_objects_gold(rad);
7237 detect_objects_normal(rad);
7239 if (plev > 24 && count < 11)
7240 SINGING_COUNT(p_ptr) = count + 1;
7244 detect_monsters_invis(rad);
7245 detect_monsters_normal(rad);
7247 if (plev > 19 && count < 6)
7248 SINGING_COUNT(p_ptr) = count + 1;
7250 detect_traps(rad, TRUE);
7254 if (plev > 14 && count < 3)
7255 SINGING_COUNT(p_ptr) = count + 1;
7262 if (name) return _("魂の歌", "Soul Shriek");
7263 if (desc) return _("視界内の全てのモンスターに対して精神攻撃を行う。", "Damages all monsters in sight with PSI damages.");
7265 /* Stop singing before start another */
7266 if (cast || fail) stop_singing();
7270 msg_print(_("精神を捻じ曲げる歌を歌った...", "You start singing a song of soul in pain..."));
7271 start_singing(spell, MUSIC_PSI);
7276 int sides = plev * 3 / 2;
7278 if (info) return info_damage(dice, sides, 0);
7282 project_hack(GF_PSI, damroll(dice, sides));
7289 if (name) return _("知識の歌", "Song of Lore");
7290 if (desc) return _("自分のいるマスと隣りのマスに落ちているアイテムを鑑定する。", "Identifies all items which are in the adjacent squares.");
7292 /* Stop singing before start another */
7293 if (cast || fail) stop_singing();
7297 msg_print(_("この世界の知識が流れ込んできた...", "You recall the rich lore of the world..."));
7298 start_singing(spell, MUSIC_ID);
7304 if (info) return info_radius(rad);
7308 * MP不足で鑑定が発動される前に歌が中断してしまうのを防止。
7312 project(0, rad, p_ptr->y, p_ptr->x, 0, GF_IDENTIFY, PROJECT_ITEM, -1);
7319 if (name) return _("隠遁の歌", "Hiding Tune");
7320 if (desc) return _("隠密行動能力を上昇させる。", "Gives improved stealth.");
7322 /* Stop singing before start another */
7323 if (cast || fail) stop_singing();
7327 msg_print(_("あなたの姿が景色にとけこんでいった...", "Your song carries you beyond the sight of mortal eyes..."));
7328 start_singing(spell, MUSIC_STEALTH);
7333 if (!p_ptr->tim_stealth)
7335 msg_print(_("姿がはっきりと見えるようになった。", "You are no longer hided."));
7342 if (name) return _("幻影の旋律", "Illusion Pattern");
7343 if (desc) return _("視界内の全てのモンスターを混乱させる。抵抗されると無効。", "Attempts to confuse all monsters in sight.");
7345 /* Stop singing before start another */
7346 if (cast || fail) stop_singing();
7350 msg_print(_("辺り一面に幻影が現れた...", "You weave a pattern of sounds to beguile and confuse..."));
7351 start_singing(spell, MUSIC_CONF);
7355 int power = plev * 2;
7357 if (info) return info_power(power);
7361 confuse_monsters(power);
7368 if (name) return _("破滅の叫び", "Doomcall");
7369 if (desc) return _("視界内の全てのモンスターに対して轟音攻撃を行う。", "Damages all monsters in sight with booming sound.");
7371 /* Stop singing before start another */
7372 if (cast || fail) stop_singing();
7376 msg_print(_("轟音が響いた...", "The fury of the Downfall of Numenor lashes out..."));
7377 start_singing(spell, MUSIC_SOUND);
7381 int dice = 10 + plev / 5;
7384 if (info) return info_damage(dice, sides, 0);
7388 project_hack(GF_SOUND, damroll(dice, sides));
7395 if (name) return _("フィリエルの歌", "Firiel's Song");
7396 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
7399 /* Stop singing before start another */
7400 if (cast || fail) stop_singing();
7404 msg_print(_("生命と復活のテーマを奏で始めた...", "The themes of life and revival are woven into your song..."));
7405 animate_dead(0, p_ptr->y, p_ptr->x);
7411 if (name) return _("旅の仲間", "Fellowship Chant");
7412 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
7414 /* Stop singing before start another */
7415 if (cast || fail) stop_singing();
7419 msg_print(_("安らかなメロディを奏で始めた...", "You weave a slow, soothing melody of imploration..."));
7420 start_singing(spell, MUSIC_CHARM);
7424 int dice = 10 + plev / 15;
7427 if (info) return info_power_dice(dice, sides);
7431 charm_monsters(damroll(dice, sides));
7438 if (name) return _("分解音波", "Sound of disintegration");
7439 if (desc) return _("壁を掘り進む。自分の足元のアイテムは蒸発する。", "Makes you be able to burrow into walls. Objects under your feet evaporate.");
7441 /* Stop singing before start another */
7442 if (cast || fail) stop_singing();
7446 msg_print(_("粉砕するメロディを奏で始めた...", "You weave a violent pattern of sounds to break wall."));
7447 start_singing(spell, MUSIC_WALL);
7453 * MP不足で効果が発動される前に歌が中断してしまうのを防止。
7457 project(0, 0, p_ptr->y, p_ptr->x,
7458 0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1);
7464 if (name) return _("元素耐性", "Finrod's Resistance");
7465 if (desc) return _("酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
7466 "Gives resistance to fire, cold, electricity, acid and poison. These resistances can be added to which from equipment for more powerful resistances.");
7468 /* Stop singing before start another */
7469 if (cast || fail) stop_singing();
7473 msg_print(_("元素の力に対する忍耐の歌を歌った。", "You sing a song of perseverance against powers..."));
7474 start_singing(spell, MUSIC_RESIST);
7479 if (!p_ptr->oppose_acid)
7481 msg_print(_("酸への耐性が薄れた気がする。", "You feel less resistant to acid."));
7484 if (!p_ptr->oppose_elec)
7486 msg_print(_("電撃への耐性が薄れた気がする。", "You feel less resistant to elec."));
7489 if (!p_ptr->oppose_fire)
7491 msg_print(_("火への耐性が薄れた気がする。", "You feel less resistant to fire."));
7494 if (!p_ptr->oppose_cold)
7496 msg_print(_("冷気への耐性が薄れた気がする。", "You feel less resistant to cold."));
7499 if (!p_ptr->oppose_pois)
7501 msg_print(_("毒への耐性が薄れた気がする。", "You feel less resistant to pois."));
7508 if (name) return _("ホビットのメロディ", "Hobbit Melodies");
7509 if (desc) return _("加速する。", "Hastes you.");
7511 /* Stop singing before start another */
7512 if (cast || fail) stop_singing();
7516 msg_print(_("軽快な歌を口ずさみ始めた...", "You start singing joyful pop song..."));
7517 start_singing(spell, MUSIC_SPEED);
7524 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
7531 if (name) return _("歪んだ世界", "World Contortion");
7532 if (desc) return _("近くのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all nearby monsters away unless resisted.");
7535 int rad = plev / 15 + 1;
7536 int power = plev * 3 + 1;
7538 if (info) return info_radius(rad);
7540 /* Stop singing before start another */
7541 if (cast || fail) stop_singing();
7545 msg_print(_("歌が空間を歪めた...", "Reality whirls wildly as you sing a dizzying melody..."));
7546 project(0, rad, p_ptr->y, p_ptr->x, power, GF_AWAY_ALL, PROJECT_KILL, -1);
7552 if (name) return _("退散の歌", "Dispelling chant");
7553 if (desc) return _("視界内の全てのモンスターにダメージを与える。邪悪なモンスターに特に大きなダメージを与える。",
7554 "Damages all monsters in sight. Hurts evil monsters greatly.");
7556 /* Stop singing before start another */
7557 if (cast || fail) stop_singing();
7561 msg_print(_("耐えられない不協和音が敵を責め立てた...", "You cry out in an ear-wracking voice..."));
7562 start_singing(spell, MUSIC_DISPEL);
7566 int m_sides = plev * 3;
7567 int e_sides = plev * 3;
7569 if (info) return format("%s1d%d+1d%d", s_dam, m_sides, e_sides);
7573 dispel_monsters(randint1(m_sides));
7574 dispel_evil(randint1(e_sides));
7580 if (name) return _("サルマンの甘言", "The Voice of Saruman");
7581 if (desc) return _("視界内の全てのモンスターを減速させ、眠らせようとする。抵抗されると無効。", "Attempts to slow and sleep all monsters in sight.");
7583 /* Stop singing before start another */
7584 if (cast || fail) stop_singing();
7588 msg_print(_("優しく、魅力的な歌を口ずさみ始めた...", "You start humming a gentle and attractive song..."));
7589 start_singing(spell, MUSIC_SARUMAN);
7595 if (info) return info_power(power);
7599 slow_monsters(plev);
7600 sleep_monsters(plev);
7607 if (name) return _("嵐の音色", "Song of the Tempest");
7608 if (desc) return _("轟音のビームを放つ。", "Fires a beam of sound.");
7611 int dice = 15 + (plev - 1) / 2;
7614 if (info) return info_damage(dice, sides, 0);
7616 /* Stop singing before start another */
7617 if (cast || fail) stop_singing();
7621 if (!get_aim_dir(&dir)) return NULL;
7623 fire_beam(GF_SOUND, dir, damroll(dice, sides));
7629 if (name) return _("もう一つの世界", "Ambarkanta");
7630 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
7636 if (info) return info_delay(base, sides);
7638 /* Stop singing before start another */
7639 if (cast || fail) stop_singing();
7643 msg_print(_("周囲が変化し始めた...", "You sing of the primeval shaping of Middle-earth..."));
7650 if (name) return _("破壊の旋律", "Wrecking Pattern");
7651 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
7652 "Shakes dungeon structure, and results in random swapping of floors and walls.");
7654 /* Stop singing before start another */
7655 if (cast || fail) stop_singing();
7659 msg_print(_("破壊的な歌が響きわたった...", "You weave a pattern of sounds to contort and shatter..."));
7660 start_singing(spell, MUSIC_QUAKE);
7666 if (info) return info_radius(rad);
7670 earthquake(p_ptr->y, p_ptr->x, 10);
7678 if (name) return _("停滞の歌", "Stationary Shriek");
7679 if (desc) return _("視界内の全てのモンスターを麻痺させようとする。抵抗されると無効。", "Attempts to freeze all monsters in sight.");
7681 /* Stop singing before start another */
7682 if (cast || fail) stop_singing();
7686 msg_print(_("ゆっくりとしたメロディを奏で始めた...", "You weave a very slow pattern which is almost likely to stop..."));
7687 start_singing(spell, MUSIC_STASIS);
7691 int power = plev * 4;
7693 if (info) return info_power(power);
7697 stasis_monsters(power);
7704 if (name) return _("守りの歌", "Endurance");
7705 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。",
7706 "Sets a glyph on the floor beneath you. Monsters cannot attack you if you are on a glyph, but can try to break glyph.");
7709 /* Stop singing before start another */
7710 if (cast || fail) stop_singing();
7714 msg_print(_("歌が神聖な場を作り出した...", "The holy power of the Music is creating sacred field..."));
7721 if (name) return _("英雄の詩", "The Hero's Poem");
7722 if (desc) return _("加速し、ヒーロー気分になり、視界内の全てのモンスターにダメージを与える。",
7723 "Hastes you. Gives heroism. Damages all monsters in sight.");
7725 /* Stop singing before start another */
7726 if (cast || fail) stop_singing();
7730 msg_print(_("英雄の歌を口ずさんだ...", "You chant a powerful, heroic call to arms..."));
7731 (void)hp_player(10);
7732 (void)set_afraid(0);
7734 /* Recalculate hitpoints */
7735 p_ptr->update |= (PU_HP);
7737 start_singing(spell, MUSIC_SHERO);
7744 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
7745 /* Recalculate hitpoints */
7746 p_ptr->update |= (PU_HP);
7751 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
7757 int sides = plev * 3;
7759 if (info) return info_damage(dice, sides, 0);
7763 dispel_monsters(damroll(dice, sides));
7769 if (name) return _("ヤヴァンナの助け", "Relief of Yavanna");
7770 if (desc) return _("強力な回復の歌で、負傷と朦朧状態も全快する。", "Powerful healing song. Also heals cut and stun completely.");
7772 /* Stop singing before start another */
7773 if (cast || fail) stop_singing();
7777 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing the song..."));
7778 start_singing(spell, MUSIC_H_LIFE);
7785 if (info) return info_heal(dice, sides, 0);
7789 hp_player(damroll(dice, sides));
7798 if (name) return _("再生の歌", "Goddess' rebirth");
7799 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
7802 /* Stop singing before start another */
7803 if (cast || fail) stop_singing();
7807 msg_print(_("暗黒の中に光と美をふりまいた。体が元の活力を取り戻した。",
7808 "You strewed light and beauty in the dark as you sing. You feel refreshed."));
7809 (void)do_res_stat(A_STR);
7810 (void)do_res_stat(A_INT);
7811 (void)do_res_stat(A_WIS);
7812 (void)do_res_stat(A_DEX);
7813 (void)do_res_stat(A_CON);
7814 (void)do_res_stat(A_CHR);
7815 (void)restore_level();
7821 if (name) return _("サウロンの魔術", "Wizardry of Sauron");
7822 if (desc) return _("非常に強力でごく小さい轟音の球を放つ。", "Fires an extremely powerful tiny ball of sound.");
7825 int dice = 50 + plev;
7829 if (info) return info_damage(dice, sides, 0);
7831 /* Stop singing before start another */
7832 if (cast || fail) stop_singing();
7836 if (!get_aim_dir(&dir)) return NULL;
7838 fire_ball(GF_SOUND, dir, damroll(dice, sides), rad);
7844 if (name) return _("フィンゴルフィンの挑戦", "Fingolfin's Challenge");
7845 if (desc) return _("ダメージを受けなくなるバリアを張る。",
7846 "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks.");
7848 /* Stop singing before start another */
7849 if (cast || fail) stop_singing();
7853 msg_print(_("フィンゴルフィンの冥王への挑戦を歌った...",
7854 "You recall the valor of Fingolfin's challenge to the Dark Lord..."));
7857 p_ptr->redraw |= (PR_MAP);
7859 /* Update monsters */
7860 p_ptr->update |= (PU_MONSTERS);
7863 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
7865 start_singing(spell, MUSIC_INVULN);
7872 msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));
7874 p_ptr->redraw |= (PR_MAP);
7876 /* Update monsters */
7877 p_ptr->update |= (PU_MONSTERS);
7880 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
7893 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_CAST)
7894 * @return SPELL_NAME / SPELL_DESC 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
7896 static cptr do_hissatsu_spell(SPELL_IDX spell, BIT_FLAGS mode)
7898 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
7899 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
7900 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
7903 int plev = p_ptr->lev;
7908 if (name) return _("飛飯綱", "Tobi-Izuna");
7909 if (desc) return _("2マス離れたところにいるモンスターを攻撃する。", "Attacks a two squares distant monster.");
7914 if (!get_aim_dir(&dir)) return NULL;
7916 project_hook(GF_ATTACK, dir, HISSATSU_2, PROJECT_STOP | PROJECT_KILL);
7921 if (name) return _("五月雨斬り", "3-Way Attack");
7922 if (desc) return _("3方向に対して攻撃する。", "Attacks in 3 directions in one time.");
7929 if (!get_rep_dir2(&dir)) return NULL;
7930 if (dir == 5) return NULL;
7932 for (cdir = 0;cdir < 8; cdir++)
7934 if (cdd[cdir] == dir) break;
7937 if (cdir == 8) return NULL;
7939 y = p_ptr->y + ddy_cdd[cdir];
7940 x = p_ptr->x + ddx_cdd[cdir];
7941 if (cave[y][x].m_idx)
7944 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
7946 y = p_ptr->y + ddy_cdd[(cdir + 7) % 8];
7947 x = p_ptr->x + ddx_cdd[(cdir + 7) % 8];
7948 if (cave[y][x].m_idx)
7951 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
7953 y = p_ptr->y + ddy_cdd[(cdir + 1) % 8];
7954 x = p_ptr->x + ddx_cdd[(cdir + 1) % 8];
7955 if (cave[y][x].m_idx)
7958 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
7963 if (name) return _("ブーメラン", "Boomerang");
7964 if (desc) return _("武器を手元に戻ってくるように投げる。戻ってこないこともある。",
7965 "Throws current weapon. And it'll return to your hand unless failed.");
7969 if (!do_cmd_throw_aux(1, TRUE, -1)) return NULL;
7974 if (name) return _("焔霊", "Burning Strike");
7975 if (desc) return _("火炎耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to fire.");
7981 if (!get_rep_dir2(&dir)) return NULL;
7982 if (dir == 5) return NULL;
7984 y = p_ptr->y + ddy[dir];
7985 x = p_ptr->x + ddx[dir];
7987 if (cave[y][x].m_idx)
7988 py_attack(y, x, HISSATSU_FIRE);
7991 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
7998 if (name) return _("殺気感知", "Detect Ferocity");
7999 if (desc) return _("近くの思考することができるモンスターを感知する。", "Detects all monsters except mindless in your vicinity.");
8003 detect_monsters_mind(DETECT_RAD_DEFAULT);
8008 if (name) return _("みね打ち", "Strike to Stun");
8009 if (desc) return _("相手にダメージを与えないが、朦朧とさせる。", "Attempts to stun a monster in the adjacent.");
8015 if (!get_rep_dir2(&dir)) return NULL;
8016 if (dir == 5) return NULL;
8018 y = p_ptr->y + ddy[dir];
8019 x = p_ptr->x + ddx[dir];
8021 if (cave[y][x].m_idx)
8022 py_attack(y, x, HISSATSU_MINEUCHI);
8025 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8032 if (name) return _("カウンター", "Counter");
8033 if (desc) return _("相手に攻撃されたときに反撃する。反撃するたびにMPを消費。",
8034 "Prepares to counterattack. When attack by a monster, strikes back using SP each time.");
8040 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
8043 msg_print(_("相手の攻撃に対して身構えた。", "You prepare to counter blow."));
8044 p_ptr->counter = TRUE;
8049 if (name) return _("払い抜け", "Harainuke");
8050 if (desc) return _("攻撃した後、反対側に抜ける。",
8051 "Attacks monster with your weapons normally, then move through counter side of the monster.");
8059 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
8063 if (!get_rep_dir2(&dir)) return NULL;
8065 if (dir == 5) return NULL;
8066 y = p_ptr->y + ddy[dir];
8067 x = p_ptr->x + ddx[dir];
8069 if (!cave[y][x].m_idx)
8071 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8077 if (!player_can_enter(cave[y][x].feat, 0) || is_trap(cave[y][x].feat))
8083 if (player_can_enter(cave[y][x].feat, 0) && !is_trap(cave[y][x].feat) && !cave[y][x].m_idx)
8087 /* Move the player */
8088 (void)move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);
8094 if (name) return _("サーペンツタン", "Serpent's Tongue");
8095 if (desc) return _("毒耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to poison.");
8101 if (!get_rep_dir2(&dir)) return NULL;
8102 if (dir == 5) return NULL;
8104 y = p_ptr->y + ddy[dir];
8105 x = p_ptr->x + ddx[dir];
8107 if (cave[y][x].m_idx)
8108 py_attack(y, x, HISSATSU_POISON);
8111 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8118 if (name) return _("斬魔剣弐の太刀", "Zammaken");
8119 if (desc) return _("生命のない邪悪なモンスターに大ダメージを与えるが、他のモンスターには全く効果がない。",
8120 "Attacks an evil unliving monster with great damage. No effect to other monsters.");
8126 if (!get_rep_dir2(&dir)) return NULL;
8127 if (dir == 5) return NULL;
8129 y = p_ptr->y + ddy[dir];
8130 x = p_ptr->x + ddx[dir];
8132 if (cave[y][x].m_idx)
8133 py_attack(y, x, HISSATSU_ZANMA);
8136 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8143 if (name) return _("裂風剣", "Wind Blast");
8144 if (desc) return _("攻撃した相手を後方へ吹き飛ばす。", "Attacks an adjacent monster, and blow it away.");
8150 if (!get_rep_dir2(&dir)) return NULL;
8151 if (dir == 5) return NULL;
8153 y = p_ptr->y + ddy[dir];
8154 x = p_ptr->x + ddx[dir];
8156 if (cave[y][x].m_idx)
8160 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8163 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
8167 if (cave[y][x].m_idx)
8170 POSITION ty = y, tx = x;
8171 POSITION oy = y, ox = x;
8172 MONSTER_IDX m_idx = cave[y][x].m_idx;
8173 monster_type *m_ptr = &m_list[m_idx];
8176 monster_desc(m_name, m_ptr, 0);
8178 for (i = 0; i < 5; i++)
8182 if (cave_empty_bold(y, x))
8189 if ((ty != oy) || (tx != ox))
8191 msg_format(_("%sを吹き飛ばした!", "You blow %s away!"), m_name);
8192 cave[oy][ox].m_idx = 0;
8193 cave[ty][tx].m_idx = m_idx;
8197 update_mon(m_idx, TRUE);
8201 if (r_info[m_ptr->r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))
8202 p_ptr->update |= (PU_MON_LITE);
8209 if (name) return _("刀匠の目利き", "Judge");
8210 if (desc) return _("武器・防具を1つ識別する。レベル45以上で武器・防具の能力を完全に知ることができる。",
8211 "Identifies a weapon or armor. Or *identifies* these at level 45.");
8217 if (!identify_fully(TRUE)) return NULL;
8221 if (!ident_spell(TRUE)) return NULL;
8227 if (name) return _("破岩斬", "Rock Smash");
8228 if (desc) return _("岩を壊し、岩石系のモンスターに大ダメージを与える。", "Breaks rock. Or greatly damage a monster made by rocks.");
8234 if (!get_rep_dir2(&dir)) return NULL;
8235 if (dir == 5) return NULL;
8237 y = p_ptr->y + ddy[dir];
8238 x = p_ptr->x + ddx[dir];
8240 if (cave[y][x].m_idx)
8241 py_attack(y, x, HISSATSU_HAGAN);
8243 if (!cave_have_flag_bold(y, x, FF_HURT_ROCK)) break;
8245 /* Destroy the feature */
8246 cave_alter_feat(y, x, FF_HURT_ROCK);
8248 /* Update some things */
8249 p_ptr->update |= (PU_FLOW);
8254 if (name) return _("乱れ雪月花", "Midare-Setsugekka");
8255 if (desc) return _("攻撃回数が増え、冷気耐性のないモンスターに大ダメージを与える。",
8256 "Attacks a monster with increased number of attacks and more damage unless it has resistance to cold.");
8262 if (!get_rep_dir2(&dir)) return NULL;
8263 if (dir == 5) return NULL;
8265 y = p_ptr->y + ddy[dir];
8266 x = p_ptr->x + ddx[dir];
8268 if (cave[y][x].m_idx)
8269 py_attack(y, x, HISSATSU_COLD);
8272 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8279 if (name) return _("急所突き", "Spot Aiming");
8280 if (desc) return _("モンスターを一撃で倒す攻撃を繰り出す。失敗すると1点しかダメージを与えられない。",
8281 "Attempts to kill a monster instantly. If failed cause only 1HP of damage.");
8287 if (!get_rep_dir2(&dir)) return NULL;
8288 if (dir == 5) return NULL;
8290 y = p_ptr->y + ddy[dir];
8291 x = p_ptr->x + ddx[dir];
8293 if (cave[y][x].m_idx)
8294 py_attack(y, x, HISSATSU_KYUSHO);
8297 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8304 if (name) return _("魔神斬り", "Majingiri");
8305 if (desc) return _("会心の一撃で攻撃する。攻撃がかわされやすい。",
8306 "Attempts to attack with critical hit. But this attack is easy to evade for a monster.");
8312 if (!get_rep_dir2(&dir)) return NULL;
8313 if (dir == 5) return NULL;
8315 y = p_ptr->y + ddy[dir];
8316 x = p_ptr->x + ddx[dir];
8318 if (cave[y][x].m_idx)
8319 py_attack(y, x, HISSATSU_MAJIN);
8322 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8329 if (name) return _("捨て身", "Desperate Attack");
8330 if (desc) return _("強力な攻撃を繰り出す。次のターンまでの間、食らうダメージが増える。",
8331 "Attacks with all of your power. But all damages you take will be doubled for one turn.");
8337 if (!get_rep_dir2(&dir)) return NULL;
8338 if (dir == 5) return NULL;
8340 y = p_ptr->y + ddy[dir];
8341 x = p_ptr->x + ddx[dir];
8343 if (cave[y][x].m_idx)
8344 py_attack(y, x, HISSATSU_SUTEMI);
8347 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8350 p_ptr->sutemi = TRUE;
8355 if (name) return _("雷撃鷲爪斬", "Lightning Eagle");
8356 if (desc) return _("電撃耐性のないモンスターに非常に大きいダメージを与える。",
8357 "Attacks a monster with more damage unless it has resistance to electricity.");
8363 if (!get_rep_dir2(&dir)) return NULL;
8364 if (dir == 5) return NULL;
8366 y = p_ptr->y + ddy[dir];
8367 x = p_ptr->x + ddx[dir];
8369 if (cave[y][x].m_idx)
8370 py_attack(y, x, HISSATSU_ELEC);
8373 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8380 if (name) return _("入身", "Rush Attack");
8381 if (desc) return _("素早く相手に近寄り攻撃する。", "Steps close to a monster and attacks at a time.");
8385 if (!rush_attack(NULL)) return NULL;
8390 if (name) return _("赤流渦", "Bloody Maelstrom");
8391 if (desc) return _("自分自身も傷を作りつつ、その傷が深いほど大きい威力で全方向の敵を攻撃できる。生きていないモンスターには効果がない。",
8392 "Attacks all adjacent monsters with power corresponding to your cut status. Then increases your cut status. No effect to unliving monsters.");
8399 monster_type *m_ptr;
8401 if (p_ptr->cut < 300)
8402 set_cut(p_ptr->cut + 300);
8404 set_cut(p_ptr->cut * 2);
8406 for (dir = 0; dir < 8; dir++)
8408 y = p_ptr->y + ddy_ddd[dir];
8409 x = p_ptr->x + ddx_ddd[dir];
8410 c_ptr = &cave[y][x];
8412 /* Get the monster */
8413 m_ptr = &m_list[c_ptr->m_idx];
8415 /* Hack -- attack monsters */
8416 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
8418 if (!monster_living(&r_info[m_ptr->r_idx]))
8422 monster_desc(m_name, m_ptr, 0);
8423 msg_format(_("%sには効果がない!", "%s is unharmed!"), m_name);
8425 else py_attack(y, x, HISSATSU_SEKIRYUKA);
8432 if (name) return _("激震撃", "Earthquake Blow");
8433 if (desc) return _("地震を起こす。", "Shakes dungeon structure, and results in random swapping of floors and walls.");
8439 if (!get_rep_dir2(&dir)) return NULL;
8440 if (dir == 5) return NULL;
8442 y = p_ptr->y + ddy[dir];
8443 x = p_ptr->x + ddx[dir];
8445 if (cave[y][x].m_idx)
8446 py_attack(y, x, HISSATSU_QUAKE);
8448 earthquake(p_ptr->y, p_ptr->x, 10);
8453 if (name) return _("地走り", "Crack");
8454 if (desc) return _("衝撃波のビームを放つ。", "Fires a beam of shock wave.");
8458 int total_damage = 0, basedam, i;
8459 u32b flgs[TR_FLAG_SIZE];
8461 if (!get_aim_dir(&dir)) return NULL;
8462 msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
8463 for (i = 0; i < 2; i++)
8467 if (!buki_motteruka(INVEN_RARM+i)) break;
8468 o_ptr = &inventory[INVEN_RARM+i];
8469 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
8470 damage = o_ptr->to_d * 100;
8471 object_flags(o_ptr, flgs);
8472 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
8478 else if (have_flag(flgs, TR_VORPAL))
8480 /* vorpal flag only */
8485 damage *= p_ptr->num_blow[i];
8486 total_damage += damage / 200;
8487 if (i) total_damage = total_damage*7/10;
8489 fire_beam(GF_FORCE, dir, total_damage);
8494 if (name) return _("気迫の雄叫び", "War Cry");
8495 if (desc) return _("視界内の全モンスターに対して轟音の攻撃を行う。さらに、近くにいるモンスターを怒らせる。",
8496 "Damages all monsters in sight with sound. Aggravate nearby monsters.");
8500 msg_print(_("雄叫びをあげた!", "You roar out!"));
8501 project_hack(GF_SOUND, randint1(plev * 3));
8502 aggravate_monsters(0);
8507 if (name) return _("無双三段", "Musou-Sandan");
8508 if (desc) return _("強力な3段攻撃を繰り出す。", "Attacks with powerful 3 strikes.");
8514 if (!get_rep_dir2(&dir)) return NULL;
8515 if (dir == 5) return NULL;
8517 for (i = 0; i < 3; i++)
8523 monster_type *m_ptr;
8525 y = p_ptr->y + ddy[dir];
8526 x = p_ptr->x + ddx[dir];
8527 c_ptr = &cave[y][x];
8530 py_attack(y, x, HISSATSU_3DAN);
8533 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8537 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
8542 /* Monster is dead? */
8543 if (!c_ptr->m_idx) break;
8547 m_idx = c_ptr->m_idx;
8548 m_ptr = &m_list[m_idx];
8550 /* Monster cannot move back? */
8551 if (!monster_can_enter(ny, nx, &r_info[m_ptr->r_idx], 0))
8554 if (i < 2) msg_print(NULL);
8559 cave[ny][nx].m_idx = m_idx;
8563 update_mon(m_idx, TRUE);
8565 /* Redraw the old spot */
8568 /* Redraw the new spot */
8571 /* Player can move forward? */
8572 if (player_can_enter(c_ptr->feat, 0))
8574 /* Move the player */
8575 if (!move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP)) break;
8583 if (i < 2) msg_print(NULL);
8589 if (name) return _("吸血鬼の牙", "Vampire's Fang");
8590 if (desc) return _("攻撃した相手の体力を吸いとり、自分の体力を回復させる。生命を持たないモンスターには通じない。",
8591 "Attacks with vampiric strikes which absorbs HP from a monster and gives them to you. No effect to unliving monsters.");
8597 if (!get_rep_dir2(&dir)) return NULL;
8598 if (dir == 5) return NULL;
8600 y = p_ptr->y + ddy[dir];
8601 x = p_ptr->x + ddx[dir];
8603 if (cave[y][x].m_idx)
8604 py_attack(y, x, HISSATSU_DRAIN);
8607 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8614 if (name) return _("幻惑", "Moon Dazzling");
8615 if (desc) return _("視界内の起きている全モンスターに朦朧、混乱、眠りを与えようとする。", "Attempts to stun, confuse and sleep all waking monsters.");
8619 msg_print(_("武器を不規則に揺らした...", "You irregularly wave your weapon..."));
8620 project_hack(GF_ENGETSU, plev * 4);
8621 project_hack(GF_ENGETSU, plev * 4);
8622 project_hack(GF_ENGETSU, plev * 4);
8627 if (name) return _("百人斬り", "Hundred Slaughter");
8628 if (desc) return _("連続して入身でモンスターを攻撃する。攻撃するたびにMPを消費。MPがなくなるか、モンスターを倒せなかったら百人斬りは終了する。",
8629 "Performs a series of rush attacks. The series continues while killing each monster in a time and SP remains.");
8633 const int mana_cost_per_monster = 8;
8639 if (!rush_attack(&mdeath)) break;
8642 /* Reserve needed mana point */
8643 p_ptr->csp -= technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
8647 p_ptr->csp -= mana_cost_per_monster;
8652 p_ptr->redraw |= PR_MANA;
8655 while (p_ptr->csp > mana_cost_per_monster);
8657 if (is_new) return NULL;
8659 /* Restore reserved mana */
8660 p_ptr->csp += technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
8665 if (name) return _("天翔龍閃", "Dragonic Flash");
8666 if (desc) return _("視界内の場所を指定して、その場所と自分の間にいる全モンスターを攻撃し、その場所に移動する。",
8667 "Runs toward given location while attacking all monsters on the path.");
8673 if (!tgt_pt(&x, &y)) return NULL;
8675 if (!cave_player_teleportable_bold(y, x, 0L) ||
8676 (distance(y, x, p_ptr->y, p_ptr->x) > MAX_SIGHT / 2) ||
8677 !projectable(p_ptr->y, p_ptr->x, y, x))
8679 msg_print(_("失敗!", "You cannot move to that place!"));
8682 if (p_ptr->anti_tele)
8684 msg_print(_("不思議な力がテレポートを防いだ!", "A mysterious force prevents you from teleporting!"));
8687 project(0, 0, y, x, HISSATSU_ISSEN, GF_ATTACK, PROJECT_BEAM | PROJECT_KILL, -1);
8688 teleport_player_to(y, x, 0L);
8693 if (name) return _("二重の剣撃", "Twin Slash");
8694 if (desc) return _("1ターンで2度攻撃を行う。", "double attacks at a time.");
8700 if (!get_rep_dir(&dir, FALSE)) return NULL;
8702 y = p_ptr->y + ddy[dir];
8703 x = p_ptr->x + ddx[dir];
8705 if (cave[y][x].m_idx)
8708 if (cave[y][x].m_idx)
8716 msg_print(_("その方向にはモンスターはいません。", "You don't see any monster in this direction"));
8723 if (name) return _("虎伏絶刀勢", "Kofuku-Zettousei");
8724 if (desc) return _("強力な攻撃を行い、近くの場所にも効果が及ぶ。", "Performs a powerful attack which even effect nearby monsters.");
8728 int total_damage = 0, basedam, i;
8730 u32b flgs[TR_FLAG_SIZE];
8733 if (!get_rep_dir2(&dir)) return NULL;
8734 if (dir == 5) return NULL;
8736 y = p_ptr->y + ddy[dir];
8737 x = p_ptr->x + ddx[dir];
8739 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
8741 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));
8744 msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
8745 for (i = 0; i < 2; i++)
8748 if (!buki_motteruka(INVEN_RARM+i)) break;
8749 o_ptr = &inventory[INVEN_RARM+i];
8750 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
8751 damage = o_ptr->to_d * 100;
8752 object_flags(o_ptr, flgs);
8753 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
8759 else if (have_flag(flgs, TR_VORPAL))
8761 /* vorpal flag only */
8766 damage += p_ptr->to_d[i] * 100;
8767 damage *= p_ptr->num_blow[i];
8768 total_damage += (damage / 100);
8770 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);
8775 if (name) return _("慶雲鬼忍剣", "Keiun-Kininken");
8776 if (desc) return _("自分もダメージをくらうが、相手に非常に大きなダメージを与える。アンデッドには特に効果がある。",
8777 "Attacks a monster with extremely powerful damage. But you also takes some damages. Hurts a undead monster greatly.");
8783 if (!get_rep_dir2(&dir)) return NULL;
8784 if (dir == 5) return NULL;
8786 y = p_ptr->y + ddy[dir];
8787 x = p_ptr->x + ddx[dir];
8789 if (cave[y][x].m_idx)
8790 py_attack(y, x, HISSATSU_UNDEAD);
8793 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8796 take_hit(DAMAGE_NOESCAPE, 100 + randint1(100), _("慶雲鬼忍剣を使った衝撃", "exhaustion on using Keiun-Kininken"), -1);
8801 if (name) return _("切腹", "Harakiri");
8802 if (desc) return _("「武士道とは、死ぬことと見つけたり。」", "'Busido is found in death'");
8807 if (!get_check(_("本当に自殺しますか?", "Do you really want to commit suicide? "))) return NULL;
8808 /* Special Verification for suicide */
8809 prt(_("確認のため '@' を押して下さい。", "Please verify SUICIDE by typing the '@' sign: "), 0, 0);
8814 if (i != '@') return NULL;
8815 if (p_ptr->total_winner)
8817 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
8818 p_ptr->total_winner = TRUE;
8822 msg_print(_("武士道とは、死ぬことと見つけたり。", "Meaning of Bushi-do is found in the death."));
8823 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
8833 * @brief 呪術領域の武器呪縛の対象にできる武器かどうかを返す。 / An "item_tester_hook" for offer
8834 * @param o_ptr オブジェクト構造体の参照ポインタ
8835 * @return 呪縛可能な武器ならばTRUEを返す
8837 static bool item_tester_hook_weapon_except_bow(object_type *o_ptr)
8839 switch (o_ptr->tval)
8854 * @brief 呪術領域の各処理に使える呪われた装備かどうかを返す。 / An "item_tester_hook" for offer
8855 * @param o_ptr オブジェクト構造体の参照ポインタ
8856 * @return 使える装備ならばTRUEを返す
8858 static bool item_tester_hook_cursed(object_type *o_ptr)
8860 return (bool)(object_is_cursed(o_ptr));
8864 * @brief 呪術領域魔法の各処理を行う
8866 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_CONT / SPELL_STOP)
8867 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
8869 static cptr do_hex_spell(SPELL_IDX spell, BIT_FLAGS mode)
8871 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
8872 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
8873 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
8874 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
8875 bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
8876 bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
8880 PLAYER_LEVEL plev = p_ptr->lev;
8885 /*** 1st book (0-7) ***/
8887 if (name) return _("邪なる祝福", "Evily blessing");
8888 if (desc) return _("祝福により攻撃精度と防御力が上がる。", "Attempts to increase +to_hit of a weapon and AC");
8891 if (!p_ptr->blessed)
8893 msg_print(_("高潔な気分になった!", "You feel righteous!"));
8898 if (!p_ptr->blessed)
8900 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
8906 if (name) return _("軽傷の治癒", "Cure light wounds");
8907 if (desc) return _("HPや傷を少し回復させる。", "Heals cut and HP a little.");
8908 if (info) return info_heal(1, 10, 0);
8911 msg_print(_("気分が良くなってくる。", "You feel better and better."));
8915 hp_player(damroll(1, 10));
8916 set_cut(p_ptr->cut - 10);
8921 if (name) return _("悪魔のオーラ", "Demonic aura");
8922 if (desc) return _("炎のオーラを身にまとい、回復速度が速くなる。", "Gives fire aura and regeneration.");
8925 msg_print(_("体が炎のオーラで覆われた。", "You have enveloped by fiery aura!"));
8929 msg_print(_("炎のオーラが消え去った。", "Fiery aura disappeared."));
8934 if (name) return _("悪臭霧", "Stinking mist");
8935 if (desc) return _("視界内のモンスターに微弱量の毒のダメージを与える。", "Deals few damages of poison to all monsters in your sight.");
8936 power = plev / 2 + 5;
8937 if (info) return info_damage(1, power, 0);
8940 project_hack(GF_POIS, randint1(power));
8945 if (name) return _("腕力強化", "Extra might");
8946 if (desc) return _("術者の腕力を上昇させる。", "Attempts to increase your strength.");
8949 msg_print(_("何だか力が湧いて来る。", "You feel you get stronger."));
8954 if (name) return _("武器呪縛", "Curse weapon");
8955 if (desc) return _("装備している武器を呪う。", "Curses your weapon.");
8960 char o_name[MAX_NLEN];
8962 u32b f[TR_FLAG_SIZE];
8964 item_tester_hook = item_tester_hook_weapon_except_bow;
8965 q = _("どれを呪いますか?", "Which weapon do you curse?");
8966 s = _("武器を装備していない。", "You wield no weapons.");
8968 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
8970 o_ptr = &inventory[item];
8971 object_desc(o_name, o_ptr, OD_NAME_ONLY);
8972 object_flags(o_ptr, f);
8974 if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
8977 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
8979 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
8982 if (o_ptr->to_d > 0)
8984 o_ptr->to_d -= randint1(3) % 2;
8985 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
8987 if (o_ptr->to_h > 0)
8989 o_ptr->to_h -= randint1(3) % 2;
8990 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
8992 if (o_ptr->to_a > 0)
8994 o_ptr->to_a -= randint1(3) % 2;
8995 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
8997 msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
9003 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
9004 o_ptr->curse_flags |= (TRC_CURSED);
9006 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
9009 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
9012 o_ptr->curse_flags |= (TRC_TY_CURSE);
9013 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
9015 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
9016 add_flag(o_ptr->art_flags, TR_VORPAL);
9017 add_flag(o_ptr->art_flags, TR_VAMPIRIC);
9018 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
9023 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);
9026 p_ptr->update |= (PU_BONUS);
9032 if (name) return _("邪悪感知", "Evil detection");
9033 if (desc) return _("周囲の邪悪なモンスターを感知する。", "Detects evil monsters.");
9034 if (info) return info_range(MAX_SIGHT);
9037 msg_print(_("邪悪な生物の存在を感じ取ろうとした。", "You attend to the presence of evil creatures."));
9042 if (name) return _("我慢", "Patience");
9043 if (desc) return _("数ターン攻撃を耐えた後、受けたダメージを地獄の業火として周囲に放出する。",
9044 "Bursts hell fire strongly after patients any damage while few turns.");
9045 power = MIN(200, (HEX_REVENGE_POWER(p_ptr) * 2));
9046 if (info) return info_damage(0, 0, power);
9049 int a = 3 - (p_ptr->pspeed - 100) / 10;
9050 MAGIC_NUM2 r = 3 + randint1(3) + MAX(0, MIN(3, a));
9052 if (HEX_REVENGE_TURN(p_ptr) > 0)
9054 msg_print(_("すでに我慢をしている。", "You are already patienting."));
9058 HEX_REVENGE_TYPE(p_ptr) = 1;
9059 HEX_REVENGE_TURN(p_ptr) = r;
9060 HEX_REVENGE_POWER(p_ptr) = 0;
9061 msg_print(_("じっと耐えることにした。", "You decide to patient all damages."));
9066 int rad = 2 + (power / 50);
9068 HEX_REVENGE_TURN(p_ptr)--;
9070 if ((HEX_REVENGE_TURN(p_ptr) <= 0) || (power >= 200))
9072 msg_print(_("我慢が解かれた!", "Time for end of patioence!"));
9075 project(0, rad, p_ptr->y, p_ptr->x, power, GF_HELL_FIRE,
9076 (PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);
9080 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
9084 HEX_REVENGE_TYPE(p_ptr) = 0;
9085 HEX_REVENGE_TURN(p_ptr) = 0;
9086 HEX_REVENGE_POWER(p_ptr) = 0;
9091 /*** 2nd book (8-15) ***/
9093 if (name) return _("氷の鎧", "Ice armor");
9094 if (desc) return _("氷のオーラを身にまとい、防御力が上昇する。", "Gives fire aura and bonus to AC.");
9097 msg_print(_("体が氷の鎧で覆われた。", "You have enveloped by ice armor!"));
9101 msg_print(_("氷の鎧が消え去った。", "Ice armor disappeared."));
9106 if (name) return _("重傷の治癒", "Cure serious wounds");
9107 if (desc) return _("体力や傷を多少回復させる。", "Heals cut and HP more.");
9108 if (info) return info_heal(2, 10, 0);
9111 msg_print(_("気分が良くなってくる。", "You feel better and better."));
9115 hp_player(damroll(2, 10));
9116 set_cut((p_ptr->cut / 2) - 10);
9121 if (name) return _("薬品吸入", "Inhail potion");
9122 if (desc) return _("呪文詠唱を中止することなく、薬の効果を得ることができる。", "Quaffs a potion without canceling of casting a spell.");
9125 CASTING_HEX_FLAGS(p_ptr) |= (1L << HEX_INHAIL);
9126 do_cmd_quaff_potion();
9127 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_INHAIL);
9133 if (name) return _("衰弱の霧", "Hypodynamic mist");
9134 if (desc) return _("視界内のモンスターに微弱量の衰弱属性のダメージを与える。",
9135 "Deals few damages of hypodynamia to all monsters in your sight.");
9136 power = (plev / 2) + 5;
9137 if (info) return info_damage(1, power, 0);
9140 project_hack(GF_HYPODYNAMIA, randint1(power));
9145 if (name) return _("魔剣化", "Swords to runeswords");
9146 if (desc) return _("武器の攻撃力を上げる。切れ味を得、呪いに応じて与えるダメージが上昇し、善良なモンスターに対するダメージが2倍になる。",
9147 "Gives vorpal ability to your weapon. Increases damages by your weapon acccording to curse of your weapon.");
9151 msg_print("あなたの武器が黒く輝いた。");
9153 if (!empty_hands(FALSE))
9154 msg_print("Your weapons glow bright black.");
9156 msg_print("Your weapon glows bright black.");
9162 msg_print("武器の輝きが消え去った。");
9164 msg_format("Brightness of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
9170 if (name) return _("混乱の手", "Touch of confusion");
9171 if (desc) return _("攻撃した際モンスターを混乱させる。", "Confuses a monster when you attack.");
9174 msg_print(_("あなたの手が赤く輝き始めた。", "Your hands glow bright red."));
9178 msg_print(_("手の輝きがなくなった。", "Brightness on your hands disappeard."));
9183 if (name) return _("肉体強化", "Building up");
9184 if (desc) return _("術者の腕力、器用さ、耐久力を上昇させる。攻撃回数の上限を 1 増加させる。",
9185 "Attempts to increases your strength, dexterity and constitusion.");
9188 msg_print(_("身体が強くなった気がした。", "You feel your body is developed more now."));
9193 if (name) return _("反テレポート結界", "Anti teleport barrier");
9194 if (desc) return _("視界内のモンスターのテレポートを阻害するバリアを張る。", "Obstructs all teleportations by monsters in your sight.");
9195 power = plev * 3 / 2;
9196 if (info) return info_power(power);
9199 msg_print(_("テレポートを防ぐ呪いをかけた。", "You feel anyone can not teleport except you."));
9203 /*** 3rd book (16-23) ***/
9205 if (name) return _("衝撃のクローク", "Cloak of shock");
9206 if (desc) return _("電気のオーラを身にまとい、動きが速くなる。", "Gives lightning aura and a bonus to speed.");
9209 msg_print(_("体が稲妻のオーラで覆われた。", "You have enveloped by electrical aura!"));
9213 msg_print(_("稲妻のオーラが消え去った。", "Electrical aura disappeared."));
9218 if (name) return _("致命傷の治癒", "Cure critical wounds");
9219 if (desc) return _("体力や傷を回復させる。", "Heals cut and HP greatry.");
9220 if (info) return info_heal(4, 10, 0);
9223 msg_print(_("気分が良くなってくる。", "You feel better and better."));
9227 hp_player(damroll(4, 10));
9235 if (name) return _("呪力封入", "Recharging");
9236 if (desc) return _("魔法の道具に魔力を再充填する。", "Recharges a magic device.");
9238 if (info) return info_power(power);
9241 if (!recharge(power)) return NULL;
9247 if (name) return _("死者復活", "Animate Dead");
9248 if (desc) return _("死体を蘇らせてペットにする。", "Raises corpses and skeletons from dead.");
9251 msg_print(_("死者への呼びかけを始めた。", "You start to call deads.!"));
9255 animate_dead(0, p_ptr->y, p_ptr->x);
9260 if (name) return _("防具呪縛", "Curse armor");
9261 if (desc) return _("装備している防具に呪いをかける。", "Curse a piece of armour that you wielding.");
9266 char o_name[MAX_NLEN];
9268 u32b f[TR_FLAG_SIZE];
9270 item_tester_hook = object_is_armour;
9271 q = _("どれを呪いますか?", "Which piece of armour do you curse?");
9272 s = _("防具を装備していない。", "You wield no piece of armours.");
9274 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
9276 o_ptr = &inventory[item];
9277 object_desc(o_name, o_ptr, OD_NAME_ONLY);
9278 object_flags(o_ptr, f);
9280 if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
9283 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
9285 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
9288 if (o_ptr->to_d > 0)
9290 o_ptr->to_d -= randint1(3) % 2;
9291 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
9293 if (o_ptr->to_h > 0)
9295 o_ptr->to_h -= randint1(3) % 2;
9296 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
9298 if (o_ptr->to_a > 0)
9300 o_ptr->to_a -= randint1(3) % 2;
9301 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
9303 msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
9309 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
9310 o_ptr->curse_flags |= (TRC_CURSED);
9312 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
9315 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
9318 o_ptr->curse_flags |= (TRC_TY_CURSE);
9319 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
9321 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
9322 add_flag(o_ptr->art_flags, TR_RES_POIS);
9323 add_flag(o_ptr->art_flags, TR_RES_DARK);
9324 add_flag(o_ptr->art_flags, TR_RES_NETHER);
9325 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
9330 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);
9333 p_ptr->update |= (PU_BONUS);
9339 if (name) return _("影のクローク", "Cloak of shadow");
9340 if (desc) return _("影のオーラを身にまとい、敵に影のダメージを与える。", "Gives aura of shadow.");
9343 object_type *o_ptr = &inventory[INVEN_OUTER];
9347 msg_print(_("クロークを身につけていない!", "You don't ware any cloak."));
9350 else if (!object_is_cursed(o_ptr))
9352 msg_print(_("クロークは呪われていない!", "Your cloak is not cursed."));
9357 msg_print(_("影のオーラを身にまとった。", "You have enveloped by shadow aura!"));
9362 object_type *o_ptr = &inventory[INVEN_OUTER];
9364 if ((!o_ptr->k_idx) || (!object_is_cursed(o_ptr)))
9366 do_spell(REALM_HEX, spell, SPELL_STOP);
9367 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << spell);
9368 CASTING_HEX_NUM(p_ptr)--;
9369 if (!SINGING_SONG_ID(p_ptr)) set_action(ACTION_NONE);
9374 msg_print(_("影のオーラが消え去った。", "Shadow aura disappeared."));
9379 if (name) return _("苦痛を魔力に", "Pains to mana");
9380 if (desc) return _("視界内のモンスターに精神ダメージ与え、魔力を吸い取る。", "Deals psychic damages to all monsters in sight, and drains some mana.");
9381 power = plev * 3 / 2;
9382 if (info) return info_damage(1, power, 0);
9385 project_hack(GF_PSI_DRAIN, randint1(power));
9390 if (name) return _("目には目を", "Eye for an eye");
9391 if (desc) return _("打撃や魔法で受けたダメージを、攻撃元のモンスターにも与える。", "Returns same damage which you got to the monster which damaged you.");
9394 msg_print(_("復讐したい欲望にかられた。", "You wish strongly you want to revenge anything."));
9398 /*** 4th book (24-31) ***/
9400 if (name) return _("反増殖結界", "Anti multiply barrier");
9401 if (desc) return _("その階の増殖するモンスターの増殖を阻止する。", "Obstructs all multiplying by monsters in entire floor.");
9404 msg_print(_("増殖を阻止する呪いをかけた。", "You feel anyone can not already multiply."));
9409 if (name) return _("全復活", "Restoration");
9410 if (desc) return _("経験値を徐々に復活し、減少した能力値を回復させる。", "Restores experience and status.");
9413 msg_print(_("体が元の活力を取り戻し始めた。", "You feel your lost status starting to return."));
9418 int d = (p_ptr->max_exp - p_ptr->exp);
9419 int r = (p_ptr->exp / 20);
9425 p_ptr->exp = p_ptr->max_exp;
9429 /* Check the experience */
9434 for (i = A_STR; i < 6; i ++)
9436 if (p_ptr->stat_cur[i] < p_ptr->stat_max[i])
9438 if (p_ptr->stat_cur[i] < 18)
9439 p_ptr->stat_cur[i]++;
9441 p_ptr->stat_cur[i] += 10;
9443 if (p_ptr->stat_cur[i] > p_ptr->stat_max[i])
9444 p_ptr->stat_cur[i] = p_ptr->stat_max[i];
9446 /* Recalculate bonuses */
9447 p_ptr->update |= (PU_BONUS);
9455 msg_format(_("%sの呪文の詠唱をやめた。", "Finish casting '%^s'."), do_spell(REALM_HEX, HEX_RESTORE, SPELL_NAME));
9456 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_RESTORE);
9457 if (cont) CASTING_HEX_NUM(p_ptr)--;
9458 if (CASTING_HEX_NUM(p_ptr)) p_ptr->action = ACTION_NONE;
9461 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
9462 p_ptr->redraw |= (PR_EXTRA);
9470 if (name) return _("呪力吸収", "Drain curse power");
9471 if (desc) return _("呪われた武器の呪いを吸収して魔力を回復する。", "Drains curse on your weapon and heals SP a little.");
9476 u32b f[TR_FLAG_SIZE];
9479 item_tester_hook = item_tester_hook_cursed;
9480 q = _("どの装備品から吸収しますか?", "Which cursed equipment do you drain mana from?");
9481 s = _("呪われたアイテムを装備していない。", "You have no cursed equipment.");
9483 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
9485 o_ptr = &inventory[item];
9486 object_flags(o_ptr, f);
9488 p_ptr->csp += (p_ptr->lev / 5) + randint1(p_ptr->lev / 5);
9489 if (have_flag(f, TR_TY_CURSE) || (o_ptr->curse_flags & TRC_TY_CURSE)) p_ptr->csp += randint1(5);
9490 if (p_ptr->csp > p_ptr->msp) p_ptr->csp = p_ptr->msp;
9492 if (o_ptr->curse_flags & TRC_PERMA_CURSE)
9496 else if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
9500 msg_print(_("呪いを全て吸い取った。", "Heavy curse vanished away."));
9501 o_ptr->curse_flags = 0L;
9504 else if ((o_ptr->curse_flags & (TRC_CURSED)) && one_in_(3))
9506 msg_print(_("呪いを全て吸い取った。", "Curse vanished away."));
9507 o_ptr->curse_flags = 0L;
9515 if (name) return _("吸血の刃", "Swords to vampires");
9516 if (desc) return _("吸血属性で攻撃する。", "Gives vampiric ability to your weapon.");
9520 msg_print("あなたの武器が血を欲している。");
9522 if (!empty_hands(FALSE))
9523 msg_print("Your weapons want more blood now.");
9525 msg_print("Your weapon wants more blood now.");
9531 msg_print("武器の渇望が消え去った。");
9533 msg_format("Thirsty of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
9539 if (name) return _("朦朧の言葉", "Word of stun");
9540 if (desc) return _("視界内のモンスターを朦朧とさせる。", "Stuns all monsters in your sight.");
9542 if (info) return info_power(power);
9545 stun_monsters(power);
9550 if (name) return _("影移動", "Moving into shadow");
9551 if (desc) return _("モンスターの隣のマスに瞬間移動する。", "Teleports you close to a monster.");
9558 for (i = 0; i < 3; i++)
9560 if (!tgt_pt(&x, &y)) return FALSE;
9564 for (dir = 0; dir < 8; dir++)
9566 int dy = y + ddy_ddd[dir];
9567 int dx = x + ddx_ddd[dir];
9568 if (dir == 5) continue;
9569 if(cave[dy][dx].m_idx) flag = TRUE;
9572 if (!cave_empty_bold(y, x) || (cave[y][x].info & CAVE_ICKY) ||
9573 (distance(y, x, p_ptr->y, p_ptr->x) > plev + 2))
9575 msg_print(_("そこには移動できない。", "Can not teleport to there."));
9581 if (flag && randint0(plev * plev / 2))
9583 teleport_player_to(y, x, 0L);
9587 msg_print(_("おっと!", "Oops!"));
9588 teleport_player(30, 0L);
9596 if (name) return _("反魔法結界", "Anti magic barrier");
9597 if (desc) return _("視界内のモンスターの魔法を阻害するバリアを張る。", "Obstructs all magic spell of monsters in your sight.");
9598 power = plev * 3 / 2;
9599 if (info) return info_power(power);
9602 msg_print(_("魔法を防ぐ呪いをかけた。", "You feel anyone can not cast spells except you."));
9607 if (name) return _("復讐の宣告", "Revenge sentence");
9608 if (desc) return _("数ターン後にそれまで受けたダメージに応じた威力の地獄の劫火の弾を放つ。",
9609 "Fires a ball of hell fire to try revenging after few turns.");
9610 power = HEX_REVENGE_POWER(p_ptr);
9611 if (info) return info_damage(0, 0, power);
9615 int a = 3 - (p_ptr->pspeed - 100) / 10;
9616 r = 1 + randint1(2) + MAX(0, MIN(3, a));
9618 if (HEX_REVENGE_TURN(p_ptr) > 0)
9620 msg_print(_("すでに復讐は宣告済みだ。", "You already pronounced your revenge."));
9624 HEX_REVENGE_TYPE(p_ptr) = 2;
9625 HEX_REVENGE_TURN(p_ptr) = r;
9626 msg_format(_("あなたは復讐を宣告した。あと %d ターン。", "You pronounce your revenge. %d turns left."), r);
9631 HEX_REVENGE_TURN(p_ptr)--;
9633 if (HEX_REVENGE_TURN(p_ptr) <= 0)
9643 msg_print(_("復讐の時だ!", "Time to revenge!"));
9645 while (!get_aim_dir(&dir));
9647 fire_ball(GF_HELL_FIRE, dir, power, 1);
9651 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
9656 msg_print(_("復讐する気が失せた。", "You are not a mood to revenge."));
9658 HEX_REVENGE_POWER(p_ptr) = 0;
9665 if ((cast) && (add))
9668 CASTING_HEX_FLAGS(p_ptr) |= 1L << (spell);
9669 CASTING_HEX_NUM(p_ptr)++;
9671 if (p_ptr->action != ACTION_SPELL) set_action(ACTION_SPELL);
9677 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
9678 p_ptr->redraw |= (PR_EXTRA | PR_HP | PR_MANA);
9686 * @brief 魔法処理のメインルーチン
9687 * @param realm 魔法領域のID
9688 * @param spell 各領域の魔法ID
9690 * @return 各領域魔法に各種テキストを求めた場合は文字列参照ポインタ、そうでない場合はNULLポインタを返す。
9692 cptr do_spell(REALM_IDX realm, SPELL_IDX spell, BIT_FLAGS mode)
9696 case REALM_LIFE: return do_life_spell(spell, mode);
9697 case REALM_SORCERY: return do_sorcery_spell(spell, mode);
9698 case REALM_NATURE: return do_nature_spell(spell, mode);
9699 case REALM_CHAOS: return do_chaos_spell(spell, mode);
9700 case REALM_DEATH: return do_death_spell(spell, mode);
9701 case REALM_TRUMP: return do_trump_spell(spell, mode);
9702 case REALM_ARCANE: return do_arcane_spell(spell, mode);
9703 case REALM_CRAFT: return do_craft_spell(spell, mode);
9704 case REALM_DAEMON: return do_daemon_spell(spell, mode);
9705 case REALM_CRUSADE: return do_crusade_spell(spell, mode);
9706 case REALM_MUSIC: return do_music_spell(spell, mode);
9707 case REALM_HISSATSU: return do_hissatsu_spell(spell, mode);
9708 case REALM_HEX: return do_hex_spell(spell, mode);