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(int 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(int 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 if (p_ptr->muta1 || p_ptr->muta2 || p_ptr->muta3)
745 msg_print(_("全ての突然変異が治った。", "You are cured of all mutations."));
746 p_ptr->muta1 = p_ptr->muta2 = p_ptr->muta3 = 0;
747 p_ptr->update |= PU_BONUS;
753 msg_print(_("《太陽》だ。", "It's the Sun."));
754 chg_virtue(V_KNOWLEDGE, 1);
755 chg_virtue(V_ENLIGHTEN, 1);
760 msg_print(_("《世界》だ。", "It's the World."));
761 if (p_ptr->exp < PY_MAX_EXP)
763 s32b ee = (p_ptr->exp / 25) + 1;
764 if (ee > 5000) ee = 5000;
765 msg_print(_("更に経験を積んだような気がする。", "You feel more experienced."));
772 * @brief カオス魔法「流星群」の処理としてプレイヤーを中心に隕石落下処理を10+1d10回繰り返す。
773 * / Drop 10+1d10 meteor ball at random places near the player
778 static void cast_meteor(int dam, int rad)
781 int b = 10 + randint1(10);
783 for (i = 0; i < b; i++)
785 POSITION y = 0, x = 0;
788 for (count = 0; count <= 20; count++)
792 x = p_ptr->x - 8 + randint0(17);
793 y = p_ptr->y - 8 + randint0(17);
795 dx = (p_ptr->x > x) ? (p_ptr->x - x) : (x - p_ptr->x);
796 dy = (p_ptr->y > y) ? (p_ptr->y - y) : (y - p_ptr->y);
798 /* Approximate distance */
799 d = (dy > dx) ? (dy + (dx >> 1)) : (dx + (dy >> 1));
801 if (d >= 9) continue;
803 if (!in_bounds(y, x) || !projectable(p_ptr->y, p_ptr->x, y, x)
804 || !cave_have_flag_bold(y, x, FF_PROJECT)) continue;
810 if (count > 20) continue;
812 project(0, rad, y, x, dam, GF_METEOR, PROJECT_KILL | PROJECT_JUMP | PROJECT_ITEM, -1);
818 * @brief 破邪魔法「神の怒り」の処理としてターゲットを指定した後分解のボールを最大20回発生させる。
821 * @return ターゲットを指定し、実行したならばTRUEを返す。
823 static bool cast_wrath_of_the_god(int dam, int rad)
828 int b = 10 + randint1(10);
830 if (!get_aim_dir(&dir)) return FALSE;
832 /* Use the given direction */
833 tx = p_ptr->x + 99 * ddx[dir];
834 ty = p_ptr->y + 99 * ddy[dir];
836 /* Hack -- Use an actual "target" */
837 if ((dir == 5) && target_okay())
848 /* Hack -- Stop at the target */
849 if ((y == ty) && (x == tx)) break;
853 mmove2(&ny, &nx, p_ptr->y, p_ptr->x, ty, tx);
855 /* Stop at maximum range */
856 if (MAX_RANGE <= distance(p_ptr->y, p_ptr->x, ny, nx)) break;
858 /* Stopped by walls/doors */
859 if (!cave_have_flag_bold(ny, nx, FF_PROJECT)) break;
861 /* Stopped by monsters */
862 if ((dir != 5) && cave[ny][nx].m_idx != 0) break;
864 /* Save the new location */
871 for (i = 0; i < b; i++)
873 int count = 20, d = 0;
879 x = tx - 5 + randint0(11);
880 y = ty - 5 + randint0(11);
882 dx = (tx > x) ? (tx - x) : (x - tx);
883 dy = (ty > y) ? (ty - y) : (y - ty);
885 /* Approximate distance */
886 d = (dy > dx) ? (dy + (dx >> 1)) : (dx + (dy >> 1));
887 /* Within the radius */
891 if (count < 0) continue;
893 /* Cannot penetrate perm walls */
894 if (!in_bounds(y,x) ||
895 cave_stop_disintegration(y,x) ||
896 !in_disintegration_range(ty, tx, y, x))
899 project(0, rad, y, x, dam, GF_DISINTEGRATE, PROJECT_JUMP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL, -1);
906 * @brief 悪魔領域のグレーターデーモン召喚に利用可能な死体かどうかを返す。 / An "item_tester_hook" for offer
907 * @param o_ptr オブジェクト構造体の参照ポインタ
908 * @return 生贄に使用可能な死体ならばTRUEを返す。
910 static bool item_tester_offer(object_type *o_ptr)
912 /* Flasks of oil are okay */
913 if (o_ptr->tval != TV_CORPSE) return (FALSE);
915 if (o_ptr->sval != SV_CORPSE) return (FALSE);
917 if (my_strchr("pht", r_info[o_ptr->pval].d_char)) return (TRUE);
919 /* Assume not okay */
924 * @brief 悪魔領域のグレーターデーモン召喚を処理する / Daemon spell Summon Greater Demon
925 * @return 処理を実行したならばTRUEを返す。
927 static bool cast_summon_greater_demon(void)
929 PLAYER_LEVEL plev = p_ptr->lev;
935 item_tester_hook = item_tester_offer;
936 q = _("どの死体を捧げますか? ", "Sacrifice which corpse? ");
937 s = _("捧げられる死体を持っていない。", "You have nothing to scrifice.");
938 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return FALSE;
940 /* Get the item (in the pack) */
943 o_ptr = &inventory[item];
946 /* Get the item (on the floor) */
949 o_ptr = &o_list[0 - item];
952 summon_lev = plev * 2 / 3 + r_info[o_ptr->pval].level;
954 if (summon_specific(-1, p_ptr->y, p_ptr->x, summon_lev, SUMMON_HI_DEMON, (PM_ALLOW_GROUP | PM_FORCE_PET)))
956 msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));
957 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
959 /* Decrease the item (from the pack) */
962 inven_item_increase(item, -1);
963 inven_item_describe(item);
964 inven_item_optimize(item);
967 /* Decrease the item (from the floor) */
970 floor_item_increase(0 - item, -1);
971 floor_item_describe(0 - item);
972 floor_item_optimize(0 - item);
977 msg_print(_("悪魔は現れなかった。", "No Greater Demon arrive."));
984 * @brief 歌の開始を処理する / Start singing if the player is a Bard
985 * @param spell 領域魔法としてのID
986 * @param song 魔法効果のID
989 static void start_singing(MAGIC_NUM2 spell, MAGIC_NUM1 song)
991 /* Remember the song index */
992 p_ptr->magic_num1[0] = song;
994 /* Remember the index of the spell which activated the song */
995 p_ptr->magic_num2[0] = spell;
998 /* Now the player is singing */
999 set_action(ACTION_SING);
1002 /* Recalculate bonuses */
1003 p_ptr->update |= (PU_BONUS);
1005 /* Redraw status bar */
1006 p_ptr->redraw |= (PR_STATUS);
1010 * @brief 歌の停止を処理する / Stop singing if the player is a Bard
1013 void stop_singing(void)
1015 if (p_ptr->pclass != CLASS_BARD) return;
1017 /* Are there interupted song? */
1018 if (p_ptr->magic_num1[1])
1020 /* Forget interupted song */
1021 p_ptr->magic_num1[1] = 0;
1025 /* The player is singing? */
1026 if (!p_ptr->magic_num1[0]) return;
1028 /* Hack -- if called from set_action(), avoid recursive loop */
1029 if (p_ptr->action == ACTION_SING) set_action(ACTION_NONE);
1031 /* Message text of each song or etc. */
1032 do_spell(REALM_MUSIC, p_ptr->magic_num2[0], SPELL_STOP);
1034 p_ptr->magic_num1[0] = MUSIC_NONE;
1035 p_ptr->magic_num2[0] = 0;
1037 /* Recalculate bonuses */
1038 p_ptr->update |= (PU_BONUS);
1040 /* Redraw status bar */
1041 p_ptr->redraw |= (PR_STATUS);
1046 * @brief 生命領域魔法の各処理を行う
1048 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
1049 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
1051 static cptr do_life_spell(int spell, int mode)
1053 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
1054 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
1055 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
1056 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
1059 int plev = p_ptr->lev;
1064 if (name) return _("軽傷の治癒", "Cure Light Wounds");
1065 if (desc) return _("怪我と体力を少し回復させる。", "Heals cut and HP a little.");
1070 if (info) return info_heal(dice, sides, 0);
1074 hp_player(damroll(dice, sides));
1075 set_cut(p_ptr->cut - 10);
1081 if (name) return _("祝福", "Bless");
1082 if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
1086 if (info) return info_duration(base, base);
1090 set_blessed(randint1(base) + base, FALSE);
1096 if (name) return _("軽傷", "Cause Light Wounds");
1097 if (desc) return _("1体のモンスターに小ダメージを与える。抵抗されると無効。", "Wounds a monster a little unless resisted.");
1099 int dice = 3 + (plev - 1) / 5;
1102 if (info) return info_damage(dice, sides, 0);
1106 if (!get_aim_dir(&dir)) return NULL;
1107 fire_ball_hide(GF_WOUNDS, dir, damroll(dice, sides), 0);
1113 if (name) return _("光の召喚", "Call Light");
1114 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
1117 int sides = plev / 2;
1118 int rad = plev / 10 + 1;
1120 if (info) return info_damage(dice, sides, 0);
1124 lite_area(damroll(dice, sides), rad);
1130 if (name) return _("罠 & 隠し扉感知", "Detect Doors & Traps");
1131 if (desc) return _("近くの全ての罠と扉と階段を感知する。", "Detects traps, doors, and stairs in your vicinity.");
1133 int rad = DETECT_RAD_DEFAULT;
1135 if (info) return info_radius(rad);
1139 detect_traps(rad, TRUE);
1147 if (name) return _("重傷の治癒", "Cure Medium Wounds");
1148 if (desc) return _("怪我と体力を中程度回復させる。", "Heals cut and HP more.");
1153 if (info) return info_heal(dice, sides, 0);
1157 hp_player(damroll(dice, sides));
1158 set_cut((p_ptr->cut / 2) - 20);
1164 if (name) return _("解毒", "Cure Poison");
1165 if (desc) return _("体内の毒を取り除く。", "Cure poison status.");
1175 if (name) return _("空腹充足", "Satisfy Hunger");
1176 if (desc) return _("満腹にする。", "Satisfies hunger.");
1180 set_food(PY_FOOD_MAX - 1);
1186 if (name) return _("解呪", "Remove Curse");
1187 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
1193 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
1200 if (name) return _("重傷", "Cause Medium Wounds");
1201 if (desc) return _("1体のモンスターに中ダメージを与える。抵抗されると無効。", "Wounds a monster unless resisted.");
1203 int sides = 8 + (plev - 5) / 4;
1206 if (info) return info_damage(dice, sides, 0);
1210 if (!get_aim_dir(&dir)) return NULL;
1211 fire_ball_hide(GF_WOUNDS, dir, damroll(dice, sides), 0);
1217 if (name) return _("致命傷の治癒", "Cure Critical Wounds");
1218 if (desc) return _("体力を大幅に回復させ、負傷と朦朧状態も全快する。", "Heals cut, stun and HP greatly.");
1223 if (info) return info_heal(dice, sides, 0);
1227 hp_player(damroll(dice, sides));
1235 if (name) return _("耐熱耐寒", "Resist Heat and Cold");
1236 if (desc) return _("一定時間、火炎と冷気に対する耐性を得る。装備による耐性に累積する。",
1237 "Gives resistance to fire and cold. These resistances can be added to which from equipment for more powerful resistances.");
1242 if (info) return info_duration(base, base);
1246 set_oppose_cold(randint1(base) + base, FALSE);
1247 set_oppose_fire(randint1(base) + base, FALSE);
1253 if (name) return _("周辺感知", "Sense Surroundings");
1254 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
1257 int rad = DETECT_RAD_MAP;
1259 if (info) return info_radius(rad);
1269 if (name) return _("パニック・アンデッド", "Turn Undead");
1270 if (desc) return _("視界内のアンデッドを恐怖させる。抵抗されると無効。", "Attempts to scare undead monsters in sight.");
1281 if (name) return _("体力回復", "Healing");
1282 if (desc) return _("極めて強力な回復呪文で、負傷と朦朧状態も全快する。", "Much powerful healing magic, and heals cut and stun completely.");
1287 if (info) return info_heal(0, 0, heal);
1299 if (name) return _("結界の紋章", "Glyph of Warding");
1300 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。",
1301 "Sets a glyph on the floor beneath you. Monsters cannot attack you if you are on a glyph, but can try to break glyph.");
1312 if (name) return _("*解呪*", "Dispel Curse");
1313 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
1318 if (remove_all_curse())
1320 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
1327 if (name) return _("鑑識", "Perception");
1328 if (desc) return _("アイテムを識別する。", "Identifies an item.");
1333 if (!ident_spell(FALSE)) return NULL;
1339 if (name) return _("アンデッド退散", "Dispel Undead");
1340 if (desc) return _("視界内の全てのアンデッドにダメージを与える。", "Damages all undead monsters in sight.");
1344 int sides = plev * 5;
1346 if (info) return info_damage(dice, sides, 0);
1350 dispel_undead(damroll(dice, sides));
1356 if (name) return _("凪の刻", "Day of the Dove");
1357 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
1360 int power = plev * 2;
1362 if (info) return info_power(power);
1366 charm_monsters(power);
1372 if (name) return _("致命傷", "Cause Critical Wounds");
1373 if (desc) return _("1体のモンスターに大ダメージを与える。抵抗されると無効。", "Wounds a monster critically unless resisted.");
1376 int dice = 5 + (plev - 5) / 3;
1379 if (info) return info_damage(dice, sides, 0);
1383 if (!get_aim_dir(&dir)) return NULL;
1384 fire_ball_hide(GF_WOUNDS, dir, damroll(dice, sides), 0);
1390 if (name) return _("帰還の詔", "Word of Recall");
1391 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。", "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
1397 if (info) return info_delay(base, sides);
1401 if (!word_of_recall()) return NULL;
1407 if (name) return _("真実の祭壇", "Alter Reality");
1408 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
1414 if (info) return info_delay(base, sides);
1424 if (name) return _("真・結界", "Warding True");
1425 if (desc) return _("自分のいる床と周囲8マスの床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。", "Creates glyphs in all adjacent squares and under you.");
1430 if (info) return info_radius(rad);
1441 if (name) return _("不毛化", "Sterilization");
1442 if (desc) return _("この階の増殖するモンスターが増殖できなくなる。", "Prevents any breeders on current level from breeding.");
1447 num_repro += MAX_REPRO;
1453 if (name) return _("全感知", "Detection");
1454 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。", "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
1457 int rad = DETECT_RAD_DEFAULT;
1459 if (info) return info_radius(rad);
1469 if (name) return _("アンデッド消滅", "Annihilate Undead");
1470 if (desc) return _("自分の周囲にいるアンデッドを現在の階から消し去る。抵抗されると無効。",
1471 "Eliminates all nearby undead monsters, exhausting you. Powerful or unique monsters may be able to resist.");
1474 int power = plev + 50;
1476 if (info) return info_power(power);
1480 mass_genocide_undead(power, TRUE);
1486 if (name) return _("千里眼", "Clairvoyance");
1487 if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。", "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");
1498 if (name) return _("全復活", "Restoration");
1499 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
1516 if (name) return _("*体力回復*", "Healing True");
1517 if (desc) return _("最強の治癒の魔法で、負傷と朦朧状態も全快する。", "The greatest healing magic. Heals all HP, cut and stun.");
1522 if (info) return info_heal(0, 0, heal);
1534 if (name) return _("聖なるビジョン", "Holy Vision");
1535 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
1540 if (!identify_fully(FALSE)) return NULL;
1546 if (name) return _("究極の耐性", "Ultimate Resistance");
1547 if (desc) return _("一定時間、あらゆる耐性を付け、ACと魔法防御能力を上昇させる。", "Gives ultimate resistance, bonus to AC and speed.");
1550 TIME_EFFECT base = (TIME_EFFECT)plev / 2;
1552 if (info) return info_duration(base, base);
1556 TIME_EFFECT v = randint1(base) + base;
1558 set_oppose_acid(v, FALSE);
1559 set_oppose_elec(v, FALSE);
1560 set_oppose_fire(v, FALSE);
1561 set_oppose_cold(v, FALSE);
1562 set_oppose_pois(v, FALSE);
1563 set_ultimate_res(v, FALSE);
1573 * @brief 仙術領域魔法の各処理を行う
1575 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
1576 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
1578 static cptr do_sorcery_spell(int spell, int mode)
1580 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
1581 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
1582 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
1583 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
1586 int plev = p_ptr->lev;
1591 if (name) return _("モンスター感知", "Detect Monsters");
1592 if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
1595 int rad = DETECT_RAD_DEFAULT;
1597 if (info) return info_radius(rad);
1601 detect_monsters_normal(rad);
1607 if (name) return _("ショート・テレポート", "Phase Door");
1608 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");
1611 POSITION range = 10;
1613 if (info) return info_range(range);
1617 teleport_player(range, 0L);
1623 if (name) return _("罠と扉感知", "Detect Doors and Traps");
1624 if (desc) return _("近くの全ての扉と罠を感知する。", "Detects traps, doors, and stairs in your vicinity.");
1627 int rad = DETECT_RAD_DEFAULT;
1629 if (info) return info_radius(rad);
1633 detect_traps(rad, TRUE);
1641 if (name) return _("ライト・エリア", "Light Area");
1642 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
1646 int sides = plev / 2;
1647 int rad = plev / 10 + 1;
1649 if (info) return info_damage(dice, sides, 0);
1653 lite_area(damroll(dice, sides), rad);
1659 if (name) return _("パニック・モンスター", "Confuse Monster");
1660 if (desc) return _("モンスター1体を混乱させる。抵抗されると無効。", "Attempts to confuse a monster.");
1663 int power = (plev * 3) / 2;
1665 if (info) return info_power(power);
1669 if (!get_aim_dir(&dir)) return NULL;
1671 confuse_monster(dir, power);
1677 if (name) return _("テレポート", "Teleport");
1678 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
1681 POSITION range = plev * 5;
1683 if (info) return info_range(range);
1687 teleport_player(range, 0L);
1693 if (name) return _("スリープ・モンスター", "Sleep Monster");
1694 if (desc) return _("モンスター1体を眠らせる。抵抗されると無効。", "Attempts to sleep a monster.");
1699 if (info) return info_power(power);
1703 if (!get_aim_dir(&dir)) return NULL;
1705 sleep_monster(dir, plev);
1711 if (name) return _("魔力充填", "Recharging");
1712 if (desc) return _("杖/魔法棒の充填回数を増やすか、充填中のロッドの充填時間を減らす。", "Recharges staffs, wands or rods.");
1715 int power = plev * 4;
1717 if (info) return info_power(power);
1721 if (!recharge(power)) return NULL;
1727 if (name) return _("魔法の地図", "Magic Mapping");
1728 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
1731 int rad = DETECT_RAD_MAP;
1733 if (info) return info_radius(rad);
1743 if (name) return _("鑑定", "Identify");
1744 if (desc) return _("アイテムを識別する。", "Identifies an item.");
1749 if (!ident_spell(FALSE)) return NULL;
1755 if (name) return _("スロウ・モンスター", "Slow Monster");
1756 if (desc) return _("モンスター1体を減速さる。抵抗されると無効。", "Attempts to slow a monster.");
1761 if (info) return info_power(power);
1765 if (!get_aim_dir(&dir)) return NULL;
1767 slow_monster(dir, plev);
1773 if (name) return _("周辺スリープ", "Mass Sleep");
1774 if (desc) return _("視界内の全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep all monsters in sight.");
1779 if (info) return info_power(power);
1783 sleep_monsters(plev);
1789 if (name) return _("テレポート・モンスター", "Teleport Away");
1790 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
1795 if (info) return info_power(power);
1799 if (!get_aim_dir(&dir)) return NULL;
1801 fire_beam(GF_AWAY_ALL, dir, power);
1807 if (name) return _("スピード", "Haste Self");
1808 if (desc) return _("一定時間、加速する。", "Hastes you for a while.");
1812 int sides = 20 + plev;
1814 if (info) return info_duration(base, sides);
1818 set_fast(randint1(sides) + base, FALSE);
1824 if (name) return _("真・感知", "Detection True");
1825 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
1826 "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
1829 int rad = DETECT_RAD_DEFAULT;
1831 if (info) return info_radius(rad);
1841 if (name) return _("真・鑑定", "Identify True");
1842 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
1847 if (!identify_fully(FALSE)) return NULL;
1853 if (name) return _("物体と財宝感知", "Detect items and Treasure");
1854 if (desc) return _("近くの全てのアイテムと財宝を感知する。", "Detects all treasures and items in your vicinity.");
1857 int rad = DETECT_RAD_DEFAULT;
1859 if (info) return info_radius(rad);
1863 detect_objects_normal(rad);
1864 detect_treasure(rad);
1865 detect_objects_gold(rad);
1871 if (name) return _("チャーム・モンスター", "Charm Monster");
1872 if (desc) return _("モンスター1体を魅了する。抵抗されると無効。", "Attempts to charm a monster.");
1877 if (info) return info_power(power);
1881 if (!get_aim_dir(&dir)) return NULL;
1883 charm_monster(dir, power);
1889 if (name) return _("精神感知", "Sense Minds");
1890 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
1896 if (info) return info_duration(base, sides);
1900 set_tim_esp(randint1(sides) + base, FALSE);
1906 if (name) return _("街移動", "Teleport to town");
1907 if (desc) return _("街へ移動する。地上にいるときしか使えない。", "Teleport to a town which you choose in a moment. Can only be used outdoors.");
1912 if (!tele_town()) return NULL;
1918 if (name) return _("自己分析", "Self Knowledge");
1919 if (desc) return _("現在の自分の状態を完全に知る。",
1920 "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");
1931 if (name) return _("テレポート・レベル", "Teleport Level");
1932 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");
1937 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
1944 if (name) return _("帰還の呪文", "Word of Recall");
1945 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
1946 "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
1952 if (info) return info_delay(base, sides);
1956 if (!word_of_recall()) return NULL;
1962 if (name) return _("次元の扉", "Dimension Door");
1963 if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleport to given location.");
1966 POSITION range = plev / 2 + 10;
1968 if (info) return info_range(range);
1972 msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));
1973 if (!dimension_door()) return NULL;
1979 if (name) return _("調査", "Probing");
1980 if (desc) return _("モンスターの属性、残り体力、最大体力、スピード、正体を知る。",
1981 "Proves all monsters' alignment, HP, speed and their true character.");
1992 if (name) return _("爆発のルーン", "Explosive Rune");
1993 if (desc) return _("自分のいる床の上に、モンスターが通ると爆発してダメージを与えるルーンを描く。",
1994 "Sets a glyph under you. The glyph will explode when a monster moves on it.");
2001 if (info) return info_damage(dice, sides, base);
2011 if (name) return _("念動力", "Telekinesis");
2012 if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");
2015 int weight = plev * 15;
2017 if (info) return info_weight(weight);
2021 if (!get_aim_dir(&dir)) return NULL;
2023 fetch(dir, weight, FALSE);
2029 if (name) return _("千里眼", "Clairvoyance");
2030 if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。さらに、一定時間テレパシー能力を得る。",
2031 "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");
2037 if (info) return info_duration(base, sides);
2041 chg_virtue(V_KNOWLEDGE, 1);
2042 chg_virtue(V_ENLIGHTEN, 1);
2046 if (!p_ptr->telepathy)
2048 set_tim_esp(randint1(sides) + base, FALSE);
2055 if (name) return _("魅了の視線", "Charm monsters");
2056 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
2059 int power = plev * 2;
2061 if (info) return info_power(power);
2065 charm_monsters(power);
2071 if (name) return _("錬金術", "Alchemy");
2072 if (desc) return _("アイテム1つをお金に変える。", "Turns an item into 1/3 of its value in gold.");
2077 if (!alchemy()) return NULL;
2083 if (name) return _("怪物追放", "Banishment");
2084 if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");
2087 int power = plev * 4;
2089 if (info) return info_power(power);
2093 banish_monsters(power);
2099 if (name) return _("無傷の球", "Globe of Invulnerability");
2100 if (desc) return _("一定時間、ダメージを受けなくなるバリアを張る。切れた瞬間に少しターンを消費するので注意。",
2101 "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks or duration time is exceeded.");
2106 if (info) return info_duration(base, base);
2110 set_invuln(randint1(base) + base, FALSE);
2121 * @brief 自然領域魔法の各処理を行う
2123 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
2124 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
2126 static cptr do_nature_spell(int spell, int mode)
2128 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
2129 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
2130 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
2131 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
2133 static const char s_dam[] = _("損傷:", "dam ");
2134 static const char s_rng[] = _("射程", "rng ");
2137 int plev = p_ptr->lev;
2142 if (name) return _("モンスター感知", "Detect Creatures");
2143 if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
2146 int rad = DETECT_RAD_DEFAULT;
2148 if (info) return info_radius(rad);
2152 detect_monsters_normal(rad);
2158 if (name) return _("稲妻", "Lightning");
2159 if (desc) return _("電撃の短いビームを放つ。", "Fires a short beam of lightning.");
2162 int dice = 3 + (plev - 1) / 5;
2164 POSITION range = plev / 6 + 2;
2166 if (info) return format("%s%dd%d %s%d", s_dam, dice, sides, s_rng, range);
2170 project_length = range;
2172 if (!get_aim_dir(&dir)) return NULL;
2174 fire_beam(GF_ELEC, dir, damroll(dice, sides));
2180 if (name) return _("罠と扉感知", "Detect Doors and Traps");
2181 if (desc) return _("近くの全ての罠と扉を感知する。", "Detects traps, doors, and stairs in your vicinity.");
2184 int rad = DETECT_RAD_DEFAULT;
2186 if (info) return info_radius(rad);
2190 detect_traps(rad, TRUE);
2198 if (name) return _("食糧生成", "Produce Food");
2199 if (desc) return _("食料を一つ作り出す。", "Produces a Ration of Food.");
2204 object_type forge, *q_ptr = &forge;
2205 msg_print(_("食料を生成した。", "A food ration is produced."));
2207 /* Create the food ration */
2208 object_prep(q_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION));
2210 /* Drop the object from heaven */
2211 drop_near(q_ptr, -1, p_ptr->y, p_ptr->x);
2217 if (name) return _("日の光", "Daylight");
2218 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
2222 int sides = plev / 2;
2223 int rad = (plev / 10) + 1;
2225 if (info) return info_damage(dice, sides, 0);
2229 lite_area(damroll(dice, sides), rad);
2231 if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)
2233 msg_print(_("日の光があなたの肉体を焦がした!", "The daylight scorches your flesh!"));
2234 take_hit(DAMAGE_NOESCAPE, damroll(2, 2), _("日の光", "daylight"), -1);
2241 if (name) return _("動物習し", "Animal Taming");
2242 if (desc) return _("動物1体を魅了する。抵抗されると無効。", "Attempts to charm an animal.");
2247 if (info) return info_power(power);
2251 if (!get_aim_dir(&dir)) return NULL;
2253 charm_animal(dir, power);
2259 if (name) return _("環境への耐性", "Resist Environment");
2260 if (desc) return _("一定時間、冷気、炎、電撃に対する耐性を得る。装備による耐性に累積する。",
2261 "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");
2266 if (info) return info_duration(base, base);
2270 set_oppose_cold(randint1(base) + base, FALSE);
2271 set_oppose_fire(randint1(base) + base, FALSE);
2272 set_oppose_elec(randint1(base) + base, FALSE);
2278 if (name) return _("傷と毒治療", "Cure Wounds & Poison");
2279 if (desc) return _("怪我を全快させ、毒を体から完全に取り除き、体力を少し回復させる。", "Heals all cut and poison status. Heals HP a little.");
2285 if (info) return info_heal(dice, sides, 0);
2289 hp_player(damroll(dice, sides));
2297 if (name) return _("岩石溶解", "Stone to Mud");
2298 if (desc) return _("壁を溶かして床にする。", "Turns one rock square to mud.");
2305 if (info) return info_damage(dice, sides, base);
2309 if (!get_aim_dir(&dir)) return NULL;
2311 wall_to_mud(dir, 20 + randint1(30));
2317 if (name) return _("アイス・ボルト", "Frost Bolt");
2318 if (desc) return _("冷気のボルトもしくはビームを放つ。", "Fires a bolt or beam of cold.");
2321 int dice = 3 + (plev - 5) / 4;
2324 if (info) return info_damage(dice, sides, 0);
2328 if (!get_aim_dir(&dir)) return NULL;
2329 fire_bolt_or_beam(beam_chance() - 10, GF_COLD, dir, damroll(dice, sides));
2335 if (name) return _("自然の覚醒", "Nature Awareness");
2336 if (desc) return _("周辺の地形を感知し、近くの罠、扉、階段、全てのモンスターを感知する。",
2337 "Maps nearby area. Detects all monsters, traps, doors and stairs.");
2340 int rad1 = DETECT_RAD_MAP;
2341 int rad2 = DETECT_RAD_DEFAULT;
2343 if (info) return info_radius(MAX(rad1, rad2));
2348 detect_traps(rad2, TRUE);
2350 detect_stairs(rad2);
2351 detect_monsters_normal(rad2);
2357 if (name) return _("ファイア・ボルト", "Fire Bolt");
2358 if (desc) return _("火炎のボルトもしくはビームを放つ。", "Fires a bolt or beam of fire.");
2361 int dice = 5 + (plev - 5) / 4;
2364 if (info) return info_damage(dice, sides, 0);
2368 if (!get_aim_dir(&dir)) return NULL;
2369 fire_bolt_or_beam(beam_chance() - 10, GF_FIRE, dir, damroll(dice, sides));
2375 if (name) return _("太陽光線", "Ray of Sunlight");
2376 if (desc) return _("光線を放つ。光りを嫌うモンスターに効果がある。", "Fires a beam of light which damages to light-sensitive monsters.");
2382 if (info) return info_damage(dice, sides, 0);
2386 if (!get_aim_dir(&dir)) return NULL;
2387 msg_print(_("太陽光線が現れた。", "A line of sunlight appears."));
2388 lite_line(dir, damroll(6, 8));
2394 if (name) return _("足かせ", "Entangle");
2395 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
2400 if (info) return info_power(power);
2404 slow_monsters(plev);
2410 if (name) return _("動物召喚", "Summon Animal");
2411 if (desc) return _("動物を1体召喚する。", "Summons an animal.");
2416 if (!(summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_ANIMAL_RANGER, (PM_ALLOW_GROUP | PM_FORCE_PET))))
2418 msg_print(_("動物は現れなかった。", "No animals arrive."));
2426 if (name) return _("薬草治療", "Herbal Healing");
2427 if (desc) return _("体力を大幅に回復させ、負傷、朦朧状態、毒から全快する。", "Heals HP greatly. And heals cut, stun and poison completely.");
2432 if (info) return info_heal(0, 0, heal);
2445 if (name) return _("階段生成", "Stair Building");
2446 if (desc) return _("自分のいる位置に階段を作る。", "Creates a stair which goes down or up.");
2457 if (name) return _("肌石化", "Stone Skin");
2458 if (desc) return _("一定時間、ACを上昇させる。", "Gives bonus to AC for a while.");
2464 if (info) return info_duration(base, sides);
2468 set_shield(randint1(sides) + base, FALSE);
2474 if (name) return _("真・耐性", "Resistance True");
2475 if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
2476 "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.");
2481 if (info) return info_duration(base, base);
2485 set_oppose_acid(randint1(base) + base, FALSE);
2486 set_oppose_elec(randint1(base) + base, FALSE);
2487 set_oppose_fire(randint1(base) + base, FALSE);
2488 set_oppose_cold(randint1(base) + base, FALSE);
2489 set_oppose_pois(randint1(base) + base, FALSE);
2495 if (name) return _("森林創造", "Forest Creation");
2496 if (desc) return _("周囲に木を作り出す。", "Creates trees in all adjacent squares.");
2507 if (name) return _("動物友和", "Animal Friendship");
2508 if (desc) return _("視界内の全ての動物を魅了する。抵抗されると無効。", "Attempts to charm all animals in sight.");
2511 int power = plev * 2;
2513 if (info) return info_power(power);
2517 charm_animals(power);
2523 if (name) return _("試金石", "Stone Tell");
2524 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
2529 if (!identify_fully(FALSE)) return NULL;
2535 if (name) return _("石の壁", "Wall of Stone");
2536 if (desc) return _("自分の周囲に花崗岩の壁を作る。", "Creates granite walls in all adjacent squares.");
2547 if (name) return _("腐食防止", "Protect from Corrosion");
2548 if (desc) return _("アイテムを酸で傷つかないよう加工する。", "Makes an equipment acid-proof.");
2553 if (!rustproof()) return NULL;
2559 if (name) return _("地震", "Earthquake");
2560 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
2561 "Shakes dungeon structure, and results in random swapping of floors and walls.");
2566 if (info) return info_radius(rad);
2570 earthquake(p_ptr->y, p_ptr->x, rad);
2576 if (name) return _("カマイタチ", "Cyclone");
2577 if (desc) return _("全方向に向かって攻撃する。", "Attacks all adjacent monsters.");
2584 monster_type *m_ptr;
2586 for (dir = 0; dir < 8; dir++)
2588 y = p_ptr->y + ddy_ddd[dir];
2589 x = p_ptr->x + ddx_ddd[dir];
2590 c_ptr = &cave[y][x];
2592 /* Get the monster */
2593 m_ptr = &m_list[c_ptr->m_idx];
2595 /* Hack -- attack monsters */
2596 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
2604 if (name) return _("ブリザード", "Blizzard");
2605 if (desc) return _("巨大な冷気の球を放つ。", "Fires a huge ball of cold.");
2608 int dam = 70 + plev * 3 / 2;
2609 int rad = plev / 12 + 1;
2611 if (info) return info_damage(0, 0, dam);
2615 if (!get_aim_dir(&dir)) return NULL;
2617 fire_ball(GF_COLD, dir, dam, rad);
2623 if (name) return _("稲妻嵐", "Lightning Storm");
2624 if (desc) return _("巨大な電撃の球を放つ。", "Fires a huge electric ball.");
2627 int dam = 90 + plev * 3 / 2;
2628 int rad = plev / 12 + 1;
2630 if (info) return info_damage(0, 0, dam);
2634 if (!get_aim_dir(&dir)) return NULL;
2635 fire_ball(GF_ELEC, dir, dam, rad);
2642 if (name) return _("渦潮", "Whirlpool");
2643 if (desc) return _("巨大な水の球を放つ。", "Fires a huge ball of water.");
2646 int dam = 100 + plev * 3 / 2;
2647 int rad = plev / 12 + 1;
2649 if (info) return info_damage(0, 0, dam);
2653 if (!get_aim_dir(&dir)) return NULL;
2654 fire_ball(GF_WATER, dir, dam, rad);
2660 if (name) return _("陽光召喚", "Call Sunlight");
2661 if (desc) return _("自分を中心とした光の球を発生させる。さらに、その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。",
2662 "Generates ball of light centered on you. Maps and lights whole dungeon level. Knows all objects location.");
2668 if (info) return info_damage(0, 0, dam/2);
2672 fire_ball(GF_LITE, 0, dam, rad);
2673 chg_virtue(V_KNOWLEDGE, 1);
2674 chg_virtue(V_ENLIGHTEN, 1);
2677 if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)
2679 msg_print(_("日光があなたの肉体を焦がした!", "The sunlight scorches your flesh!"));
2680 take_hit(DAMAGE_NOESCAPE, 50, _("日光", "sunlight"), -1);
2687 if (name) return _("精霊の刃", "Elemental Branding");
2688 if (desc) return _("武器に炎か冷気の属性をつける。", "Makes current weapon fire or frost branded.");
2693 brand_weapon(randint0(2));
2699 if (name) return _("自然の脅威", "Nature's Wrath");
2700 if (desc) return _("近くの全てのモンスターにダメージを与え、地震を起こし、自分を中心とした分解の球を発生させる。",
2701 "Damages all monsters in sight. Makes quake. Generates disintegration ball centered on you.");
2704 int d_dam = 4 * plev;
2705 int b_dam = (100 + plev) * 2;
2706 int b_rad = 1 + plev / 12;
2707 int q_rad = 20 + plev / 2;
2709 if (info) return format("%s%d+%d", s_dam, d_dam, b_dam/2);
2713 dispel_monsters(d_dam);
2714 earthquake(p_ptr->y, p_ptr->x, q_rad);
2715 project(0, b_rad, p_ptr->y, p_ptr->x, b_dam, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM, -1);
2726 * @brief カオス領域魔法の各処理を行う
2728 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
2729 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
2731 static cptr do_chaos_spell(int spell, int mode)
2733 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
2734 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
2735 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
2736 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
2738 static const char s_dam[] = _("損傷:", "dam ");
2739 static const char s_random[] = _("ランダム", "random");
2742 int plev = p_ptr->lev;
2747 if (name) return _("マジック・ミサイル", "Magic Missile");
2748 if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");
2751 int dice = 3 + ((plev - 1) / 5);
2754 if (info) return info_damage(dice, sides, 0);
2758 if (!get_aim_dir(&dir)) return NULL;
2760 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));
2766 if (name) return _("トラップ/ドア破壊", "Trap / Door Destruction");
2767 if (desc) return _("隣接する罠と扉を破壊する。", "Destroys all traps in adjacent squares.");
2772 if (info) return info_radius(rad);
2776 destroy_doors_touch();
2782 if (name) return _("閃光", "Flash of Light");
2783 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
2787 int sides = plev / 2;
2788 int rad = (plev / 10) + 1;
2790 if (info) return info_damage(dice, sides, 0);
2794 lite_area(damroll(dice, sides), rad);
2800 if (name) return _("混乱の手", "Touch of Confusion");
2801 if (desc) return _("相手を混乱させる攻撃をできるようにする。", "Attempts to confuse the next monster that you hit.");
2806 if (!(p_ptr->special_attack & ATTACK_CONFUSE))
2808 msg_print(_("あなたの手は光り始めた。", "Your hands start glowing."));
2809 p_ptr->special_attack |= ATTACK_CONFUSE;
2810 p_ptr->redraw |= (PR_STATUS);
2817 if (name) return _("魔力炸裂", "Mana Burst");
2818 if (desc) return _("魔法の球を放つ。", "Fires a ball of magic.");
2823 int rad = (plev < 30) ? 2 : 3;
2826 if (p_ptr->pclass == CLASS_MAGE ||
2827 p_ptr->pclass == CLASS_HIGH_MAGE ||
2828 p_ptr->pclass == CLASS_SORCERER)
2829 base = plev + plev / 2;
2831 base = plev + plev / 4;
2834 if (info) return info_damage(dice, sides, base);
2838 if (!get_aim_dir(&dir)) return NULL;
2840 fire_ball(GF_MISSILE, dir, damroll(dice, sides) + base, rad);
2843 * Shouldn't actually use GF_MANA, as
2844 * it will destroy all items on the
2852 if (name) return _("ファイア・ボルト", "Fire Bolt");
2853 if (desc) return _("炎のボルトもしくはビームを放つ。", "Fires a bolt or beam of fire.");
2856 int dice = 8 + (plev - 5) / 4;
2859 if (info) return info_damage(dice, sides, 0);
2863 if (!get_aim_dir(&dir)) return NULL;
2865 fire_bolt_or_beam(beam_chance(), GF_FIRE, dir, damroll(dice, sides));
2871 if (name) return _("力の拳", "Fist of Force");
2872 if (desc) return _("ごく小さな分解の球を放つ。", "Fires a tiny ball of disintegration.");
2875 int dice = 8 + ((plev - 5) / 4);
2878 if (info) return info_damage(dice, sides, 0);
2882 if (!get_aim_dir(&dir)) return NULL;
2884 fire_ball(GF_DISINTEGRATE, dir,
2885 damroll(dice, sides), 0);
2891 if (name) return _("テレポート", "Teleport Self");
2892 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
2895 POSITION range = plev * 5;
2897 if (info) return info_range(range);
2901 teleport_player(range, 0L);
2907 if (name) return _("ワンダー", "Wonder");
2908 if (desc) return _("モンスターにランダムな効果を与える。", "Fires something with random effects.");
2911 if (info) return s_random;
2916 if (!get_aim_dir(&dir)) return NULL;
2924 if (name) return _("カオス・ボルト", "Chaos Bolt");
2925 if (desc) return _("カオスのボルトもしくはビームを放つ。", "Fires a bolt or ball of chaos.");
2928 int dice = 10 + (plev - 5) / 4;
2931 if (info) return info_damage(dice, sides, 0);
2935 if (!get_aim_dir(&dir)) return NULL;
2937 fire_bolt_or_beam(beam_chance(), GF_CHAOS, dir, damroll(dice, sides));
2943 if (name) return _("ソニック・ブーム", "Sonic Boom");
2944 if (desc) return _("自分を中心とした轟音の球を発生させる。", "Generates a ball of sound centered on you.");
2947 int dam = 60 + plev;
2948 int rad = plev / 10 + 2;
2950 if (info) return info_damage(0, 0, dam/2);
2954 msg_print(_("ドーン!部屋が揺れた!", "BOOM! Shake the room!"));
2955 project(0, rad, p_ptr->y, p_ptr->x, dam, GF_SOUND, PROJECT_KILL | PROJECT_ITEM, -1);
2961 if (name) return _("破滅の矢", "Doom Bolt");
2962 if (desc) return _("純粋な魔力のビームを放つ。", "Fires a beam of pure mana.");
2965 int dice = 11 + (plev - 5) / 4;
2968 if (info) return info_damage(dice, sides, 0);
2972 if (!get_aim_dir(&dir)) return NULL;
2974 fire_beam(GF_MANA, dir, damroll(dice, sides));
2980 if (name) return _("ファイア・ボール", "Fire Ball");
2981 if (desc) return _("炎の球を放つ。", "Fires a ball of fire.");
2984 int dam = plev + 55;
2987 if (info) return info_damage(0, 0, dam);
2991 if (!get_aim_dir(&dir)) return NULL;
2993 fire_ball(GF_FIRE, dir, dam, rad);
2999 if (name) return _("テレポート・アウェイ", "Teleport Other");
3000 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
3005 if (info) return info_power(power);
3009 if (!get_aim_dir(&dir)) return NULL;
3011 fire_beam(GF_AWAY_ALL, dir, power);
3017 if (name) return _("破壊の言葉", "Word of Destruction");
3018 if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroy everything in nearby area.");
3026 destroy_area(p_ptr->y, p_ptr->x, base + randint1(sides), FALSE);
3032 if (name) return _("ログルス発動", "Invoke Logrus");
3033 if (desc) return _("巨大なカオスの球を放つ。", "Fires a huge ball of chaos.");
3036 int dam = plev * 2 + 99;
3039 if (info) return info_damage(0, 0, dam);
3043 if (!get_aim_dir(&dir)) return NULL;
3045 fire_ball(GF_CHAOS, dir, dam, rad);
3051 if (name) return _("他者変容", "Polymorph Other");
3052 if (desc) return _("モンスター1体を変身させる。抵抗されると無効。", "Attempts to polymorph a monster.");
3057 if (info) return info_power(power);
3061 if (!get_aim_dir(&dir)) return NULL;
3063 poly_monster(dir, plev);
3069 if (name) return _("連鎖稲妻", "Chain Lightning");
3070 if (desc) return _("全方向に対して電撃のビームを放つ。", "Fires lightning beams in all directions.");
3073 int dice = 5 + plev / 10;
3076 if (info) return info_damage(dice, sides, 0);
3080 for (dir = 0; dir <= 9; dir++)
3081 fire_beam(GF_ELEC, dir, damroll(dice, sides));
3087 if (name) return _("魔力封入", "Arcane Binding");
3088 if (desc) return _("杖/魔法棒の充填回数を増やすか、充填中のロッドの充填時間を減らす。", "Recharges staffs, wands or rods.");
3093 if (info) return info_power(power);
3097 if (!recharge(power)) return NULL;
3103 if (name) return _("原子分解", "Disintegrate");
3104 if (desc) return _("巨大な分解の球を放つ。", "Fires a huge ball of disintegration.");
3107 int dam = plev + 70;
3108 int rad = 3 + plev / 40;
3110 if (info) return info_damage(0, 0, dam);
3114 if (!get_aim_dir(&dir)) return NULL;
3116 fire_ball(GF_DISINTEGRATE, dir, dam, rad);
3122 if (name) return _("現実変容", "Alter Reality");
3123 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
3129 if (info) return info_delay(base, sides);
3139 if (name) return _("マジック・ロケット", "Magic Rocket");
3140 if (desc) return _("ロケットを発射する。", "Fires a magic rocket.");
3143 int dam = 120 + plev * 2;
3146 if (info) return info_damage(0, 0, dam);
3150 if (!get_aim_dir(&dir)) return NULL;
3152 msg_print(_("ロケット発射!", "You launch a rocket!"));
3153 fire_rocket(GF_ROCKET, dir, dam, rad);
3159 if (name) return _("混沌の刃", "Chaos Branding");
3160 if (desc) return _("武器にカオスの属性をつける。", "Makes current weapon a Chaotic weapon.");
3171 if (name) return _("悪魔召喚", "Summon Demon");
3172 if (desc) return _("悪魔を1体召喚する。", "Summons a demon.");
3178 bool pet = !one_in_(3);
3180 if (pet) flg |= PM_FORCE_PET;
3181 else flg |= PM_NO_PET;
3182 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
3184 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_DEMON, flg))
3186 msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));
3189 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
3193 msg_print(_("「卑しき者よ、我は汝の下僕にあらず! お前の魂を頂くぞ!」",
3194 "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));
3202 if (name) return _("重力光線", "Beam of Gravity");
3203 if (desc) return _("重力のビームを放つ。", "Fires a beam of gravity.");
3206 int dice = 9 + (plev - 5) / 4;
3209 if (info) return info_damage(dice, sides, 0);
3213 if (!get_aim_dir(&dir)) return NULL;
3215 fire_beam(GF_GRAVITY, dir, damroll(dice, sides));
3221 if (name) return _("流星群", "Meteor Swarm");
3222 if (desc) return _("自分の周辺に隕石を落とす。", "Makes meteor balls fall down to nearby random locations.");
3228 if (info) return info_multi_damage(dam);
3232 cast_meteor(dam, rad);
3238 if (name) return _("焔の一撃", "Flame Strike");
3239 if (desc) return _("自分を中心とした超巨大な炎の球を発生させる。", "Generate a huge ball of fire centered on you.");
3242 int dam = 300 + 3 * plev;
3245 if (info) return info_damage(0, 0, dam/2);
3249 fire_ball(GF_FIRE, 0, dam, rad);
3255 if (name) return _("混沌召来", "Call Chaos");
3256 if (desc) return _("ランダムな属性の球やビームを発生させる。", "Generate random kind of balls or beams.");
3259 if (info) return format("%s150 / 250", s_dam);
3269 if (name) return _("自己変容", "Polymorph Self");
3270 if (desc) return _("自分を変身させようとする。", "Polymorphs yourself.");
3275 if (!get_check(_("変身します。よろしいですか?", "You will polymorph yourself. Are you sure? "))) return NULL;
3282 if (name) return _("魔力の嵐", "Mana Storm");
3283 if (desc) return _("非常に強力で巨大な純粋な魔力の球を放つ。", "Fires an extremely powerful huge ball of pure mana.");
3286 int dam = 300 + plev * 4;
3289 if (info) return info_damage(0, 0, dam);
3293 if (!get_aim_dir(&dir)) return NULL;
3295 fire_ball(GF_MANA, dir, dam, rad);
3301 if (name) return _("ログルスのブレス", "Breathe Logrus");
3302 if (desc) return _("非常に強力なカオスの球を放つ。", "Fires an extremely powerful ball of chaos.");
3305 int dam = p_ptr->chp;
3308 if (info) return info_damage(0, 0, dam);
3312 if (!get_aim_dir(&dir)) return NULL;
3314 fire_ball(GF_CHAOS, dir, dam, rad);
3320 if (name) return _("虚無召来", "Call the Void");
3321 if (desc) return _("自分に周囲に向かって、ロケット、純粋な魔力の球、放射性廃棄物の球を放つ。ただし、壁に隣接して使用すると広範囲を破壊する。",
3322 "Fires rockets, mana balls and nuclear waste balls in all directions each unless you are not adjacent to any walls. Otherwise *destroys* huge area.");
3325 if (info) return format("%s3 * 175", s_dam);
3339 * @brief 暗黒領域魔法の各処理を行う
3341 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
3342 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
3344 static cptr do_death_spell(int spell, int mode)
3346 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
3347 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
3348 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
3349 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
3351 static const char s_dam[] = _("損傷:", "dam ");
3352 static const char s_random[] = _("ランダム", "random");
3355 int plev = p_ptr->lev;
3360 if (name) return _("無生命感知", "Detect Unlife");
3361 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
3364 int rad = DETECT_RAD_DEFAULT;
3366 if (info) return info_radius(rad);
3370 detect_monsters_nonliving(rad);
3376 if (name) return _("呪殺弾", "Malediction");
3377 if (desc) return _("ごく小さな邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",
3378 "Fires a tiny ball of evil power which hurts good monsters greatly.");
3381 int dice = 3 + (plev - 1) / 5;
3385 if (info) return info_damage(dice, sides, 0);
3389 if (!get_aim_dir(&dir)) return NULL;
3392 * A radius-0 ball may (1) be aimed at
3393 * objects etc., and will affect them;
3394 * (2) may be aimed at ANY visible
3395 * monster, unlike a 'bolt' which must
3396 * travel to the monster.
3399 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides), rad);
3403 /* Special effect first */
3404 int effect = randint1(1000);
3407 fire_ball_hide(GF_DEATH_RAY, dir, plev * 200, 0);
3408 else if (effect < 500)
3409 fire_ball_hide(GF_TURN_ALL, dir, plev, 0);
3410 else if (effect < 800)
3411 fire_ball_hide(GF_OLD_CONF, dir, plev, 0);
3413 fire_ball_hide(GF_STUN, dir, plev, 0);
3420 if (name) return _("邪悪感知", "Detect Evil");
3421 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
3424 int rad = DETECT_RAD_DEFAULT;
3426 if (info) return info_radius(rad);
3430 detect_monsters_evil(rad);
3436 if (name) return _("悪臭雲", "Stinking Cloud");
3437 if (desc) return _("毒の球を放つ。", "Fires a ball of poison.");
3440 int dam = 10 + plev / 2;
3443 if (info) return info_damage(0, 0, dam);
3447 if (!get_aim_dir(&dir)) return NULL;
3449 fire_ball(GF_POIS, dir, dam, rad);
3455 if (name) return _("黒い眠り", "Black Sleep");
3456 if (desc) return _("1体のモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep a monster.");
3461 if (info) return info_power(power);
3465 if (!get_aim_dir(&dir)) return NULL;
3467 sleep_monster(dir, plev);
3473 if (name) return _("耐毒", "Resist Poison");
3474 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",
3475 "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");
3480 if (info) return info_duration(base, base);
3484 set_oppose_pois(randint1(base) + base, FALSE);
3490 if (name) return _("恐慌", "Horrify");
3491 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
3496 if (info) return info_power(power);
3500 if (!get_aim_dir(&dir)) return NULL;
3502 fear_monster(dir, power);
3503 stun_monster(dir, power);
3509 if (name) return _("アンデッド従属", "Enslave Undead");
3510 if (desc) return _("アンデッド1体を魅了する。抵抗されると無効。", "Attempts to charm an undead monster.");
3515 if (info) return info_power(power);
3519 if (!get_aim_dir(&dir)) return NULL;
3521 control_one_undead(dir, power);
3527 if (name) return _("エントロピーの球", "Orb of Entropy");
3528 if (desc) return _("生命のある者に効果のある球を放つ。", "Fires a ball which damages living monsters.");
3533 int rad = (plev < 30) ? 2 : 3;
3536 if (p_ptr->pclass == CLASS_MAGE ||
3537 p_ptr->pclass == CLASS_HIGH_MAGE ||
3538 p_ptr->pclass == CLASS_SORCERER)
3539 base = plev + plev / 2;
3541 base = plev + plev / 4;
3544 if (info) return info_damage(dice, sides, base);
3548 if (!get_aim_dir(&dir)) return NULL;
3550 fire_ball(GF_OLD_DRAIN, dir, damroll(dice, sides) + base, rad);
3556 if (name) return _("地獄の矢", "Nether Bolt");
3557 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
3560 int dice = 8 + (plev - 5) / 4;
3563 if (info) return info_damage(dice, sides, 0);
3567 if (!get_aim_dir(&dir)) return NULL;
3569 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
3575 if (name) return _("殺戮雲", "Cloud kill");
3576 if (desc) return _("自分を中心とした毒の球を発生させる。", "Generate a ball of poison centered on you.");
3579 int dam = (30 + plev) * 2;
3580 int rad = plev / 10 + 2;
3582 if (info) return info_damage(0, 0, dam/2);
3586 project(0, rad, p_ptr->y, p_ptr->x, dam, GF_POIS, PROJECT_KILL | PROJECT_ITEM, -1);
3592 if (name) return _("モンスター消滅", "Genocide One");
3593 if (desc) return _("モンスター1体を消し去る。経験値やアイテムは手に入らない。抵抗されると無効。", "Attempts to vanish a monster.");
3596 int power = plev + 50;
3598 if (info) return info_power(power);
3602 if (!get_aim_dir(&dir)) return NULL;
3604 fire_ball_hide(GF_GENOCIDE, dir, power, 0);
3610 if (name) return _("毒の刃", "Poison Branding");
3611 if (desc) return _("武器に毒の属性をつける。", "Makes current weapon poison branded.");
3622 if (name) return _("吸血ドレイン", "Vampiric Drain");
3623 if (desc) return _("モンスター1体から生命力を吸いとる。吸いとった生命力によって満腹度が上がる。",
3624 "Absorbs some HP from a monster and gives them to you. You will also gain nutritional sustenance from this.");
3628 int sides = plev * 2;
3629 int base = plev * 2;
3631 if (info) return info_damage(dice, sides, base);
3635 int dam = base + damroll(dice, sides);
3637 if (!get_aim_dir(&dir)) return NULL;
3639 if (drain_life(dir, dam))
3641 chg_virtue(V_SACRIFICE, -1);
3642 chg_virtue(V_VITALITY, -1);
3647 * Gain nutritional sustenance:
3650 * A Food ration gives 5000
3651 * food points (by contrast)
3652 * Don't ever get more than
3653 * "Full" this way But if we
3654 * ARE Gorged, it won't cure
3657 dam = p_ptr->food + MIN(5000, 100 * dam);
3659 /* Not gorged already */
3660 if (p_ptr->food < PY_FOOD_MAX)
3661 set_food(dam >= PY_FOOD_MAX ? PY_FOOD_MAX - 1 : dam);
3668 if (name) return _("反魂の術", "Animate dead");
3669 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
3674 animate_dead(0, p_ptr->y, p_ptr->x);
3680 if (name) return _("抹殺", "Genocide");
3681 if (desc) return _("指定した文字のモンスターを現在の階から消し去る。抵抗されると無効。",
3682 "Eliminates an entire class of monster, exhausting you. Powerful or unique monsters may resist.");
3685 int power = plev+50;
3687 if (info) return info_power(power);
3691 symbol_genocide(power, TRUE);
3697 if (name) return _("狂戦士化", "Berserk");
3698 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");
3703 if (info) return info_duration(base, base);
3707 set_shero(randint1(base) + base, FALSE);
3715 if (name) return _("悪霊召喚", "Invoke Spirits");
3716 if (desc) return _("ランダムで様々な効果が起こる。", "Causes random effects.");
3719 if (info) return s_random;
3723 if (!get_aim_dir(&dir)) return NULL;
3725 cast_invoke_spirits(dir);
3731 if (name) return _("暗黒の矢", "Dark Bolt");
3732 if (desc) return _("暗黒のボルトもしくはビームを放つ。", "Fires a bolt or beam of darkness.");
3735 int dice = 4 + (plev - 5) / 4;
3738 if (info) return info_damage(dice, sides, 0);
3742 if (!get_aim_dir(&dir)) return NULL;
3744 fire_bolt_or_beam(beam_chance(), GF_DARK, dir, damroll(dice, sides));
3750 if (name) return _("狂乱戦士", "Battle Frenzy");
3751 if (desc) return _("狂戦士化し、恐怖を除去し、加速する。",
3752 "Gives another bonus to hit and HP, immunity to fear for a while. Hastes you. But decreases AC.");
3756 int sp_base = plev / 2;
3757 int sp_sides = 20 + plev / 2;
3759 if (info) return info_duration(b_base, b_base);
3763 set_shero(randint1(25) + 25, FALSE);
3766 set_fast(randint1(sp_sides) + sp_base, FALSE);
3772 if (name) return _("吸血の刃", "Vampiric Branding");
3773 if (desc) return _("武器に吸血の属性をつける。", "Makes current weapon Vampiric.");
3784 if (name) return _("真・吸血", "Vampirism True");
3785 if (desc) return _("モンスター1体から生命力を吸いとる。吸いとった生命力によって体力が回復する。",
3786 "Fires 3 bolts. Each of the bolts absorbs some HP from a monster and gives them to you.");
3791 if (info) return format("%s3*%d", s_dam, dam);
3797 if (!get_aim_dir(&dir)) return NULL;
3799 chg_virtue(V_SACRIFICE, -1);
3800 chg_virtue(V_VITALITY, -1);
3802 for (i = 0; i < 3; i++)
3804 if (drain_life(dir, dam))
3812 if (name) return _("死の言魂", "Nether Wave");
3813 if (desc) return _("視界内の生命のあるモンスターにダメージを与える。", "Damages all living monsters in sight.");
3816 int sides = plev * 3;
3818 if (info) return info_damage(1, sides, 0);
3822 dispel_living(randint1(sides));
3828 if (name) return _("暗黒の嵐", "Darkness Storm");
3829 if (desc) return _("巨大な暗黒の球を放つ。", "Fires a huge ball of darkness.");
3832 int dam = 100 + plev * 2;
3835 if (info) return info_damage(0, 0, dam);
3839 if (!get_aim_dir(&dir)) return NULL;
3841 fire_ball(GF_DARK, dir, dam, rad);
3847 if (name) return _("死の光線", "Death Ray");
3848 if (desc) return _("死の光線を放つ。", "Fires a beam of death.");
3853 if (!get_aim_dir(&dir)) return NULL;
3855 death_ray(dir, plev);
3861 if (name) return _("死者召喚", "Raise the Dead");
3862 if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");
3868 bool pet = one_in_(3);
3871 type = (plev > 47 ? SUMMON_HI_UNDEAD : SUMMON_UNDEAD);
3873 if (!pet || (pet && (plev > 24) && one_in_(3)))
3874 flg |= PM_ALLOW_GROUP;
3876 if (pet) flg |= PM_FORCE_PET;
3877 else flg |= (PM_ALLOW_UNIQUE | PM_NO_PET);
3879 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, type, flg))
3881 msg_print(_("冷たい風があなたの周りに吹き始めた。それは腐敗臭を運んでいる...",
3882 "Cold winds begin to blow around you, carrying with them the stench of decay..."));
3887 msg_print(_("古えの死せる者共があなたに仕えるため土から甦った!",
3888 "Ancient, long-dead forms arise from the ground to serve you!"));
3892 msg_print(_("死者が甦った。眠りを妨げるあなたを罰するために!",
3893 "'The dead arise... to punish you for disturbing them!'"));
3896 chg_virtue(V_UNLIFE, 1);
3903 if (name) return _("死者の秘伝", "Esoteria");
3904 if (desc) return _("アイテムを1つ識別する。レベルが高いとアイテムの能力を完全に知ることができる。",
3905 "Identifies an item. Or *identifies* an item at higher level.");
3910 if (randint1(50) > plev)
3912 if (!ident_spell(FALSE)) return NULL;
3916 if (!identify_fully(FALSE)) return NULL;
3923 if (name) return _("吸血鬼変化", "Polymorph Vampire");
3924 if (desc) return _("一定時間、吸血鬼に変化する。変化している間は本来の種族の能力を失い、代わりに吸血鬼としての能力を得る。",
3925 "Mimic a vampire for a while. Loses abilities of original race and gets abilities as a vampire.");
3928 int base = 10 + plev / 2;
3930 if (info) return info_duration(base, base);
3934 set_mimic(base + randint1(base), MIMIC_VAMPIRE, FALSE);
3940 if (name) return _("経験値復活", "Restore Life");
3941 if (desc) return _("失った経験値を回復する。", "Restore lost experience.");
3952 if (name) return _("周辺抹殺", "Mass Genocide");
3953 if (desc) return _("自分の周囲にいるモンスターを現在の階から消し去る。抵抗されると無効。",
3954 "Eliminates all nearby monsters, exhausting you. Powerful or unique monsters may be able to resist.");
3957 int power = plev + 50;
3959 if (info) return info_power(power);
3963 mass_genocide(power, TRUE);
3969 if (name) return _("地獄の劫火", "Hellfire");
3970 if (desc) return _("邪悪な力を持つ宝珠を放つ。善良なモンスターには大きなダメージを与える。",
3971 "Fires a powerful ball of evil power. Hurts good monsters greatly.");
3977 if (info) return info_damage(0, 0, dam);
3981 if (!get_aim_dir(&dir)) return NULL;
3983 fire_ball(GF_HELL_FIRE, dir, dam, rad);
3984 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("地獄の劫火の呪文を唱えた疲労", "the strain of casting Hellfire"), -1);
3990 if (name) return _("幽体化", "Wraithform");
3991 if (desc) return _("一定時間、壁を通り抜けることができ受けるダメージが軽減される幽体の状態に変身する。",
3992 "Becomes wraith form which gives ability to pass walls and makes all damages half.");
3995 int base = plev / 2;
3997 if (info) return info_duration(base, base);
4001 set_wraith_form(randint1(base) + base, FALSE);
4012 * @brief トランプ領域魔法の各処理を行う
4014 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
4015 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
4017 static cptr do_trump_spell(int spell, int mode)
4019 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
4020 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
4021 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
4022 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
4023 bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
4024 static const char s_random[] = _("ランダム", "random");
4027 int plev = p_ptr->lev;
4032 if (name) return _("ショート・テレポート", "Phase Door");
4033 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");
4036 POSITION range = 10;
4038 if (info) return info_range(range);
4042 teleport_player(range, 0L);
4048 if (name) return _("蜘蛛のカード", "Trump Spiders");
4049 if (desc) return _("蜘蛛を召喚する。", "Summons spiders.");
4054 msg_print(_("あなたは蜘蛛のカードに集中する...", "You concentrate on the trump of an spider..."));
4055 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_SPIDER, PM_ALLOW_GROUP))
4059 msg_print(_("召喚された蜘蛛は怒っている!", "The summoned spiders get angry!"));
4067 if (name) return _("シャッフル", "Shuffle");
4068 if (desc) return _("カードの占いをする。", "Causes random effects.");
4071 if (info) return s_random;
4081 if (name) return _("フロア・リセット", "Reset Recall");
4082 if (desc) return _("最深階を変更する。", "Resets the 'deepest' level for recall spell.");
4087 if (!reset_recall()) return NULL;
4093 if (name) return _("テレポート", "Teleport");
4094 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
4097 POSITION range = plev * 4;
4099 if (info) return info_range(range);
4103 teleport_player(range, 0L);
4109 if (name) return _("感知のカード", "Trump Spying");
4110 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
4116 if (info) return info_duration(base, sides);
4120 set_tim_esp(randint1(sides) + base, FALSE);
4126 if (name) return _("テレポート・モンスター", "Teleport Away");
4127 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
4132 if (info) return info_power(power);
4136 if (!get_aim_dir(&dir)) return NULL;
4138 fire_beam(GF_AWAY_ALL, dir, power);
4144 if (name) return _("動物のカード", "Trump Animals");
4145 if (desc) return _("1体の動物を召喚する。", "Summons an animal.");
4150 int type = (!fail ? SUMMON_ANIMAL_RANGER : SUMMON_ANIMAL);
4151 msg_print(_("あなたは動物のカードに集中する...", "You concentrate on the trump of an animal..."));
4152 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, type, 0L))
4156 msg_print(_("召喚された動物は怒っている!", "The summoned animal gets angry!"));
4164 if (name) return _("移動のカード", "Trump Reach");
4165 if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");
4168 int weight = plev * 15;
4170 if (info) return info_weight(weight);
4174 if (!get_aim_dir(&dir)) return NULL;
4176 fetch(dir, weight, FALSE);
4182 if (name) return _("カミカゼのカード", "Trump Kamikaze");
4183 if (desc) return _("複数の爆発するモンスターを召喚する。", "Summons monsters which explode by itself.");
4193 if (!target_set(TARGET_KILL)) return NULL;
4199 /* Summons near player when failed */
4204 if (p_ptr->pclass == CLASS_BEASTMASTER)
4205 type = SUMMON_KAMIKAZE_LIVING;
4207 type = SUMMON_KAMIKAZE;
4209 msg_print(_("あなたはカミカゼのカードに集中する...", "You concentrate on several trumps at once..."));
4210 if (trump_summoning(2 + randint0(plev / 7), !fail, y, x, 0, type, 0L))
4214 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
4222 if (name) return _("幻霊召喚", "Phantasmal Servant");
4223 if (desc) return _("1体の幽霊を召喚する。", "Summons a ghost.");
4226 /* Phantasmal Servant is not summoned as enemy when failed */
4229 int summon_lev = plev * 2 / 3 + randint1(plev / 2);
4231 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, (summon_lev * 3 / 2), SUMMON_PHANTOM, 0L))
4233 msg_print(_("御用でございますか、御主人様?", "'Your wish, master?'"));
4240 if (name) return _("スピード・モンスター", "Haste Monster");
4241 if (desc) return _("モンスター1体を加速させる。", "Hastes a monster.");
4248 /* Temporary enable target_pet option */
4249 bool old_target_pet = target_pet;
4252 result = get_aim_dir(&dir);
4254 /* Restore target_pet option */
4255 target_pet = old_target_pet;
4257 if (!result) return NULL;
4259 speed_monster(dir, plev);
4265 if (name) return _("テレポート・レベル", "Teleport Level");
4266 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");
4271 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
4278 if (name) return _("次元の扉", "Dimension Door");
4279 if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleport to given location.");
4282 POSITION range = plev / 2 + 10;
4284 if (info) return info_range(range);
4288 msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));
4289 if (!dimension_door()) return NULL;
4295 if (name) return _("帰還の呪文", "Word of Recall");
4296 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
4297 "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
4303 if (info) return info_delay(base, sides);
4307 if (!word_of_recall()) return NULL;
4313 if (name) return _("怪物追放", "Banish");
4314 if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");
4317 int power = plev * 4;
4319 if (info) return info_power(power);
4323 banish_monsters(power);
4329 if (name) return _("位置交換のカード", "Swap Position");
4330 if (desc) return _("1体のモンスターと位置を交換する。", "Swap positions of you and a monster.");
4337 /* HACK -- No range limit */
4338 project_length = -1;
4340 result = get_aim_dir(&dir);
4342 /* Restore range to default */
4345 if (!result) return NULL;
4353 if (name) return _("アンデッドのカード", "Trump Undead");
4354 if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");
4359 msg_print(_("あなたはアンデッドのカードに集中する...", "You concentrate on the trump of an undead creature..."));
4360 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_UNDEAD, 0L))
4364 msg_print(_("召喚されたアンデッドは怒っている!", "The summoned undead creature gets angry!"));
4372 if (name) return _("爬虫類のカード", "Trump Reptiles");
4373 if (desc) return _("1体のヒドラを召喚する。", "Summons a hydra.");
4378 msg_print(_("あなたは爬虫類のカードに集中する...", "You concentrate on the trump of a reptile..."));
4379 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HYDRA, 0L))
4383 msg_print(_("召喚された爬虫類は怒っている!", "The summoned reptile gets angry!"));
4391 if (name) return _("モンスターのカード", "Trump Monsters");
4392 if (desc) return _("複数のモンスターを召喚する。", "Summons some monsters.");
4398 msg_print(_("あなたはモンスターのカードに集中する...", "You concentrate on several trumps at once..."));
4399 if (p_ptr->pclass == CLASS_BEASTMASTER)
4400 type = SUMMON_LIVING;
4404 if (trump_summoning((1 + (plev - 15)/ 10), !fail, p_ptr->y, p_ptr->x, 0, type, 0L))
4408 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
4417 if (name) return _("ハウンドのカード", "Trump Hounds");
4418 if (desc) return _("1グループのハウンドを召喚する。", "Summons a group of hounds.");
4423 msg_print(_("あなたはハウンドのカードに集中する...", "You concentrate on the trump of a hound..."));
4424 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HOUND, PM_ALLOW_GROUP))
4428 msg_print(_("召喚されたハウンドは怒っている!", "The summoned hounds get angry!"));
4436 if (name) return _("トランプの刃", "Trump Branding");
4437 if (desc) return _("武器にトランプの属性をつける。", "Makes current weapon a Trump weapon.");
4448 if (name) return _("人間トランプ", "Living Trump");
4449 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",
4450 "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");
4458 /* Teleport control */
4461 /* Random teleportation (uncontrolled) */
4464 /* Gain the mutation */
4465 if (gain_random_mutation(mutation))
4467 msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));
4474 if (name) return _("サイバーデーモンのカード", "Trump Cyberdemon");
4475 if (desc) return _("1体のサイバーデーモンを召喚する。", "Summons a cyber demon.");
4480 msg_print(_("あなたはサイバーデーモンのカードに集中する...", "You concentrate on the trump of a Cyberdemon..."));
4481 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_CYBER, 0L))
4485 msg_print(_("召喚されたサイバーデーモンは怒っている!", "The summoned Cyberdemon gets angry!"));
4493 if (name) return _("予見のカード", "Trump Divination");
4494 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
4495 "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
4498 int rad = DETECT_RAD_DEFAULT;
4500 if (info) return info_radius(rad);
4510 if (name) return _("知識のカード", "Trump Lore");
4511 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
4516 if (!identify_fully(FALSE)) return NULL;
4522 if (name) return _("回復モンスター", "Heal Monster");
4523 if (desc) return _("モンスター1体の体力を回復させる。", "Heal a monster.");
4526 int heal = plev * 10 + 200;
4528 if (info) return info_heal(0, 0, heal);
4534 /* Temporary enable target_pet option */
4535 bool old_target_pet = target_pet;
4538 result = get_aim_dir(&dir);
4540 /* Restore target_pet option */
4541 target_pet = old_target_pet;
4543 if (!result) return NULL;
4545 heal_monster(dir, heal);
4551 if (name) return _("ドラゴンのカード", "Trump Dragon");
4552 if (desc) return _("1体のドラゴンを召喚する。", "Summons a dragon.");
4557 msg_print(_("あなたはドラゴンのカードに集中する...", "You concentrate on the trump of a dragon..."));
4558 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_DRAGON, 0L))
4562 msg_print(_("召喚されたドラゴンは怒っている!", "The summoned dragon gets angry!"));
4570 if (name) return _("隕石のカード", "Trump Meteor");
4571 if (desc) return _("自分の周辺に隕石を落とす。", "Makes meteor balls fall down to nearby random locations.");
4577 if (info) return info_multi_damage(dam);
4581 cast_meteor(dam, rad);
4587 if (name) return _("デーモンのカード", "Trump Demon");
4588 if (desc) return _("1体の悪魔を召喚する。", "Summons a demon.");
4593 msg_print(_("あなたはデーモンのカードに集中する...", "You concentrate on the trump of a demon..."));
4594 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_DEMON, 0L))
4598 msg_print(_("召喚されたデーモンは怒っている!", "The summoned demon gets angry!"));
4606 if (name) return _("地獄のカード", "Trump Greater Undead");
4607 if (desc) return _("1体の上級アンデッドを召喚する。", "Summons a greater undead.");
4612 msg_print(_("あなたは強力なアンデッドのカードに集中する...", "You concentrate on the trump of a greater undead being..."));
4613 /* May allow unique depend on level and dice roll */
4614 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HI_UNDEAD, PM_ALLOW_UNIQUE))
4618 msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead creature gets angry!"));
4626 if (name) return _("古代ドラゴンのカード", "Trump Ancient Dragon");
4627 if (desc) return _("1体の古代ドラゴンを召喚する。", "Summons an ancient dragon.");
4634 if (p_ptr->pclass == CLASS_BEASTMASTER)
4635 type = SUMMON_HI_DRAGON_LIVING;
4637 type = SUMMON_HI_DRAGON;
4639 msg_print(_("あなたは古代ドラゴンのカードに集中する...", "You concentrate on the trump of an ancient dragon..."));
4640 /* May allow unique depend on level and dice roll */
4641 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, type, PM_ALLOW_UNIQUE))
4645 msg_print(_("召喚された古代ドラゴンは怒っている!", "The summoned ancient dragon gets angry!"));
4658 * @brief 秘術領域魔法の各処理を行う
4660 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
4661 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
4663 static cptr do_arcane_spell(int spell, int mode)
4665 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
4666 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
4667 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
4668 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
4671 int plev = p_ptr->lev;
4676 if (name) return _("電撃", "Zap");
4677 if (desc) return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");
4680 int dice = 3 + (plev - 1) / 5;
4683 if (info) return info_damage(dice, sides, 0);
4687 if (!get_aim_dir(&dir)) return NULL;
4689 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));
4695 if (name) return _("魔法の施錠", "Wizard Lock");
4696 if (desc) return _("扉に鍵をかける。", "Locks a door.");
4701 if (!get_aim_dir(&dir)) return NULL;
4709 if (name) return _("透明体感知", "Detect Invisibility");
4710 if (desc) return _("近くの透明なモンスターを感知する。", "Detects all invisible monsters in your vicinity.");
4713 int rad = DETECT_RAD_DEFAULT;
4715 if (info) return info_radius(rad);
4719 detect_monsters_invis(rad);
4725 if (name) return _("モンスター感知", "Detect Monsters");
4726 if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
4729 int rad = DETECT_RAD_DEFAULT;
4731 if (info) return info_radius(rad);
4735 detect_monsters_normal(rad);
4741 if (name) return _("ショート・テレポート", "Blink");
4742 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");
4745 POSITION range = 10;
4747 if (info) return info_range(range);
4751 teleport_player(range, 0L);
4757 if (name) return _("ライト・エリア", "Light Area");
4758 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
4762 int sides = plev / 2;
4763 int rad = plev / 10 + 1;
4765 if (info) return info_damage(dice, sides, 0);
4769 lite_area(damroll(dice, sides), rad);
4775 if (name) return _("罠と扉 破壊", "Trap & Door Destruction");
4776 if (desc) return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");
4781 if (!get_aim_dir(&dir)) return NULL;
4789 if (name) return _("軽傷の治癒", "Cure Light Wounds");
4790 if (desc) return _("怪我と体力を少し回復させる。", "Heals cut and HP a little.");
4796 if (info) return info_heal(dice, sides, 0);
4800 hp_player(damroll(dice, sides));
4801 set_cut(p_ptr->cut - 10);
4807 if (name) return _("罠と扉 感知", "Detect Doors & Traps");
4808 if (desc) return _("近くの全ての罠と扉と階段を感知する。", "Detects traps, doors, and stairs in your vicinity.");
4811 int rad = DETECT_RAD_DEFAULT;
4813 if (info) return info_radius(rad);
4817 detect_traps(rad, TRUE);
4825 if (name) return _("燃素", "Phlogiston");
4826 if (desc) return _("光源に燃料を補給する。", "Adds more turns of light to a lantern or torch.");
4837 if (name) return _("財宝感知", "Detect Treasure");
4838 if (desc) return _("近くの財宝を感知する。", "Detects all treasures in your vicinity.");
4841 int rad = DETECT_RAD_DEFAULT;
4843 if (info) return info_radius(rad);
4847 detect_treasure(rad);
4848 detect_objects_gold(rad);
4854 if (name) return _("魔法 感知", "Detect Enchantment");
4855 if (desc) return _("近くの魔法がかかったアイテムを感知する。", "Detects all magical items in your vicinity.");
4858 int rad = DETECT_RAD_DEFAULT;
4860 if (info) return info_radius(rad);
4864 detect_objects_magic(rad);
4870 if (name) return _("アイテム感知", "Detect Objects");
4871 if (desc) return _("近くの全てのアイテムを感知する。", "Detects all items in your vicinity.");
4874 int rad = DETECT_RAD_DEFAULT;
4876 if (info) return info_radius(rad);
4880 detect_objects_normal(rad);
4886 if (name) return _("解毒", "Cure Poison");
4887 if (desc) return _("毒を体内から完全に取り除く。", "Cures poison status.");
4898 if (name) return _("耐冷", "Resist Cold");
4899 if (desc) return _("一定時間、冷気への耐性を得る。装備による耐性に累積する。", "Gives resistance to cold. This resistance can be added to which from equipment for more powerful resistance.");
4904 if (info) return info_duration(base, base);
4908 set_oppose_cold(randint1(base) + base, FALSE);
4914 if (name) return _("耐火", "Resist Fire");
4915 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
4916 "Gives resistance to fire. This resistance can be added to which from equipment for more powerful resistance.");
4921 if (info) return info_duration(base, base);
4925 set_oppose_fire(randint1(base) + base, FALSE);
4931 if (name) return _("耐電", "Resist Lightning");
4932 if (desc) return _("一定時間、電撃への耐性を得る。装備による耐性に累積する。",
4933 "Gives resistance to electricity. This resistance can be added to which from equipment for more powerful resistance.");
4938 if (info) return info_duration(base, base);
4942 set_oppose_elec(randint1(base) + base, FALSE);
4948 if (name) return _("耐酸", "Resist Acid");
4949 if (desc) return _("一定時間、酸への耐性を得る。装備による耐性に累積する。",
4950 "Gives resistance to acid. This resistance can be added to which from equipment for more powerful resistance.");
4955 if (info) return info_duration(base, base);
4959 set_oppose_acid(randint1(base) + base, FALSE);
4965 if (name) return _("重傷の治癒", "Cure Medium Wounds");
4966 if (desc) return _("怪我と体力を中程度回復させる。", "Heals cut and HP more.");
4972 if (info) return info_heal(dice, sides, 0);
4976 hp_player(damroll(dice, sides));
4977 set_cut((p_ptr->cut / 2) - 50);
4983 if (name) return _("テレポート", "Teleport");
4984 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
4987 POSITION range = plev * 5;
4989 if (info) return info_range(range);
4993 teleport_player(range, 0L);
4999 if (name) return _("鑑定", "Identify");
5000 if (desc) return _("アイテムを識別する。", "Identifies an item.");
5005 if (!ident_spell(FALSE)) return NULL;
5011 if (name) return _("岩石溶解", "Stone to Mud");
5012 if (desc) return _("壁を溶かして床にする。", "Turns one rock square to mud.");
5019 if (info) return info_damage(dice, sides, base);
5023 if (!get_aim_dir(&dir)) return NULL;
5025 wall_to_mud(dir, 20 + randint1(30));
5031 if (name) return _("閃光", "Ray of Light");
5032 if (desc) return _("光線を放つ。光りを嫌うモンスターに効果がある。", "Fires a beam of light which damages to light-sensitive monsters.");
5038 if (info) return info_damage(dice, sides, 0);
5042 if (!get_aim_dir(&dir)) return NULL;
5044 msg_print(_("光線が放たれた。", "A line of light appears."));
5045 lite_line(dir, damroll(6, 8));
5051 if (name) return _("空腹充足", "Satisfy Hunger");
5052 if (desc) return _("満腹にする。", "Satisfies hunger.");
5057 set_food(PY_FOOD_MAX - 1);
5063 if (name) return _("透明視認", "See Invisible");
5064 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
5069 if (info) return info_duration(base, base);
5073 set_tim_invis(randint1(base) + base, FALSE);
5079 if (name) return _("エレメンタル召喚", "Conjure Elemental");
5080 if (desc) return _("1体のエレメンタルを召喚する。", "Summons an elemental.");
5085 if (!summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_ELEMENTAL, (PM_ALLOW_GROUP | PM_FORCE_PET)))
5087 msg_print(_("エレメンタルは現れなかった。", "No Elementals arrive."));
5094 if (name) return _("テレポート・レベル", "Teleport Level");
5095 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");
5100 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
5107 if (name) return _("テレポート・モンスター", "Teleport Away");
5108 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
5113 if (info) return info_power(power);
5117 if (!get_aim_dir(&dir)) return NULL;
5119 fire_beam(GF_AWAY_ALL, dir, power);
5125 if (name) return _("元素の球", "Elemental Ball");
5126 if (desc) return _("炎、電撃、冷気、酸のどれかの球を放つ。", "Fires a ball of some elements.");
5129 int dam = 75 + plev;
5132 if (info) return info_damage(0, 0, dam);
5138 if (!get_aim_dir(&dir)) return NULL;
5140 switch (randint1(4))
5142 case 1: type = GF_FIRE;break;
5143 case 2: type = GF_ELEC;break;
5144 case 3: type = GF_COLD;break;
5145 default: type = GF_ACID;break;
5148 fire_ball(type, dir, dam, rad);
5154 if (name) return _("全感知", "Detection");
5155 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
5156 "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
5159 int rad = DETECT_RAD_DEFAULT;
5161 if (info) return info_radius(rad);
5171 if (name) return _("帰還の呪文", "Word of Recall");
5172 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
5173 "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
5179 if (info) return info_delay(base, sides);
5183 if (!word_of_recall()) return NULL;
5189 if (name) return _("千里眼", "Clairvoyance");
5190 if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。さらに、一定時間テレパシー能力を得る。",
5191 "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");
5197 if (info) return info_duration(base, sides);
5201 chg_virtue(V_KNOWLEDGE, 1);
5202 chg_virtue(V_ENLIGHTEN, 1);
5206 if (!p_ptr->telepathy)
5208 set_tim_esp(randint1(sides) + base, FALSE);
5219 * @brief 匠領域魔法の各処理を行う
5221 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
5222 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
5224 static cptr do_craft_spell(int spell, int mode)
5226 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
5227 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
5228 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
5229 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
5231 int plev = p_ptr->lev;
5236 if (name) return _("赤外線視力", "Infravision");
5237 if (desc) return _("一定時間、赤外線視力が増強される。", "Gives infravision for a while.");
5242 if (info) return info_duration(base, base);
5246 set_tim_infra(base + randint1(base), FALSE);
5252 if (name) return _("回復力強化", "Regeneration");
5253 if (desc) return _("一定時間、回復力が増強される。", "Gives regeneration ability for a while.");
5258 if (info) return info_duration(base, base);
5262 set_tim_regen(base + randint1(base), FALSE);
5268 if (name) return _("空腹充足", "Satisfy Hunger");
5269 if (desc) return _("満腹になる。", "Satisfies hunger.");
5274 set_food(PY_FOOD_MAX - 1);
5280 if (name) return _("耐冷気", "Resist Cold");
5281 if (desc) return _("一定時間、冷気への耐性を得る。装備による耐性に累積する。",
5282 "Gives resistance to cold. This resistance can be added to which from equipment for more powerful resistance.");
5287 if (info) return info_duration(base, base);
5291 set_oppose_cold(randint1(base) + base, FALSE);
5297 if (name) return _("耐火炎", "Resist Fire");
5298 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
5299 "Gives resistance to fire. This resistance can be added to which from equipment for more powerful resistance.");
5304 if (info) return info_duration(base, base);
5308 set_oppose_fire(randint1(base) + base, FALSE);
5314 if (name) return _("士気高揚", "Heroism");
5315 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
5320 if (info) return info_duration(base, base);
5324 set_hero(randint1(base) + base, FALSE);
5332 if (name) return _("耐電撃", "Resist Lightning");
5333 if (desc) return _("一定時間、電撃への耐性を得る。装備による耐性に累積する。",
5334 "Gives resistance to electricity. This resistance can be added to which from equipment for more powerful resistance.");
5339 if (info) return info_duration(base, base);
5343 set_oppose_elec(randint1(base) + base, FALSE);
5349 if (name) return _("耐酸", "Resist Acid");
5350 if (desc) return _("一定時間、酸への耐性を得る。装備による耐性に累積する。",
5351 "Gives resistance to acid. This resistance can be added to which from equipment for more powerful resistance.");
5356 if (info) return info_duration(base, base);
5360 set_oppose_acid(randint1(base) + base, FALSE);
5366 if (name) return _("透明視認", "See Invisibility");
5367 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
5372 if (info) return info_duration(base, base);
5376 set_tim_invis(randint1(base) + base, FALSE);
5382 if (name) return _("解呪", "Remove Curse");
5383 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
5390 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
5397 if (name) return _("耐毒", "Resist Poison");
5398 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",
5399 "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");
5404 if (info) return info_duration(base, base);
5408 set_oppose_pois(randint1(base) + base, FALSE);
5414 if (name) return _("狂戦士化", "Berserk");
5415 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");
5420 if (info) return info_duration(base, base);
5424 set_shero(randint1(base) + base, FALSE);
5432 if (name) return _("自己分析", "Self Knowledge");
5433 if (desc) return _("現在の自分の状態を完全に知る。",
5434 "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");
5445 if (name) return _("対邪悪結界", "Protection from Evil");
5446 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");
5449 int base = 3 * plev;
5452 if (info) return info_duration(base, sides);
5456 set_protevil(randint1(sides) + base, FALSE);
5462 if (name) return _("癒し", "Cure");
5463 if (desc) return _("毒、朦朧状態、負傷を全快させ、幻覚を直す。", "Heals poison, stun, cut and hallucination completely.");
5477 if (name) return _("魔法剣", "Mana Branding");
5478 if (desc) return _("一定時間、武器に冷気、炎、電撃、酸、毒のいずれかの属性をつける。武器を持たないと使えない。",
5479 "Makes current weapon some elemental branded. You must wield weapons.");
5482 int base = plev / 2;
5484 if (info) return info_duration(base, base);
5488 if (!choose_ele_attack()) return NULL;
5494 if (name) return _("テレパシー", "Telepathy");
5495 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
5501 if (info) return info_duration(base, sides);
5505 set_tim_esp(randint1(sides) + base, FALSE);
5511 if (name) return _("肌石化", "Stone Skin");
5512 if (desc) return _("一定時間、ACを上昇させる。", "Gives bonus to AC for a while.");
5518 if (info) return info_duration(base, sides);
5522 set_shield(randint1(sides) + base, FALSE);
5528 if (name) return _("全耐性", "Resistance");
5529 if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
5530 "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.");
5535 if (info) return info_duration(base, base);
5539 set_oppose_acid(randint1(base) + base, FALSE);
5540 set_oppose_elec(randint1(base) + base, FALSE);
5541 set_oppose_fire(randint1(base) + base, FALSE);
5542 set_oppose_cold(randint1(base) + base, FALSE);
5543 set_oppose_pois(randint1(base) + base, FALSE);
5549 if (name) return _("スピード", "Haste Self");
5550 if (desc) return _("一定時間、加速する。", "Hastes you for a while.");
5554 int sides = 20 + plev;
5556 if (info) return info_duration(base, sides);
5560 set_fast(randint1(sides) + base, FALSE);
5566 if (name) return _("壁抜け", "Walk through Wall");
5567 if (desc) return _("一定時間、半物質化し壁を通り抜けられるようになる。", "Gives ability to pass walls for a while.");
5570 int base = plev / 2;
5572 if (info) return info_duration(base, base);
5576 set_kabenuke(randint1(base) + base, FALSE);
5582 if (name) return _("盾磨き", "Polish Shield");
5583 if (desc) return _("盾に反射の属性をつける。", "Makes a shield a shield of reflection.");
5594 if (name) return _("ゴーレム製造", "Create Golem");
5595 if (desc) return _("1体のゴーレムを製造する。", "Creates a golem.");
5600 if (summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_GOLEM, PM_FORCE_PET))
5602 msg_print(_("ゴーレムを作った。", "You make a golem."));
5606 msg_print(_("うまくゴーレムを作れなかった。", "No Golems arrive."));
5613 if (name) return _("魔法の鎧", "Magical armor");
5614 if (desc) return _("一定時間、魔法防御力とACが上がり、混乱と盲目の耐性、反射能力、麻痺知らず、浮遊を得る。",
5615 "Gives resistance to magic, bonus to AC, resistance to confusion, blindness, reflection, free action and levitation for a while.");
5620 if (info) return info_duration(base, base);
5624 set_magicdef(randint1(base) + base, FALSE);
5630 if (name) return _("装備無力化", "Remove Enchantment");
5631 if (desc) return _("武器・防具にかけられたあらゆる魔力を完全に解除する。", "Removes all magics completely from any weapon or armor.");
5636 if (!mundane_spell(TRUE)) return NULL;
5642 if (name) return _("呪い粉砕", "Remove All Curse");
5643 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
5648 if (remove_all_curse())
5650 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
5657 if (name) return _("完全なる知識", "Knowledge True");
5658 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
5663 if (!identify_fully(FALSE)) return NULL;
5669 if (name) return _("武器強化", "Enchant Weapon");
5670 if (desc) return _("武器の命中率修正とダメージ修正を強化する。", "Attempts to increase +to-hit, +to-dam of a weapon.");
5675 if (!enchant_spell(randint0(4) + 1, randint0(4) + 1, 0)) return NULL;
5681 if (name) return _("防具強化", "Enchant Armor");
5682 if (desc) return _("鎧の防御修正を強化する。", "Attempts to increase +AC of an armor.");
5687 if (!enchant_spell(0, 0, randint0(3) + 2)) return NULL;
5693 if (name) return _("武器属性付与", "Brand Weapon");
5694 if (desc) return _("武器にランダムに属性をつける。", "Makes current weapon a random ego weapon.");
5699 brand_weapon(randint0(18));
5705 if (name) return _("人間トランプ", "Living Trump");
5706 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",
5707 "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");
5715 /* Teleport control */
5718 /* Random teleportation (uncontrolled) */
5721 /* Gain the mutation */
5722 if (gain_random_mutation(mutation))
5724 msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));
5731 if (name) return _("属性への免疫", "Immunity");
5732 if (desc) return _("一定時間、冷気、炎、電撃、酸のいずれかに対する免疫を得る。",
5733 "Gives an immunity to fire, cold, electricity or acid for a while.");
5738 if (info) return info_duration(base, base);
5742 if (!choose_ele_immune(base + randint1(base))) return NULL;
5752 * @brief 悪魔領域魔法の各処理を行う
5754 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
5755 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
5757 static cptr do_daemon_spell(int spell, int mode)
5759 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
5760 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
5761 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
5762 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
5763 static const char s_dam[] = _("損傷:", "dam ");
5766 int plev = p_ptr->lev;
5771 if (name) return _("マジック・ミサイル", "Magic Missile");
5772 if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");
5775 int dice = 3 + (plev - 1) / 5;
5778 if (info) return info_damage(dice, sides, 0);
5782 if (!get_aim_dir(&dir)) return NULL;
5784 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));
5790 if (name) return _("無生命感知", "Detect Unlife");
5791 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
5794 int rad = DETECT_RAD_DEFAULT;
5796 if (info) return info_radius(rad);
5800 detect_monsters_nonliving(rad);
5806 if (name) return _("邪なる祝福", "Evil Bless");
5807 if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
5812 if (info) return info_duration(base, base);
5816 set_blessed(randint1(base) + base, FALSE);
5822 if (name) return _("耐火炎", "Resist Fire");
5823 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
5824 "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");
5829 if (info) return info_duration(base, base);
5833 set_oppose_fire(randint1(base) + base, FALSE);
5839 if (name) return _("恐慌", "Horrify");
5840 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
5845 if (info) return info_power(power);
5849 if (!get_aim_dir(&dir)) return NULL;
5851 fear_monster(dir, power);
5852 stun_monster(dir, power);
5858 if (name) return _("地獄の矢", "Nether Bolt");
5859 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
5862 int dice = 6 + (plev - 5) / 4;
5865 if (info) return info_damage(dice, sides, 0);
5869 if (!get_aim_dir(&dir)) return NULL;
5871 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
5877 if (name) return _("古代の死霊召喚", "Summon Manes");
5878 if (desc) return _("古代の死霊を召喚する。", "Summons a manes.");
5883 if (!summon_specific(-1, p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET)))
5885 msg_print(_("古代の死霊は現れなかった。", "No Manes arrive."));
5892 if (name) return _("地獄の焔", "Hellish Flame");
5893 if (desc) return _("邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",
5894 "Fires a ball of evil power. Hurts good monsters greatly.");
5899 int rad = (plev < 30) ? 2 : 3;
5902 if (p_ptr->pclass == CLASS_MAGE ||
5903 p_ptr->pclass == CLASS_HIGH_MAGE ||
5904 p_ptr->pclass == CLASS_SORCERER)
5905 base = plev + plev / 2;
5907 base = plev + plev / 4;
5910 if (info) return info_damage(dice, sides, base);
5914 if (!get_aim_dir(&dir)) return NULL;
5916 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides) + base, rad);
5922 if (name) return _("デーモン支配", "Dominate Demon");
5923 if (desc) return _("悪魔1体を魅了する。抵抗されると無効", "Attempts to charm a demon.");
5928 if (info) return info_power(power);
5932 if (!get_aim_dir(&dir)) return NULL;
5934 control_one_demon(dir, power);
5940 if (name) return _("ビジョン", "Vision");
5941 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
5944 int rad = DETECT_RAD_MAP;
5946 if (info) return info_radius(rad);
5956 if (name) return _("耐地獄", "Resist Nether");
5957 if (desc) return _("一定時間、地獄への耐性を得る。", "Gives resistance to nether for a while.");
5962 if (info) return info_duration(base, base);
5966 set_tim_res_nether(randint1(base) + base, FALSE);
5972 if (name) return _("プラズマ・ボルト", "Plasma bolt");
5973 if (desc) return _("プラズマのボルトもしくはビームを放つ。", "Fires a bolt or beam of plasma.");
5976 int dice = 11 + (plev - 5) / 4;
5979 if (info) return info_damage(dice, sides, 0);
5983 if (!get_aim_dir(&dir)) return NULL;
5985 fire_bolt_or_beam(beam_chance(), GF_PLASMA, dir, damroll(dice, sides));
5991 if (name) return _("ファイア・ボール", "Fire Ball");
5992 if (desc) return _("炎の球を放つ。", "Fires a ball of fire.");
5995 int dam = plev + 55;
5998 if (info) return info_damage(0, 0, dam);
6002 if (!get_aim_dir(&dir)) return NULL;
6004 fire_ball(GF_FIRE, dir, dam, rad);
6010 if (name) return _("炎の刃", "Fire Branding");
6011 if (desc) return _("武器に炎の属性をつける。", "Makes current weapon fire branded.");
6022 if (name) return _("地獄球", "Nether Ball");
6023 if (desc) return _("大きな地獄の球を放つ。", "Fires a huge ball of nether.");
6026 int dam = plev * 3 / 2 + 100;
6027 int rad = plev / 20 + 2;
6029 if (info) return info_damage(0, 0, dam);
6033 if (!get_aim_dir(&dir)) return NULL;
6035 fire_ball(GF_NETHER, dir, dam, rad);
6041 if (name) return _("デーモン召喚", "Summon Demon");
6042 if (desc) return _("悪魔1体を召喚する。", "Summons a demon.");
6047 bool pet = !one_in_(3);
6050 if (pet) flg |= PM_FORCE_PET;
6051 else flg |= PM_NO_PET;
6052 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
6054 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, plev*2/3+randint1(plev/2), SUMMON_DEMON, flg))
6056 msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));
6060 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
6064 msg_print(_("「卑しき者よ、我は汝の下僕にあらず! お前の魂を頂くぞ!」",
6065 "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));
6070 msg_print(_("悪魔は現れなかった。", "No demons arrive."));
6078 if (name) return _("悪魔の目", "Devilish Eye");
6079 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
6085 if (info) return info_duration(base, sides);
6089 set_tim_esp(randint1(sides) + base, FALSE);
6095 if (name) return _("悪魔のクローク", "Devil Cloak");
6096 if (desc) return _("恐怖を取り除き、一定時間、炎と冷気の耐性、炎のオーラを得る。耐性は装備による耐性に累積する。",
6097 "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.");
6100 TIME_EFFECT base = 20;
6102 if (info) return info_duration(base, base);
6106 TIME_EFFECT dur = randint1(base) + base;
6108 set_oppose_fire(dur, FALSE);
6109 set_oppose_cold(dur, FALSE);
6110 set_tim_sh_fire(dur, FALSE);
6118 if (name) return _("溶岩流", "The Flow of Lava");
6119 if (desc) return _("自分を中心とした炎の球を作り出し、床を溶岩に変える。",
6120 "Generates a ball of fire centered on you which transforms floors to magma.");
6123 int dam = (55 + plev) * 2;
6126 if (info) return info_damage(0, 0, dam/2);
6130 fire_ball(GF_FIRE, 0, dam, rad);
6131 fire_ball_hide(GF_LAVA_FLOW, 0, 2 + randint1(2), rad);
6137 if (name) return _("プラズマ球", "Plasma Ball");
6138 if (desc) return _("プラズマの球を放つ。", "Fires a ball of plasma.");
6141 int dam = plev * 3 / 2 + 80;
6142 int rad = 2 + plev / 40;
6144 if (info) return info_damage(0, 0, dam);
6148 if (!get_aim_dir(&dir)) return NULL;
6150 fire_ball(GF_PLASMA, dir, dam, rad);
6156 if (name) return _("悪魔変化", "Polymorph Demon");
6157 if (desc) return _("一定時間、悪魔に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔としての能力を得る。",
6158 "Mimic a demon for a while. Loses abilities of original race and gets abilities as a demon.");
6161 int base = 10 + plev / 2;
6163 if (info) return info_duration(base, base);
6167 set_mimic(base + randint1(base), MIMIC_DEMON, FALSE);
6173 if (name) return _("地獄の波動", "Nather Wave");
6174 if (desc) return _("視界内の全てのモンスターにダメージを与える。善良なモンスターに特に大きなダメージを与える。",
6175 "Damages all monsters in sight. Hurts good monsters greatly.");
6178 int sides1 = plev * 2;
6179 int sides2 = plev * 2;
6181 if (info) return format("%sd%d+d%d", s_dam, sides1, sides2);
6185 dispel_monsters(randint1(sides1));
6186 dispel_good(randint1(sides2));
6192 if (name) return _("サキュバスの接吻", "Kiss of Succubus");
6193 if (desc) return _("因果混乱の球を放つ。", "Fires a ball of nexus.");
6196 int dam = 100 + plev * 2;
6199 if (info) return info_damage(0, 0, dam);
6203 if (!get_aim_dir(&dir)) return NULL;
6204 fire_ball(GF_NEXUS, dir, dam, rad);
6210 if (name) return _("破滅の手", "Doom Hand");
6211 if (desc) return _("破滅の手を放つ。食らったモンスターはそのときのHPの半分前後のダメージを受ける。", "Attempts to make a monster's HP almost half.");
6216 if (!get_aim_dir(&dir))
6219 msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));
6221 fire_ball_hide(GF_HAND_DOOM, dir, plev * 2, 0);
6227 if (name) return _("士気高揚", "Raise the Morale");
6228 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
6233 if (info) return info_duration(base, base);
6237 set_hero(randint1(base) + base, FALSE);
6245 if (name) return _("不滅の肉体", "Immortal Body");
6246 if (desc) return _("一定時間、時間逆転への耐性を得る。", "Gives resistance to time for a while.");
6251 if (info) return info_duration(base, base);
6255 set_tim_res_time(randint1(base)+base, FALSE);
6261 if (name) return _("狂気の円環", "Insanity Circle");
6262 if (desc) return _("自分を中心としたカオスの球、混乱の球を発生させ、近くのモンスターを魅了する。",
6263 "Generate balls of chaos, confusion and charm centered on you.");
6266 int dam = 50 + plev;
6267 int power = 20 + plev;
6268 int rad = 3 + plev / 20;
6270 if (info) return format("%s%d+%d", s_dam, dam/2, dam/2);
6274 fire_ball(GF_CHAOS, 0, dam, rad);
6275 fire_ball(GF_CONFUSION, 0, dam, rad);
6276 fire_ball(GF_CHARM, 0, power, rad);
6282 if (name) return _("ペット爆破", "Explode Pets");
6283 if (desc) return _("全てのペットを強制的に爆破させる。", "Makes all pets explode.");
6294 if (name) return _("グレーターデーモン召喚", "Summon Greater Demon");
6295 if (desc) return _("上級デーモンを召喚する。召喚するには人間('p','h','t'で表されるモンスター)の死体を捧げなければならない。",
6296 "Summons greater demon. It need to sacrifice a corpse of human ('p','h' or 't').");
6301 if (!cast_summon_greater_demon()) return NULL;
6307 if (name) return _("地獄嵐", "Nether Storm");
6308 if (desc) return _("超巨大な地獄の球を放つ。", "Generate a huge ball of nether.");
6311 int dam = plev * 15;
6314 if (info) return info_damage(0, 0, dam);
6318 if (!get_aim_dir(&dir)) return NULL;
6320 fire_ball(GF_NETHER, dir, dam, rad);
6326 if (name) return _("血の呪い", "Bloody Curse");
6327 if (desc) return _("自分がダメージを受けることによって対象に呪いをかけ、ダメージを与え様々な効果を引き起こす。",
6328 "Puts blood curse which damages and causes various effects on a monster. You also take damage.");
6334 if (info) return info_damage(0, 0, dam);
6338 if (!get_aim_dir(&dir)) return NULL;
6340 fire_ball_hide(GF_BLOOD_CURSE, dir, dam, rad);
6341 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("血の呪い", "Blood curse"), -1);
6347 if (name) return _("魔王変化", "Polymorph Demonlord");
6348 if (desc) return _("悪魔の王に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔の王としての能力を得、壁を破壊しながら歩く。",
6349 "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.");
6354 if (info) return info_duration(base, base);
6358 set_mimic(base + randint1(base), MIMIC_DEMON_LORD, FALSE);
6368 * @brief 破邪領域魔法の各処理を行う
6370 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
6371 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
6373 static cptr do_crusade_spell(int spell, int mode)
6375 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
6376 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
6377 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
6378 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
6381 int plev = p_ptr->lev;
6386 if (name) return _("懲罰", "Punishment");
6387 if (desc) return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");
6390 int dice = 3 + (plev - 1) / 5;
6393 if (info) return info_damage(dice, sides, 0);
6397 if (!get_aim_dir(&dir)) return NULL;
6399 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));
6405 if (name) return _("邪悪存在感知", "Detect Evil");
6406 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
6409 int rad = DETECT_RAD_DEFAULT;
6411 if (info) return info_radius(rad);
6415 detect_monsters_evil(rad);
6421 if (name) return _("恐怖除去", "Remove Fear");
6422 if (desc) return _("恐怖を取り除く。", "Removes fear.");
6433 if (name) return _("威圧", "Scare Monster");
6434 if (desc) return _("モンスター1体を恐怖させる。抵抗されると無効。", "Attempts to scare a monster.");
6439 if (info) return info_power(power);
6443 if (!get_aim_dir(&dir)) return NULL;
6445 fear_monster(dir, power);
6451 if (name) return _("聖域", "Sanctuary");
6452 if (desc) return _("隣接した全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep monsters in the adjacent squares.");
6457 if (info) return info_power(power);
6461 sleep_monsters_touch();
6467 if (name) return _("入口", "Portal");
6468 if (desc) return _("中距離のテレポートをする。", "Teleport medium distance.");
6471 POSITION range = 25 + plev / 2;
6473 if (info) return info_range(range);
6477 teleport_player(range, 0L);
6483 if (name) return _("スターダスト", "Star Dust");
6484 if (desc) return _("ターゲット付近に閃光のボルトを連射する。", "Fires many bolts of light near the target.");
6487 int dice = 3 + (plev - 1) / 9;
6490 if (info) return info_multi_damage_dice(dice, sides);
6494 if (!get_aim_dir(&dir)) return NULL;
6495 fire_blast(GF_LITE, dir, dice, sides, 10, 3);
6501 if (name) return _("身体浄化", "Purify");
6502 if (desc) return _("傷、毒、朦朧から全快する。", "Heals all cut, stun and poison status.");
6515 if (name) return _("邪悪飛ばし", "Scatter Evil");
6516 if (desc) return _("邪悪なモンスター1体をテレポートさせる。抵抗されると無効。", "Attempts to teleport an evil monster away.");
6519 int power = MAX_SIGHT * 5;
6521 if (info) return info_power(power);
6525 if (!get_aim_dir(&dir)) return NULL;
6526 fire_ball(GF_AWAY_EVIL, dir, power, 0);
6532 if (name) return _("聖なる光球", "Holy Orb");
6533 if (desc) return _("聖なる力をもつ宝珠を放つ。邪悪なモンスターに対して大きなダメージを与えるが、善良なモンスターには効果がない。",
6534 "Fires a ball with holy power. Hurts evil monsters greatly, but don't effect good monsters.");
6539 int rad = (plev < 30) ? 2 : 3;
6542 if (p_ptr->pclass == CLASS_PRIEST ||
6543 p_ptr->pclass == CLASS_HIGH_MAGE ||
6544 p_ptr->pclass == CLASS_SORCERER)
6545 base = plev + plev / 2;
6547 base = plev + plev / 4;
6550 if (info) return info_damage(dice, sides, base);
6554 if (!get_aim_dir(&dir)) return NULL;
6556 fire_ball(GF_HOLY_FIRE, dir, damroll(dice, sides) + base, rad);
6562 if (name) return _("悪魔払い", "Exorcism");
6563 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与え、邪悪なモンスターを恐怖させる。",
6564 "Damages all undead and demons in sight, and scares all evil monsters in sight.");
6570 if (info) return info_damage(1, sides, 0);
6574 dispel_undead(randint1(sides));
6575 dispel_demons(randint1(sides));
6582 if (name) return _("解呪", "Remove Curse");
6583 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
6590 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
6597 if (name) return _("透明視認", "Sense Unseen");
6598 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
6603 if (info) return info_duration(base, base);
6607 set_tim_invis(randint1(base) + base, FALSE);
6613 if (name) return _("対邪悪結界", "Protection from Evil");
6614 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");
6618 int sides = 3 * plev;
6620 if (info) return info_duration(base, sides);
6624 set_protevil(randint1(sides) + base, FALSE);
6630 if (name) return _("裁きの雷", "Judgment Thunder");
6631 if (desc) return _("強力な電撃のボルトを放つ。", "Fires a powerful bolt of lightning.");
6636 if (info) return info_damage(0, 0, dam);
6640 if (!get_aim_dir(&dir)) return NULL;
6641 fire_bolt(GF_ELEC, dir, dam);
6647 if (name) return _("聖なる御言葉", "Holy Word");
6648 if (desc) return _("視界内の邪悪な存在に大きなダメージを与え、体力を回復し、毒、恐怖、朦朧状態、負傷から全快する。",
6649 "Damages all evil monsters in sight, heals HP somewhat, and completely heals poison, fear, stun and cut status.");
6652 int dam_sides = plev * 6;
6655 if (info) return format(_("損:1d%d/回%d", "dam:d%d/h%d"), dam_sides, heal);
6658 dispel_evil(randint1(dam_sides));
6669 if (name) return _("開かれた道", "Unbarring Ways");
6670 if (desc) return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");
6675 if (!get_aim_dir(&dir)) return NULL;
6683 if (name) return _("封魔", "Arrest");
6684 if (desc) return _("邪悪なモンスターの動きを止める。", "Attempts to paralyze an evil monster.");
6687 int power = plev * 2;
6689 if (info) return info_power(power);
6693 if (!get_aim_dir(&dir)) return NULL;
6700 if (name) return _("聖なるオーラ", "Holy Aura");
6701 if (desc) return _("一定時間、邪悪なモンスターを傷つける聖なるオーラを得る。",
6702 "Gives aura of holy power which injures evil monsters which attacked you for a while.");
6707 if (info) return info_duration(base, base);
6711 set_tim_sh_holy(randint1(base) + base, FALSE);
6717 if (name) return _("アンデッド&悪魔退散", "Dispel Undead & Demons");
6718 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与える。", "Damages all undead and demons in sight.");
6721 int sides = plev * 4;
6723 if (info) return info_damage(1, sides, 0);
6727 dispel_undead(randint1(sides));
6728 dispel_demons(randint1(sides));
6734 if (name) return _("邪悪退散", "Dispel Evil");
6735 if (desc) return _("視界内の全ての邪悪なモンスターにダメージを与える。", "Damages all evil monsters in sight.");
6738 int sides = plev * 4;
6740 if (info) return info_damage(1, sides, 0);
6744 dispel_evil(randint1(sides));
6750 if (name) return _("聖なる刃", "Holy Blade");
6751 if (desc) return _("通常の武器に滅邪の属性をつける。", "Makes current weapon especially deadly against evil monsters.");
6762 if (name) return _("スターバースト", "Star Burst");
6763 if (desc) return _("巨大な閃光の球を放つ。", "Fires a huge ball of powerful light.");
6766 int dam = 100 + plev * 2;
6769 if (info) return info_damage(0, 0, dam);
6773 if (!get_aim_dir(&dir)) return NULL;
6775 fire_ball(GF_LITE, dir, dam, rad);
6781 if (name) return _("天使召喚", "Summon Angel");
6782 if (desc) return _("天使を1体召喚する。", "Summons an angel.");
6787 bool pet = !one_in_(3);
6790 if (pet) flg |= PM_FORCE_PET;
6791 else flg |= PM_NO_PET;
6792 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
6794 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_ANGEL, flg))
6798 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
6802 msg_print(_("「我は汝の下僕にあらず! 悪行者よ、悔い改めよ!」", "Mortal! Repent of thy impiousness."));
6810 if (name) return _("士気高揚", "Heroism");
6811 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
6816 if (info) return info_duration(base, base);
6820 set_hero(randint1(base) + base, FALSE);
6828 if (name) return _("呪い退散", "Dispel Curse");
6829 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
6834 if (remove_all_curse())
6836 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
6843 if (name) return _("邪悪追放", "Banish Evil");
6844 if (desc) return _("視界内の全ての邪悪なモンスターをテレポートさせる。抵抗されると無効。",
6845 "Teleports all evil monsters in sight away unless resisted.");
6850 if (info) return info_power(power);
6854 if (banish_evil(power))
6856 msg_print(_("神聖な力が邪悪を打ち払った!", "The holy power banishes evil!"));
6863 if (name) return _("ハルマゲドン", "Armageddon");
6864 if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroy everything in nearby area.");
6872 destroy_area(p_ptr->y, p_ptr->x, base + randint1(sides), FALSE);
6878 if (name) return _("目には目を", "An Eye for an Eye");
6879 if (desc) return _("一定時間、自分がダメージを受けたときに攻撃を行ったモンスターに対して同等のダメージを与える。",
6880 "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.");
6885 if (info) return info_duration(base, base);
6889 set_tim_eyeeye(randint1(base) + base, FALSE);
6895 if (name) return _("神の怒り", "Wrath of the God");
6896 if (desc) return _("ターゲットの周囲に分解の球を多数落とす。", "Drops many balls of disintegration near the target.");
6899 int dam = plev * 3 + 25;
6902 if (info) return info_multi_damage(dam);
6906 if (!cast_wrath_of_the_god(dam, rad)) return NULL;
6912 if (name) return _("神威", "Divine Intervention");
6913 if (desc) return _("隣接するモンスターに聖なるダメージを与え、視界内のモンスターにダメージ、減速、朦朧、混乱、恐怖、眠りを与える。さらに体力を回復する。",
6914 "Damages all adjacent monsters with holy power. Damages and attempt to slow, stun, confuse, scare and freeze all monsters in sight. And heals HP.");
6917 int b_dam = plev * 11;
6918 int d_dam = plev * 4;
6920 int power = plev * 4;
6922 if (info) return format(_("回%d/損%d+%d", "h%d/dm%d+%d"), heal, d_dam, b_dam/2);
6925 project(0, 1, p_ptr->y, p_ptr->x, b_dam, GF_HOLY_FIRE, PROJECT_KILL, -1);
6926 dispel_monsters(d_dam);
6927 slow_monsters(plev);
6928 stun_monsters(power);
6929 confuse_monsters(power);
6930 turn_monsters(power);
6931 stasis_monsters(power);
6938 if (name) return _("聖戦", "Crusade");
6939 if (desc) return _("視界内の善良なモンスターをペットにしようとし、ならなかった場合及び善良でないモンスターを恐怖させる。さらに多数の加速された騎士を召喚し、ヒーロー、祝福、加速、対邪悪結界を得る。",
6940 "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.");
6946 int sp_sides = 20 + plev;
6951 for (i = 0; i < 12; i++)
6954 POSITION my = 0, mx = 0;
6958 scatter(&my, &mx, p_ptr->y, p_ptr->x, 4, 0);
6960 /* Require empty grids */
6961 if (cave_empty_bold2(my, mx)) break;
6963 if (attempt < 0) continue;
6964 summon_specific(-1, my, mx, plev, SUMMON_KNIGHTS, (PM_ALLOW_GROUP | PM_FORCE_PET | PM_HASTE));
6966 set_hero(randint1(base) + base, FALSE);
6967 set_blessed(randint1(base) + base, FALSE);
6968 set_fast(randint1(sp_sides) + sp_base, FALSE);
6969 set_protevil(randint1(base) + base, FALSE);
6983 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP)
6984 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
6986 static cptr do_music_spell(MAGIC_NUM2 spell, int mode)
6988 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
6989 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
6990 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
6991 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
6992 bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
6993 bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
6994 bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
6995 static const char s_dam[] = _("損傷:", "dam ");
6998 int plev = p_ptr->lev;
7003 if (name) return _("遅鈍の歌", "Song of Holding");
7004 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
7006 /* Stop singing before start another */
7007 if (cast || fail) stop_singing();
7011 msg_print(_("ゆっくりとしたメロディを口ずさみ始めた...", "You start humming a slow, steady melody..."));
7012 start_singing(spell, MUSIC_SLOW);
7018 if (info) return info_power(power);
7022 slow_monsters(plev);
7028 if (name) return _("祝福の歌", "Song of Blessing");
7029 if (desc) return _("命中率とACのボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
7031 /* Stop singing before start another */
7032 if (cast || fail) stop_singing();
7036 msg_print(_("厳かなメロディを奏で始めた...", "The holy power of the Music of the Ainur enters you..."));
7037 start_singing(spell, MUSIC_BLESS);
7042 if (!p_ptr->blessed)
7044 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
7051 if (name) return _("崩壊の音色", "Wrecking Note");
7052 if (desc) return _("轟音のボルトを放つ。", "Fires a bolt of sound.");
7054 /* Stop singing before start another */
7055 if (cast || fail) stop_singing();
7058 int dice = 4 + (plev - 1) / 5;
7061 if (info) return info_damage(dice, sides, 0);
7065 if (!get_aim_dir(&dir)) return NULL;
7067 fire_bolt(GF_SOUND, dir, damroll(dice, sides));
7073 if (name) return _("朦朧の旋律", "Stun Pattern");
7074 if (desc) return _("視界内の全てのモンスターを朦朧させる。抵抗されると無効。", "Attempts to stun all monsters in sight.");
7076 /* Stop singing before start another */
7077 if (cast || fail) stop_singing();
7081 msg_print(_("眩惑させるメロディを奏で始めた...", "You weave a pattern of sounds to bewilder and daze..."));
7082 start_singing(spell, MUSIC_STUN);
7086 int dice = plev / 10;
7089 if (info) return info_power_dice(dice, sides);
7093 stun_monsters(damroll(dice, sides));
7100 if (name) return _("生命の流れ", "Flow of Life");
7101 if (desc) return _("体力を少し回復させる。", "Heals HP a little.");
7103 /* Stop singing before start another */
7104 if (cast || fail) stop_singing();
7108 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing a song of healing..."));
7109 start_singing(spell, MUSIC_L_LIFE);
7116 if (info) return info_heal(dice, sides, 0);
7120 hp_player(damroll(dice, sides));
7127 if (name) return _("太陽の歌", "Song of the Sun");
7128 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
7130 /* Stop singing before start another */
7131 if (cast || fail) stop_singing();
7135 int sides = plev / 2;
7136 int rad = plev / 10 + 1;
7138 if (info) return info_damage(dice, sides, 0);
7142 msg_print(_("光り輝く歌が辺りを照らした。", "Your uplifting song brings brightness to dark places..."));
7143 lite_area(damroll(dice, sides), rad);
7149 if (name) return _("恐怖の歌", "Song of Fear");
7150 if (desc) return _("視界内の全てのモンスターを恐怖させる。抵抗されると無効。", "Attempts to scare all monsters in sight.");
7152 /* Stop singing before start another */
7153 if (cast || fail) stop_singing();
7157 msg_print(_("おどろおどろしいメロディを奏で始めた...", "You start weaving a fearful pattern..."));
7158 start_singing(spell, MUSIC_FEAR);
7164 if (info) return info_power(power);
7168 project_hack(GF_TURN_ALL, power);
7175 if (name) return _("戦いの歌", "Heroic Ballad");
7176 if (desc) return _("ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
7178 /* Stop singing before start another */
7179 if (cast || fail) stop_singing();
7183 msg_print(_("激しい戦いの歌を歌った...", "You start singing a song of intense fighting..."));
7185 (void)hp_player(10);
7186 (void)set_afraid(0);
7188 /* Recalculate hitpoints */
7189 p_ptr->update |= (PU_HP);
7191 start_singing(spell, MUSIC_HERO);
7198 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
7199 /* Recalculate hitpoints */
7200 p_ptr->update |= (PU_HP);
7207 if (name) return _("霊的知覚", "Clairaudience");
7208 if (desc) return _("近くの罠/扉/階段を感知する。レベル15で全てのモンスター、20で財宝とアイテムを感知できるようになる。レベル25で周辺の地形を感知し、40でその階全体を永久に照らし、ダンジョン内のすべてのアイテムを感知する。この効果は歌い続けることで順に起こる。",
7209 "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.");
7211 /* Stop singing before start another */
7212 if (cast || fail) stop_singing();
7216 msg_print(_("静かな音楽が感覚を研ぎ澄まさせた...", "Your quiet music sharpens your sense of hearing..."));
7217 /* Hack -- Initialize the turn count */
7218 p_ptr->magic_num1[2] = 0;
7220 start_singing(spell, MUSIC_DETECT);
7224 int rad = DETECT_RAD_DEFAULT;
7226 if (info) return info_radius(rad);
7230 int count = p_ptr->magic_num1[2];
7232 if (count >= 19) wiz_lite(FALSE);
7236 if (plev > 39 && count < 19)
7237 p_ptr->magic_num1[2] = count + 1;
7241 /* There are too many hidden treasure. So... */
7242 /* detect_treasure(rad); */
7243 detect_objects_gold(rad);
7244 detect_objects_normal(rad);
7246 if (plev > 24 && count < 11)
7247 p_ptr->magic_num1[2] = count + 1;
7251 detect_monsters_invis(rad);
7252 detect_monsters_normal(rad);
7254 if (plev > 19 && count < 6)
7255 p_ptr->magic_num1[2] = count + 1;
7257 detect_traps(rad, TRUE);
7261 if (plev > 14 && count < 3)
7262 p_ptr->magic_num1[2] = count + 1;
7269 if (name) return _("魂の歌", "Soul Shriek");
7270 if (desc) return _("視界内の全てのモンスターに対して精神攻撃を行う。", "Damages all monsters in sight with PSI damages.");
7272 /* Stop singing before start another */
7273 if (cast || fail) stop_singing();
7277 msg_print(_("精神を捻じ曲げる歌を歌った...", "You start singing a song of soul in pain..."));
7278 start_singing(spell, MUSIC_PSI);
7283 int sides = plev * 3 / 2;
7285 if (info) return info_damage(dice, sides, 0);
7289 project_hack(GF_PSI, damroll(dice, sides));
7296 if (name) return _("知識の歌", "Song of Lore");
7297 if (desc) return _("自分のいるマスと隣りのマスに落ちているアイテムを鑑定する。", "Identifies all items which are in the adjacent squares.");
7299 /* Stop singing before start another */
7300 if (cast || fail) stop_singing();
7304 msg_print(_("この世界の知識が流れ込んできた...", "You recall the rich lore of the world..."));
7305 start_singing(spell, MUSIC_ID);
7311 if (info) return info_radius(rad);
7315 * MP不足で鑑定が発動される前に歌が中断してしまうのを防止。
7319 project(0, rad, p_ptr->y, p_ptr->x, 0, GF_IDENTIFY, PROJECT_ITEM, -1);
7326 if (name) return _("隠遁の歌", "Hiding Tune");
7327 if (desc) return _("隠密行動能力を上昇させる。", "Gives improved stealth.");
7329 /* Stop singing before start another */
7330 if (cast || fail) stop_singing();
7334 msg_print(_("あなたの姿が景色にとけこんでいった...", "Your song carries you beyond the sight of mortal eyes..."));
7335 start_singing(spell, MUSIC_STEALTH);
7340 if (!p_ptr->tim_stealth)
7342 msg_print(_("姿がはっきりと見えるようになった。", "You are no longer hided."));
7349 if (name) return _("幻影の旋律", "Illusion Pattern");
7350 if (desc) return _("視界内の全てのモンスターを混乱させる。抵抗されると無効。", "Attempts to confuse all monsters in sight.");
7352 /* Stop singing before start another */
7353 if (cast || fail) stop_singing();
7357 msg_print(_("辺り一面に幻影が現れた...", "You weave a pattern of sounds to beguile and confuse..."));
7358 start_singing(spell, MUSIC_CONF);
7362 int power = plev * 2;
7364 if (info) return info_power(power);
7368 confuse_monsters(power);
7375 if (name) return _("破滅の叫び", "Doomcall");
7376 if (desc) return _("視界内の全てのモンスターに対して轟音攻撃を行う。", "Damages all monsters in sight with booming sound.");
7378 /* Stop singing before start another */
7379 if (cast || fail) stop_singing();
7383 msg_print(_("轟音が響いた...", "The fury of the Downfall of Numenor lashes out..."));
7384 start_singing(spell, MUSIC_SOUND);
7388 int dice = 10 + plev / 5;
7391 if (info) return info_damage(dice, sides, 0);
7395 project_hack(GF_SOUND, damroll(dice, sides));
7402 if (name) return _("フィリエルの歌", "Firiel's Song");
7403 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
7406 /* Stop singing before start another */
7407 if (cast || fail) stop_singing();
7411 msg_print(_("生命と復活のテーマを奏で始めた...", "The themes of life and revival are woven into your song..."));
7412 animate_dead(0, p_ptr->y, p_ptr->x);
7418 if (name) return _("旅の仲間", "Fellowship Chant");
7419 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
7421 /* Stop singing before start another */
7422 if (cast || fail) stop_singing();
7426 msg_print(_("安らかなメロディを奏で始めた...", "You weave a slow, soothing melody of imploration..."));
7427 start_singing(spell, MUSIC_CHARM);
7431 int dice = 10 + plev / 15;
7434 if (info) return info_power_dice(dice, sides);
7438 charm_monsters(damroll(dice, sides));
7445 if (name) return _("分解音波", "Sound of disintegration");
7446 if (desc) return _("壁を掘り進む。自分の足元のアイテムは蒸発する。", "Makes you be able to burrow into walls. Objects under your feet evaporate.");
7448 /* Stop singing before start another */
7449 if (cast || fail) stop_singing();
7453 msg_print(_("粉砕するメロディを奏で始めた...", "You weave a violent pattern of sounds to break wall."));
7454 start_singing(spell, MUSIC_WALL);
7460 * MP不足で効果が発動される前に歌が中断してしまうのを防止。
7464 project(0, 0, p_ptr->y, p_ptr->x,
7465 0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1);
7471 if (name) return _("元素耐性", "Finrod's Resistance");
7472 if (desc) return _("酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
7473 "Gives resistance to fire, cold, electricity, acid and poison. These resistances can be added to which from equipment for more powerful resistances.");
7475 /* Stop singing before start another */
7476 if (cast || fail) stop_singing();
7480 msg_print(_("元素の力に対する忍耐の歌を歌った。", "You sing a song of perseverance against powers..."));
7481 start_singing(spell, MUSIC_RESIST);
7486 if (!p_ptr->oppose_acid)
7488 msg_print(_("酸への耐性が薄れた気がする。", "You feel less resistant to acid."));
7491 if (!p_ptr->oppose_elec)
7493 msg_print(_("電撃への耐性が薄れた気がする。", "You feel less resistant to elec."));
7496 if (!p_ptr->oppose_fire)
7498 msg_print(_("火への耐性が薄れた気がする。", "You feel less resistant to fire."));
7501 if (!p_ptr->oppose_cold)
7503 msg_print(_("冷気への耐性が薄れた気がする。", "You feel less resistant to cold."));
7506 if (!p_ptr->oppose_pois)
7508 msg_print(_("毒への耐性が薄れた気がする。", "You feel less resistant to pois."));
7515 if (name) return _("ホビットのメロディ", "Hobbit Melodies");
7516 if (desc) return _("加速する。", "Hastes you.");
7518 /* Stop singing before start another */
7519 if (cast || fail) stop_singing();
7523 msg_print(_("軽快な歌を口ずさみ始めた...", "You start singing joyful pop song..."));
7524 start_singing(spell, MUSIC_SPEED);
7531 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
7538 if (name) return _("歪んだ世界", "World Contortion");
7539 if (desc) return _("近くのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all nearby monsters away unless resisted.");
7542 int rad = plev / 15 + 1;
7543 int power = plev * 3 + 1;
7545 if (info) return info_radius(rad);
7547 /* Stop singing before start another */
7548 if (cast || fail) stop_singing();
7552 msg_print(_("歌が空間を歪めた...", "Reality whirls wildly as you sing a dizzying melody..."));
7553 project(0, rad, p_ptr->y, p_ptr->x, power, GF_AWAY_ALL, PROJECT_KILL, -1);
7559 if (name) return _("退散の歌", "Dispelling chant");
7560 if (desc) return _("視界内の全てのモンスターにダメージを与える。邪悪なモンスターに特に大きなダメージを与える。",
7561 "Damages all monsters in sight. Hurts evil monsters greatly.");
7563 /* Stop singing before start another */
7564 if (cast || fail) stop_singing();
7568 msg_print(_("耐えられない不協和音が敵を責め立てた...", "You cry out in an ear-wracking voice..."));
7569 start_singing(spell, MUSIC_DISPEL);
7573 int m_sides = plev * 3;
7574 int e_sides = plev * 3;
7576 if (info) return format("%s1d%d+1d%d", s_dam, m_sides, e_sides);
7580 dispel_monsters(randint1(m_sides));
7581 dispel_evil(randint1(e_sides));
7587 if (name) return _("サルマンの甘言", "The Voice of Saruman");
7588 if (desc) return _("視界内の全てのモンスターを減速させ、眠らせようとする。抵抗されると無効。", "Attempts to slow and sleep all monsters in sight.");
7590 /* Stop singing before start another */
7591 if (cast || fail) stop_singing();
7595 msg_print(_("優しく、魅力的な歌を口ずさみ始めた...", "You start humming a gentle and attractive song..."));
7596 start_singing(spell, MUSIC_SARUMAN);
7602 if (info) return info_power(power);
7606 slow_monsters(plev);
7607 sleep_monsters(plev);
7614 if (name) return _("嵐の音色", "Song of the Tempest");
7615 if (desc) return _("轟音のビームを放つ。", "Fires a beam of sound.");
7618 int dice = 15 + (plev - 1) / 2;
7621 if (info) return info_damage(dice, sides, 0);
7623 /* Stop singing before start another */
7624 if (cast || fail) stop_singing();
7628 if (!get_aim_dir(&dir)) return NULL;
7630 fire_beam(GF_SOUND, dir, damroll(dice, sides));
7636 if (name) return _("もう一つの世界", "Ambarkanta");
7637 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
7643 if (info) return info_delay(base, sides);
7645 /* Stop singing before start another */
7646 if (cast || fail) stop_singing();
7650 msg_print(_("周囲が変化し始めた...", "You sing of the primeval shaping of Middle-earth..."));
7657 if (name) return _("破壊の旋律", "Wrecking Pattern");
7658 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
7659 "Shakes dungeon structure, and results in random swapping of floors and walls.");
7661 /* Stop singing before start another */
7662 if (cast || fail) stop_singing();
7666 msg_print(_("破壊的な歌が響きわたった...", "You weave a pattern of sounds to contort and shatter..."));
7667 start_singing(spell, MUSIC_QUAKE);
7673 if (info) return info_radius(rad);
7677 earthquake(p_ptr->y, p_ptr->x, 10);
7685 if (name) return _("停滞の歌", "Stationary Shriek");
7686 if (desc) return _("視界内の全てのモンスターを麻痺させようとする。抵抗されると無効。", "Attempts to freeze all monsters in sight.");
7688 /* Stop singing before start another */
7689 if (cast || fail) stop_singing();
7693 msg_print(_("ゆっくりとしたメロディを奏で始めた...", "You weave a very slow pattern which is almost likely to stop..."));
7694 start_singing(spell, MUSIC_STASIS);
7698 int power = plev * 4;
7700 if (info) return info_power(power);
7704 stasis_monsters(power);
7711 if (name) return _("守りの歌", "Endurance");
7712 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。",
7713 "Sets a glyph on the floor beneath you. Monsters cannot attack you if you are on a glyph, but can try to break glyph.");
7716 /* Stop singing before start another */
7717 if (cast || fail) stop_singing();
7721 msg_print(_("歌が神聖な場を作り出した...", "The holy power of the Music is creating sacred field..."));
7728 if (name) return _("英雄の詩", "The Hero's Poem");
7729 if (desc) return _("加速し、ヒーロー気分になり、視界内の全てのモンスターにダメージを与える。",
7730 "Hastes you. Gives heroism. Damages all monsters in sight.");
7732 /* Stop singing before start another */
7733 if (cast || fail) stop_singing();
7737 msg_print(_("英雄の歌を口ずさんだ...", "You chant a powerful, heroic call to arms..."));
7738 (void)hp_player(10);
7739 (void)set_afraid(0);
7741 /* Recalculate hitpoints */
7742 p_ptr->update |= (PU_HP);
7744 start_singing(spell, MUSIC_SHERO);
7751 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
7752 /* Recalculate hitpoints */
7753 p_ptr->update |= (PU_HP);
7758 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
7764 int sides = plev * 3;
7766 if (info) return info_damage(dice, sides, 0);
7770 dispel_monsters(damroll(dice, sides));
7776 if (name) return _("ヤヴァンナの助け", "Relief of Yavanna");
7777 if (desc) return _("強力な回復の歌で、負傷と朦朧状態も全快する。", "Powerful healing song. Also heals cut and stun completely.");
7779 /* Stop singing before start another */
7780 if (cast || fail) stop_singing();
7784 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing the song..."));
7785 start_singing(spell, MUSIC_H_LIFE);
7792 if (info) return info_heal(dice, sides, 0);
7796 hp_player(damroll(dice, sides));
7805 if (name) return _("再生の歌", "Goddess' rebirth");
7806 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
7809 /* Stop singing before start another */
7810 if (cast || fail) stop_singing();
7814 msg_print(_("暗黒の中に光と美をふりまいた。体が元の活力を取り戻した。",
7815 "You strewed light and beauty in the dark as you sing. You feel refreshed."));
7816 (void)do_res_stat(A_STR);
7817 (void)do_res_stat(A_INT);
7818 (void)do_res_stat(A_WIS);
7819 (void)do_res_stat(A_DEX);
7820 (void)do_res_stat(A_CON);
7821 (void)do_res_stat(A_CHR);
7822 (void)restore_level();
7828 if (name) return _("サウロンの魔術", "Wizardry of Sauron");
7829 if (desc) return _("非常に強力でごく小さい轟音の球を放つ。", "Fires an extremely powerful tiny ball of sound.");
7832 int dice = 50 + plev;
7836 if (info) return info_damage(dice, sides, 0);
7838 /* Stop singing before start another */
7839 if (cast || fail) stop_singing();
7843 if (!get_aim_dir(&dir)) return NULL;
7845 fire_ball(GF_SOUND, dir, damroll(dice, sides), rad);
7851 if (name) return _("フィンゴルフィンの挑戦", "Fingolfin's Challenge");
7852 if (desc) return _("ダメージを受けなくなるバリアを張る。",
7853 "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks.");
7855 /* Stop singing before start another */
7856 if (cast || fail) stop_singing();
7860 msg_print(_("フィンゴルフィンの冥王への挑戦を歌った...",
7861 "You recall the valor of Fingolfin's challenge to the Dark Lord..."));
7864 p_ptr->redraw |= (PR_MAP);
7866 /* Update monsters */
7867 p_ptr->update |= (PU_MONSTERS);
7870 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
7872 start_singing(spell, MUSIC_INVULN);
7879 msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));
7881 p_ptr->redraw |= (PR_MAP);
7883 /* Update monsters */
7884 p_ptr->update |= (PU_MONSTERS);
7887 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
7900 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_CAST)
7901 * @return SPELL_NAME / SPELL_DESC 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
7903 static cptr do_hissatsu_spell(int spell, int mode)
7905 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
7906 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
7907 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
7910 int plev = p_ptr->lev;
7915 if (name) return _("飛飯綱", "Tobi-Izuna");
7916 if (desc) return _("2マス離れたところにいるモンスターを攻撃する。", "Attacks a two squares distant monster.");
7921 if (!get_aim_dir(&dir)) return NULL;
7923 project_hook(GF_ATTACK, dir, HISSATSU_2, PROJECT_STOP | PROJECT_KILL);
7928 if (name) return _("五月雨斬り", "3-Way Attack");
7929 if (desc) return _("3方向に対して攻撃する。", "Attacks in 3 directions in one time.");
7936 if (!get_rep_dir2(&dir)) return NULL;
7937 if (dir == 5) return NULL;
7939 for (cdir = 0;cdir < 8; cdir++)
7941 if (cdd[cdir] == dir) break;
7944 if (cdir == 8) return NULL;
7946 y = p_ptr->y + ddy_cdd[cdir];
7947 x = p_ptr->x + ddx_cdd[cdir];
7948 if (cave[y][x].m_idx)
7951 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
7953 y = p_ptr->y + ddy_cdd[(cdir + 7) % 8];
7954 x = p_ptr->x + ddx_cdd[(cdir + 7) % 8];
7955 if (cave[y][x].m_idx)
7958 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
7960 y = p_ptr->y + ddy_cdd[(cdir + 1) % 8];
7961 x = p_ptr->x + ddx_cdd[(cdir + 1) % 8];
7962 if (cave[y][x].m_idx)
7965 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
7970 if (name) return _("ブーメラン", "Boomerang");
7971 if (desc) return _("武器を手元に戻ってくるように投げる。戻ってこないこともある。",
7972 "Throws current weapon. And it'll return to your hand unless failed.");
7976 if (!do_cmd_throw_aux(1, TRUE, -1)) return NULL;
7981 if (name) return _("焔霊", "Burning Strike");
7982 if (desc) return _("火炎耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to fire.");
7988 if (!get_rep_dir2(&dir)) return NULL;
7989 if (dir == 5) return NULL;
7991 y = p_ptr->y + ddy[dir];
7992 x = p_ptr->x + ddx[dir];
7994 if (cave[y][x].m_idx)
7995 py_attack(y, x, HISSATSU_FIRE);
7998 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8005 if (name) return _("殺気感知", "Detect Ferocity");
8006 if (desc) return _("近くの思考することができるモンスターを感知する。", "Detects all monsters except mindless in your vicinity.");
8010 detect_monsters_mind(DETECT_RAD_DEFAULT);
8015 if (name) return _("みね打ち", "Strike to Stun");
8016 if (desc) return _("相手にダメージを与えないが、朦朧とさせる。", "Attempts to stun a monster in the adjacent.");
8022 if (!get_rep_dir2(&dir)) return NULL;
8023 if (dir == 5) return NULL;
8025 y = p_ptr->y + ddy[dir];
8026 x = p_ptr->x + ddx[dir];
8028 if (cave[y][x].m_idx)
8029 py_attack(y, x, HISSATSU_MINEUCHI);
8032 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8039 if (name) return _("カウンター", "Counter");
8040 if (desc) return _("相手に攻撃されたときに反撃する。反撃するたびにMPを消費。",
8041 "Prepares to counterattack. When attack by a monster, strikes back using SP each time.");
8047 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
8050 msg_print(_("相手の攻撃に対して身構えた。", "You prepare to counter blow."));
8051 p_ptr->counter = TRUE;
8056 if (name) return _("払い抜け", "Harainuke");
8057 if (desc) return _("攻撃した後、反対側に抜ける。",
8058 "Attacks monster with your weapons normally, then move through counter side of the monster.");
8066 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
8070 if (!get_rep_dir2(&dir)) return NULL;
8072 if (dir == 5) return NULL;
8073 y = p_ptr->y + ddy[dir];
8074 x = p_ptr->x + ddx[dir];
8076 if (!cave[y][x].m_idx)
8078 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8084 if (!player_can_enter(cave[y][x].feat, 0) || is_trap(cave[y][x].feat))
8090 if (player_can_enter(cave[y][x].feat, 0) && !is_trap(cave[y][x].feat) && !cave[y][x].m_idx)
8094 /* Move the player */
8095 (void)move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);
8101 if (name) return _("サーペンツタン", "Serpent's Tongue");
8102 if (desc) return _("毒耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to poison.");
8108 if (!get_rep_dir2(&dir)) return NULL;
8109 if (dir == 5) return NULL;
8111 y = p_ptr->y + ddy[dir];
8112 x = p_ptr->x + ddx[dir];
8114 if (cave[y][x].m_idx)
8115 py_attack(y, x, HISSATSU_POISON);
8118 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8125 if (name) return _("斬魔剣弐の太刀", "Zammaken");
8126 if (desc) return _("生命のない邪悪なモンスターに大ダメージを与えるが、他のモンスターには全く効果がない。",
8127 "Attacks an evil unliving monster with great damage. No effect to other monsters.");
8133 if (!get_rep_dir2(&dir)) return NULL;
8134 if (dir == 5) return NULL;
8136 y = p_ptr->y + ddy[dir];
8137 x = p_ptr->x + ddx[dir];
8139 if (cave[y][x].m_idx)
8140 py_attack(y, x, HISSATSU_ZANMA);
8143 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8150 if (name) return _("裂風剣", "Wind Blast");
8151 if (desc) return _("攻撃した相手を後方へ吹き飛ばす。", "Attacks an adjacent monster, and blow it away.");
8157 if (!get_rep_dir2(&dir)) return NULL;
8158 if (dir == 5) return NULL;
8160 y = p_ptr->y + ddy[dir];
8161 x = p_ptr->x + ddx[dir];
8163 if (cave[y][x].m_idx)
8167 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8170 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
8174 if (cave[y][x].m_idx)
8177 POSITION ty = y, tx = x;
8178 POSITION oy = y, ox = x;
8179 MONSTER_IDX m_idx = cave[y][x].m_idx;
8180 monster_type *m_ptr = &m_list[m_idx];
8183 monster_desc(m_name, m_ptr, 0);
8185 for (i = 0; i < 5; i++)
8189 if (cave_empty_bold(y, x))
8196 if ((ty != oy) || (tx != ox))
8198 msg_format(_("%sを吹き飛ばした!", "You blow %s away!"), m_name);
8199 cave[oy][ox].m_idx = 0;
8200 cave[ty][tx].m_idx = m_idx;
8204 update_mon(m_idx, TRUE);
8208 if (r_info[m_ptr->r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))
8209 p_ptr->update |= (PU_MON_LITE);
8216 if (name) return _("刀匠の目利き", "Judge");
8217 if (desc) return _("武器・防具を1つ識別する。レベル45以上で武器・防具の能力を完全に知ることができる。",
8218 "Identifies a weapon or armor. Or *identifies* these at level 45.");
8224 if (!identify_fully(TRUE)) return NULL;
8228 if (!ident_spell(TRUE)) return NULL;
8234 if (name) return _("破岩斬", "Rock Smash");
8235 if (desc) return _("岩を壊し、岩石系のモンスターに大ダメージを与える。", "Breaks rock. Or greatly damage a monster made by rocks.");
8241 if (!get_rep_dir2(&dir)) return NULL;
8242 if (dir == 5) return NULL;
8244 y = p_ptr->y + ddy[dir];
8245 x = p_ptr->x + ddx[dir];
8247 if (cave[y][x].m_idx)
8248 py_attack(y, x, HISSATSU_HAGAN);
8250 if (!cave_have_flag_bold(y, x, FF_HURT_ROCK)) break;
8252 /* Destroy the feature */
8253 cave_alter_feat(y, x, FF_HURT_ROCK);
8255 /* Update some things */
8256 p_ptr->update |= (PU_FLOW);
8261 if (name) return _("乱れ雪月花", "Midare-Setsugekka");
8262 if (desc) return _("攻撃回数が増え、冷気耐性のないモンスターに大ダメージを与える。",
8263 "Attacks a monster with increased number of attacks and more damage unless it has resistance to cold.");
8269 if (!get_rep_dir2(&dir)) return NULL;
8270 if (dir == 5) return NULL;
8272 y = p_ptr->y + ddy[dir];
8273 x = p_ptr->x + ddx[dir];
8275 if (cave[y][x].m_idx)
8276 py_attack(y, x, HISSATSU_COLD);
8279 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8286 if (name) return _("急所突き", "Spot Aiming");
8287 if (desc) return _("モンスターを一撃で倒す攻撃を繰り出す。失敗すると1点しかダメージを与えられない。",
8288 "Attempts to kill a monster instantly. If failed cause only 1HP of damage.");
8294 if (!get_rep_dir2(&dir)) return NULL;
8295 if (dir == 5) return NULL;
8297 y = p_ptr->y + ddy[dir];
8298 x = p_ptr->x + ddx[dir];
8300 if (cave[y][x].m_idx)
8301 py_attack(y, x, HISSATSU_KYUSHO);
8304 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8311 if (name) return _("魔神斬り", "Majingiri");
8312 if (desc) return _("会心の一撃で攻撃する。攻撃がかわされやすい。",
8313 "Attempts to attack with critical hit. But this attack is easy to evade for a monster.");
8319 if (!get_rep_dir2(&dir)) return NULL;
8320 if (dir == 5) return NULL;
8322 y = p_ptr->y + ddy[dir];
8323 x = p_ptr->x + ddx[dir];
8325 if (cave[y][x].m_idx)
8326 py_attack(y, x, HISSATSU_MAJIN);
8329 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8336 if (name) return _("捨て身", "Desperate Attack");
8337 if (desc) return _("強力な攻撃を繰り出す。次のターンまでの間、食らうダメージが増える。",
8338 "Attacks with all of your power. But all damages you take will be doubled for one turn.");
8344 if (!get_rep_dir2(&dir)) return NULL;
8345 if (dir == 5) return NULL;
8347 y = p_ptr->y + ddy[dir];
8348 x = p_ptr->x + ddx[dir];
8350 if (cave[y][x].m_idx)
8351 py_attack(y, x, HISSATSU_SUTEMI);
8354 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8357 p_ptr->sutemi = TRUE;
8362 if (name) return _("雷撃鷲爪斬", "Lightning Eagle");
8363 if (desc) return _("電撃耐性のないモンスターに非常に大きいダメージを与える。",
8364 "Attacks a monster with more damage unless it has resistance to electricity.");
8370 if (!get_rep_dir2(&dir)) return NULL;
8371 if (dir == 5) return NULL;
8373 y = p_ptr->y + ddy[dir];
8374 x = p_ptr->x + ddx[dir];
8376 if (cave[y][x].m_idx)
8377 py_attack(y, x, HISSATSU_ELEC);
8380 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8387 if (name) return _("入身", "Rush Attack");
8388 if (desc) return _("素早く相手に近寄り攻撃する。", "Steps close to a monster and attacks at a time.");
8392 if (!rush_attack(NULL)) return NULL;
8397 if (name) return _("赤流渦", "Bloody Maelstrom");
8398 if (desc) return _("自分自身も傷を作りつつ、その傷が深いほど大きい威力で全方向の敵を攻撃できる。生きていないモンスターには効果がない。",
8399 "Attacks all adjacent monsters with power corresponding to your cut status. Then increases your cut status. No effect to unliving monsters.");
8406 monster_type *m_ptr;
8408 if (p_ptr->cut < 300)
8409 set_cut(p_ptr->cut + 300);
8411 set_cut(p_ptr->cut * 2);
8413 for (dir = 0; dir < 8; dir++)
8415 y = p_ptr->y + ddy_ddd[dir];
8416 x = p_ptr->x + ddx_ddd[dir];
8417 c_ptr = &cave[y][x];
8419 /* Get the monster */
8420 m_ptr = &m_list[c_ptr->m_idx];
8422 /* Hack -- attack monsters */
8423 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
8425 if (!monster_living(&r_info[m_ptr->r_idx]))
8429 monster_desc(m_name, m_ptr, 0);
8430 msg_format(_("%sには効果がない!", "%s is unharmed!"), m_name);
8432 else py_attack(y, x, HISSATSU_SEKIRYUKA);
8439 if (name) return _("激震撃", "Earthquake Blow");
8440 if (desc) return _("地震を起こす。", "Shakes dungeon structure, and results in random swapping of floors and walls.");
8446 if (!get_rep_dir2(&dir)) return NULL;
8447 if (dir == 5) return NULL;
8449 y = p_ptr->y + ddy[dir];
8450 x = p_ptr->x + ddx[dir];
8452 if (cave[y][x].m_idx)
8453 py_attack(y, x, HISSATSU_QUAKE);
8455 earthquake(p_ptr->y, p_ptr->x, 10);
8460 if (name) return _("地走り", "Crack");
8461 if (desc) return _("衝撃波のビームを放つ。", "Fires a beam of shock wave.");
8465 int total_damage = 0, basedam, i;
8466 u32b flgs[TR_FLAG_SIZE];
8468 if (!get_aim_dir(&dir)) return NULL;
8469 msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
8470 for (i = 0; i < 2; i++)
8474 if (!buki_motteruka(INVEN_RARM+i)) break;
8475 o_ptr = &inventory[INVEN_RARM+i];
8476 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
8477 damage = o_ptr->to_d * 100;
8478 object_flags(o_ptr, flgs);
8479 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
8485 else if (have_flag(flgs, TR_VORPAL))
8487 /* vorpal flag only */
8492 damage *= p_ptr->num_blow[i];
8493 total_damage += damage / 200;
8494 if (i) total_damage = total_damage*7/10;
8496 fire_beam(GF_FORCE, dir, total_damage);
8501 if (name) return _("気迫の雄叫び", "War Cry");
8502 if (desc) return _("視界内の全モンスターに対して轟音の攻撃を行う。さらに、近くにいるモンスターを怒らせる。",
8503 "Damages all monsters in sight with sound. Aggravate nearby monsters.");
8507 msg_print(_("雄叫びをあげた!", "You roar out!"));
8508 project_hack(GF_SOUND, randint1(plev * 3));
8509 aggravate_monsters(0);
8514 if (name) return _("無双三段", "Musou-Sandan");
8515 if (desc) return _("強力な3段攻撃を繰り出す。", "Attacks with powerful 3 strikes.");
8521 if (!get_rep_dir2(&dir)) return NULL;
8522 if (dir == 5) return NULL;
8524 for (i = 0; i < 3; i++)
8530 monster_type *m_ptr;
8532 y = p_ptr->y + ddy[dir];
8533 x = p_ptr->x + ddx[dir];
8534 c_ptr = &cave[y][x];
8537 py_attack(y, x, HISSATSU_3DAN);
8540 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8544 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
8549 /* Monster is dead? */
8550 if (!c_ptr->m_idx) break;
8554 m_idx = c_ptr->m_idx;
8555 m_ptr = &m_list[m_idx];
8557 /* Monster cannot move back? */
8558 if (!monster_can_enter(ny, nx, &r_info[m_ptr->r_idx], 0))
8561 if (i < 2) msg_print(NULL);
8566 cave[ny][nx].m_idx = m_idx;
8570 update_mon(m_idx, TRUE);
8572 /* Redraw the old spot */
8575 /* Redraw the new spot */
8578 /* Player can move forward? */
8579 if (player_can_enter(c_ptr->feat, 0))
8581 /* Move the player */
8582 if (!move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP)) break;
8590 if (i < 2) msg_print(NULL);
8596 if (name) return _("吸血鬼の牙", "Vampire's Fang");
8597 if (desc) return _("攻撃した相手の体力を吸いとり、自分の体力を回復させる。生命を持たないモンスターには通じない。",
8598 "Attacks with vampiric strikes which absorbs HP from a monster and gives them to you. No effect to unliving monsters.");
8604 if (!get_rep_dir2(&dir)) return NULL;
8605 if (dir == 5) return NULL;
8607 y = p_ptr->y + ddy[dir];
8608 x = p_ptr->x + ddx[dir];
8610 if (cave[y][x].m_idx)
8611 py_attack(y, x, HISSATSU_DRAIN);
8614 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8621 if (name) return _("幻惑", "Moon Dazzling");
8622 if (desc) return _("視界内の起きている全モンスターに朦朧、混乱、眠りを与えようとする。", "Attempts to stun, confuse and sleep all waking monsters.");
8626 msg_print(_("武器を不規則に揺らした...", "You irregularly wave your weapon..."));
8627 project_hack(GF_ENGETSU, plev * 4);
8628 project_hack(GF_ENGETSU, plev * 4);
8629 project_hack(GF_ENGETSU, plev * 4);
8634 if (name) return _("百人斬り", "Hundred Slaughter");
8635 if (desc) return _("連続して入身でモンスターを攻撃する。攻撃するたびにMPを消費。MPがなくなるか、モンスターを倒せなかったら百人斬りは終了する。",
8636 "Performs a series of rush attacks. The series continues while killing each monster in a time and SP remains.");
8640 const int mana_cost_per_monster = 8;
8646 if (!rush_attack(&mdeath)) break;
8649 /* Reserve needed mana point */
8650 p_ptr->csp -= technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
8654 p_ptr->csp -= mana_cost_per_monster;
8659 p_ptr->redraw |= PR_MANA;
8662 while (p_ptr->csp > mana_cost_per_monster);
8664 if (is_new) return NULL;
8666 /* Restore reserved mana */
8667 p_ptr->csp += technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
8672 if (name) return _("天翔龍閃", "Dragonic Flash");
8673 if (desc) return _("視界内の場所を指定して、その場所と自分の間にいる全モンスターを攻撃し、その場所に移動する。",
8674 "Runs toward given location while attacking all monsters on the path.");
8680 if (!tgt_pt(&x, &y)) return NULL;
8682 if (!cave_player_teleportable_bold(y, x, 0L) ||
8683 (distance(y, x, p_ptr->y, p_ptr->x) > MAX_SIGHT / 2) ||
8684 !projectable(p_ptr->y, p_ptr->x, y, x))
8686 msg_print(_("失敗!", "You cannot move to that place!"));
8689 if (p_ptr->anti_tele)
8691 msg_print(_("不思議な力がテレポートを防いだ!", "A mysterious force prevents you from teleporting!"));
8694 project(0, 0, y, x, HISSATSU_ISSEN, GF_ATTACK, PROJECT_BEAM | PROJECT_KILL, -1);
8695 teleport_player_to(y, x, 0L);
8700 if (name) return _("二重の剣撃", "Twin Slash");
8701 if (desc) return _("1ターンで2度攻撃を行う。", "double attacks at a time.");
8707 if (!get_rep_dir(&dir, FALSE)) return NULL;
8709 y = p_ptr->y + ddy[dir];
8710 x = p_ptr->x + ddx[dir];
8712 if (cave[y][x].m_idx)
8715 if (cave[y][x].m_idx)
8723 msg_print(_("その方向にはモンスターはいません。", "You don't see any monster in this direction"));
8730 if (name) return _("虎伏絶刀勢", "Kofuku-Zettousei");
8731 if (desc) return _("強力な攻撃を行い、近くの場所にも効果が及ぶ。", "Performs a powerful attack which even effect nearby monsters.");
8735 int total_damage = 0, basedam, i;
8737 u32b flgs[TR_FLAG_SIZE];
8740 if (!get_rep_dir2(&dir)) return NULL;
8741 if (dir == 5) return NULL;
8743 y = p_ptr->y + ddy[dir];
8744 x = p_ptr->x + ddx[dir];
8746 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
8748 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));
8751 msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
8752 for (i = 0; i < 2; i++)
8755 if (!buki_motteruka(INVEN_RARM+i)) break;
8756 o_ptr = &inventory[INVEN_RARM+i];
8757 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
8758 damage = o_ptr->to_d * 100;
8759 object_flags(o_ptr, flgs);
8760 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
8766 else if (have_flag(flgs, TR_VORPAL))
8768 /* vorpal flag only */
8773 damage += p_ptr->to_d[i] * 100;
8774 damage *= p_ptr->num_blow[i];
8775 total_damage += (damage / 100);
8777 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);
8782 if (name) return _("慶雲鬼忍剣", "Keiun-Kininken");
8783 if (desc) return _("自分もダメージをくらうが、相手に非常に大きなダメージを与える。アンデッドには特に効果がある。",
8784 "Attacks a monster with extremely powerful damage. But you also takes some damages. Hurts a undead monster greatly.");
8790 if (!get_rep_dir2(&dir)) return NULL;
8791 if (dir == 5) return NULL;
8793 y = p_ptr->y + ddy[dir];
8794 x = p_ptr->x + ddx[dir];
8796 if (cave[y][x].m_idx)
8797 py_attack(y, x, HISSATSU_UNDEAD);
8800 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8803 take_hit(DAMAGE_NOESCAPE, 100 + randint1(100), _("慶雲鬼忍剣を使った衝撃", "exhaustion on using Keiun-Kininken"), -1);
8808 if (name) return _("切腹", "Harakiri");
8809 if (desc) return _("「武士道とは、死ぬことと見つけたり。」", "'Busido is found in death'");
8814 if (!get_check(_("本当に自殺しますか?", "Do you really want to commit suicide? "))) return NULL;
8815 /* Special Verification for suicide */
8816 prt(_("確認のため '@' を押して下さい。", "Please verify SUICIDE by typing the '@' sign: "), 0, 0);
8821 if (i != '@') return NULL;
8822 if (p_ptr->total_winner)
8824 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
8825 p_ptr->total_winner = TRUE;
8829 msg_print(_("武士道とは、死ぬことと見つけたり。", "Meaning of Bushi-do is found in the death."));
8830 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
8840 * @brief 呪術領域の武器呪縛の対象にできる武器かどうかを返す。 / An "item_tester_hook" for offer
8841 * @param o_ptr オブジェクト構造体の参照ポインタ
8842 * @return 呪縛可能な武器ならばTRUEを返す
8844 static bool item_tester_hook_weapon_except_bow(object_type *o_ptr)
8846 switch (o_ptr->tval)
8861 * @brief 呪術領域の各処理に使える呪われた装備かどうかを返す。 / An "item_tester_hook" for offer
8862 * @param o_ptr オブジェクト構造体の参照ポインタ
8863 * @return 使える装備ならばTRUEを返す
8865 static bool item_tester_hook_cursed(object_type *o_ptr)
8867 return (bool)(object_is_cursed(o_ptr));
8871 * @brief 呪術領域魔法の各処理を行う
8873 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_CONT / SPELL_STOP)
8874 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
8876 static cptr do_hex_spell(int spell, int mode)
8878 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
8879 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
8880 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
8881 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
8882 bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
8883 bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
8887 PLAYER_LEVEL plev = p_ptr->lev;
8892 /*** 1st book (0-7) ***/
8894 if (name) return _("邪なる祝福", "Evily blessing");
8895 if (desc) return _("祝福により攻撃精度と防御力が上がる。", "Attempts to increase +to_hit of a weapon and AC");
8898 if (!p_ptr->blessed)
8900 msg_print(_("高潔な気分になった!", "You feel righteous!"));
8905 if (!p_ptr->blessed)
8907 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
8913 if (name) return _("軽傷の治癒", "Cure light wounds");
8914 if (desc) return _("HPや傷を少し回復させる。", "Heals cut and HP a little.");
8915 if (info) return info_heal(1, 10, 0);
8918 msg_print(_("気分が良くなってくる。", "You feel better and better."));
8922 hp_player(damroll(1, 10));
8923 set_cut(p_ptr->cut - 10);
8928 if (name) return _("悪魔のオーラ", "Demonic aura");
8929 if (desc) return _("炎のオーラを身にまとい、回復速度が速くなる。", "Gives fire aura and regeneration.");
8932 msg_print(_("体が炎のオーラで覆われた。", "You have enveloped by fiery aura!"));
8936 msg_print(_("炎のオーラが消え去った。", "Fiery aura disappeared."));
8941 if (name) return _("悪臭霧", "Stinking mist");
8942 if (desc) return _("視界内のモンスターに微弱量の毒のダメージを与える。", "Deals few damages of poison to all monsters in your sight.");
8943 power = plev / 2 + 5;
8944 if (info) return info_damage(1, power, 0);
8947 project_hack(GF_POIS, randint1(power));
8952 if (name) return _("腕力強化", "Extra might");
8953 if (desc) return _("術者の腕力を上昇させる。", "Attempts to increase your strength.");
8956 msg_print(_("何だか力が湧いて来る。", "You feel you get stronger."));
8961 if (name) return _("武器呪縛", "Curse weapon");
8962 if (desc) return _("装備している武器を呪う。", "Curses your weapon.");
8967 char o_name[MAX_NLEN];
8969 u32b f[TR_FLAG_SIZE];
8971 item_tester_hook = item_tester_hook_weapon_except_bow;
8972 q = _("どれを呪いますか?", "Which weapon do you curse?");
8973 s = _("武器を装備していない。", "You wield no weapons.");
8975 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
8977 o_ptr = &inventory[item];
8978 object_desc(o_name, o_ptr, OD_NAME_ONLY);
8979 object_flags(o_ptr, f);
8981 if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
8984 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
8986 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
8989 if (o_ptr->to_d > 0)
8991 o_ptr->to_d -= randint1(3) % 2;
8992 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
8994 if (o_ptr->to_h > 0)
8996 o_ptr->to_h -= randint1(3) % 2;
8997 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
8999 if (o_ptr->to_a > 0)
9001 o_ptr->to_a -= randint1(3) % 2;
9002 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
9004 msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
9010 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
9011 o_ptr->curse_flags |= (TRC_CURSED);
9013 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
9016 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
9019 o_ptr->curse_flags |= (TRC_TY_CURSE);
9020 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
9022 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
9023 add_flag(o_ptr->art_flags, TR_VORPAL);
9024 add_flag(o_ptr->art_flags, TR_VAMPIRIC);
9025 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
9030 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);
9033 p_ptr->update |= (PU_BONUS);
9039 if (name) return _("邪悪感知", "Evil detection");
9040 if (desc) return _("周囲の邪悪なモンスターを感知する。", "Detects evil monsters.");
9041 if (info) return info_range(MAX_SIGHT);
9044 msg_print(_("邪悪な生物の存在を感じ取ろうとした。", "You attend to the presence of evil creatures."));
9049 if (name) return _("我慢", "Patience");
9050 if (desc) return _("数ターン攻撃を耐えた後、受けたダメージを地獄の業火として周囲に放出する。",
9051 "Bursts hell fire strongly after patients any damage while few turns.");
9052 power = MIN(200, (p_ptr->magic_num1[2] * 2));
9053 if (info) return info_damage(0, 0, power);
9056 int a = 3 - (p_ptr->pspeed - 100) / 10;
9057 MAGIC_NUM2 r = 3 + randint1(3) + MAX(0, MIN(3, a));
9059 if (p_ptr->magic_num2[2] > 0)
9061 msg_print(_("すでに我慢をしている。", "You are already patienting."));
9065 p_ptr->magic_num2[1] = 1;
9066 p_ptr->magic_num2[2] = r;
9067 p_ptr->magic_num1[2] = 0;
9068 msg_print(_("じっと耐えることにした。", "You decide to patient all damages."));
9073 int rad = 2 + (power / 50);
9075 p_ptr->magic_num2[2]--;
9077 if ((p_ptr->magic_num2[2] <= 0) || (power >= 200))
9079 msg_print(_("我慢が解かれた!", "Time for end of patioence!"));
9082 project(0, rad, p_ptr->y, p_ptr->x, power, GF_HELL_FIRE,
9083 (PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);
9087 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
9091 p_ptr->magic_num2[1] = 0;
9092 p_ptr->magic_num2[2] = 0;
9093 p_ptr->magic_num1[2] = 0;
9098 /*** 2nd book (8-15) ***/
9100 if (name) return _("氷の鎧", "Ice armor");
9101 if (desc) return _("氷のオーラを身にまとい、防御力が上昇する。", "Gives fire aura and bonus to AC.");
9104 msg_print(_("体が氷の鎧で覆われた。", "You have enveloped by ice armor!"));
9108 msg_print(_("氷の鎧が消え去った。", "Ice armor disappeared."));
9113 if (name) return _("重傷の治癒", "Cure serious wounds");
9114 if (desc) return _("体力や傷を多少回復させる。", "Heals cut and HP more.");
9115 if (info) return info_heal(2, 10, 0);
9118 msg_print(_("気分が良くなってくる。", "You feel better and better."));
9122 hp_player(damroll(2, 10));
9123 set_cut((p_ptr->cut / 2) - 10);
9128 if (name) return _("薬品吸入", "Inhail potion");
9129 if (desc) return _("呪文詠唱を中止することなく、薬の効果を得ることができる。", "Quaffs a potion without canceling of casting a spell.");
9132 p_ptr->magic_num1[0] |= (1L << HEX_INHAIL);
9133 do_cmd_quaff_potion();
9134 p_ptr->magic_num1[0] &= ~(1L << HEX_INHAIL);
9140 if (name) return _("吸血霧", "Vampiric mist");
9141 if (desc) return _("視界内のモンスターに微弱量の生命力吸収のダメージを与える。与えたダメージの分、体力が回復する。",
9142 "Deals few dameges of drain life to all monsters in your sight.");
9143 power = (plev / 2) + 5;
9144 if (info) return info_damage(1, power, 0);
9147 project_hack(GF_OLD_DRAIN, randint1(power));
9152 if (name) return _("魔剣化", "Swords to runeswords");
9153 if (desc) return _("武器の攻撃力を上げる。切れ味を得、呪いに応じて与えるダメージが上昇し、善良なモンスターに対するダメージが2倍になる。",
9154 "Gives vorpal ability to your weapon. Increases damages by your weapon acccording to curse of your weapon.");
9158 msg_print("あなたの武器が黒く輝いた。");
9160 if (!empty_hands(FALSE))
9161 msg_print("Your weapons glow bright black.");
9163 msg_print("Your weapon glows bright black.");
9169 msg_print("武器の輝きが消え去った。");
9171 msg_format("Brightness of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
9177 if (name) return _("混乱の手", "Touch of confusion");
9178 if (desc) return _("攻撃した際モンスターを混乱させる。", "Confuses a monster when you attack.");
9181 msg_print(_("あなたの手が赤く輝き始めた。", "Your hands glow bright red."));
9185 msg_print(_("手の輝きがなくなった。", "Brightness on your hands disappeard."));
9190 if (name) return _("肉体強化", "Building up");
9191 if (desc) return _("術者の腕力、器用さ、耐久力を上昇させる。攻撃回数の上限を 1 増加させる。",
9192 "Attempts to increases your strength, dexterity and constitusion.");
9195 msg_print(_("身体が強くなった気がした。", "You feel your body is developed more now."));
9200 if (name) return _("反テレポート結界", "Anti teleport barrier");
9201 if (desc) return _("視界内のモンスターのテレポートを阻害するバリアを張る。", "Obstructs all teleportations by monsters in your sight.");
9202 power = plev * 3 / 2;
9203 if (info) return info_power(power);
9206 msg_print(_("テレポートを防ぐ呪いをかけた。", "You feel anyone can not teleport except you."));
9210 /*** 3rd book (16-23) ***/
9212 if (name) return _("衝撃のクローク", "Cloak of shock");
9213 if (desc) return _("電気のオーラを身にまとい、動きが速くなる。", "Gives lightning aura and a bonus to speed.");
9216 msg_print(_("体が稲妻のオーラで覆われた。", "You have enveloped by electrical aura!"));
9220 msg_print(_("稲妻のオーラが消え去った。", "Electrical aura disappeared."));
9225 if (name) return _("致命傷の治癒", "Cure critical wounds");
9226 if (desc) return _("体力や傷を回復させる。", "Heals cut and HP greatry.");
9227 if (info) return info_heal(4, 10, 0);
9230 msg_print(_("気分が良くなってくる。", "You feel better and better."));
9234 hp_player(damroll(4, 10));
9242 if (name) return _("呪力封入", "Recharging");
9243 if (desc) return _("魔法の道具に魔力を再充填する。", "Recharges a magic device.");
9245 if (info) return info_power(power);
9248 if (!recharge(power)) return NULL;
9254 if (name) return _("死者復活", "Animate Dead");
9255 if (desc) return _("死体を蘇らせてペットにする。", "Raises corpses and skeletons from dead.");
9258 msg_print(_("死者への呼びかけを始めた。", "You start to call deads.!"));
9262 animate_dead(0, p_ptr->y, p_ptr->x);
9267 if (name) return _("防具呪縛", "Curse armor");
9268 if (desc) return _("装備している防具に呪いをかける。", "Curse a piece of armour that you wielding.");
9273 char o_name[MAX_NLEN];
9275 u32b f[TR_FLAG_SIZE];
9277 item_tester_hook = object_is_armour;
9278 q = _("どれを呪いますか?", "Which piece of armour do you curse?");
9279 s = _("防具を装備していない。", "You wield no piece of armours.");
9281 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
9283 o_ptr = &inventory[item];
9284 object_desc(o_name, o_ptr, OD_NAME_ONLY);
9285 object_flags(o_ptr, f);
9287 if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
9290 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
9292 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
9295 if (o_ptr->to_d > 0)
9297 o_ptr->to_d -= randint1(3) % 2;
9298 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
9300 if (o_ptr->to_h > 0)
9302 o_ptr->to_h -= randint1(3) % 2;
9303 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
9305 if (o_ptr->to_a > 0)
9307 o_ptr->to_a -= randint1(3) % 2;
9308 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
9310 msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
9316 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
9317 o_ptr->curse_flags |= (TRC_CURSED);
9319 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
9322 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
9325 o_ptr->curse_flags |= (TRC_TY_CURSE);
9326 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
9328 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
9329 add_flag(o_ptr->art_flags, TR_RES_POIS);
9330 add_flag(o_ptr->art_flags, TR_RES_DARK);
9331 add_flag(o_ptr->art_flags, TR_RES_NETHER);
9332 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
9337 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);
9340 p_ptr->update |= (PU_BONUS);
9346 if (name) return _("影のクローク", "Cloak of shadow");
9347 if (desc) return _("影のオーラを身にまとい、敵に影のダメージを与える。", "Gives aura of shadow.");
9350 object_type *o_ptr = &inventory[INVEN_OUTER];
9354 msg_print(_("クロークを身につけていない!", "You don't ware any cloak."));
9357 else if (!object_is_cursed(o_ptr))
9359 msg_print(_("クロークは呪われていない!", "Your cloak is not cursed."));
9364 msg_print(_("影のオーラを身にまとった。", "You have enveloped by shadow aura!"));
9369 object_type *o_ptr = &inventory[INVEN_OUTER];
9371 if ((!o_ptr->k_idx) || (!object_is_cursed(o_ptr)))
9373 do_spell(REALM_HEX, spell, SPELL_STOP);
9374 p_ptr->magic_num1[0] &= ~(1L << spell);
9375 p_ptr->magic_num2[0]--;
9376 if (!p_ptr->magic_num2[0]) set_action(ACTION_NONE);
9381 msg_print(_("影のオーラが消え去った。", "Shadow aura disappeared."));
9386 if (name) return _("苦痛を魔力に", "Pains to mana");
9387 if (desc) return _("視界内のモンスターに精神ダメージ与え、魔力を吸い取る。", "Deals psychic damages to all monsters in sight, and drains some mana.");
9388 power = plev * 3 / 2;
9389 if (info) return info_damage(1, power, 0);
9392 project_hack(GF_PSI_DRAIN, randint1(power));
9397 if (name) return _("目には目を", "Eye for an eye");
9398 if (desc) return _("打撃や魔法で受けたダメージを、攻撃元のモンスターにも与える。", "Returns same damage which you got to the monster which damaged you.");
9401 msg_print(_("復讐したい欲望にかられた。", "You wish strongly you want to revenge anything."));
9405 /*** 4th book (24-31) ***/
9407 if (name) return _("反増殖結界", "Anti multiply barrier");
9408 if (desc) return _("その階の増殖するモンスターの増殖を阻止する。", "Obstructs all multiplying by monsters in entire floor.");
9411 msg_print(_("増殖を阻止する呪いをかけた。", "You feel anyone can not already multiply."));
9416 if (name) return _("全復活", "Restoration");
9417 if (desc) return _("経験値を徐々に復活し、減少した能力値を回復させる。", "Restores experience and status.");
9420 msg_print(_("体が元の活力を取り戻し始めた。", "You feel your lost status starting to return."));
9425 int d = (p_ptr->max_exp - p_ptr->exp);
9426 int r = (p_ptr->exp / 20);
9432 p_ptr->exp = p_ptr->max_exp;
9436 /* Check the experience */
9441 for (i = A_STR; i < 6; i ++)
9443 if (p_ptr->stat_cur[i] < p_ptr->stat_max[i])
9445 if (p_ptr->stat_cur[i] < 18)
9446 p_ptr->stat_cur[i]++;
9448 p_ptr->stat_cur[i] += 10;
9450 if (p_ptr->stat_cur[i] > p_ptr->stat_max[i])
9451 p_ptr->stat_cur[i] = p_ptr->stat_max[i];
9453 /* Recalculate bonuses */
9454 p_ptr->update |= (PU_BONUS);
9462 msg_format(_("%sの呪文の詠唱をやめた。", "Finish casting '%^s'."), do_spell(REALM_HEX, HEX_RESTORE, SPELL_NAME));
9463 p_ptr->magic_num1[0] &= ~(1L << HEX_RESTORE);
9464 if (cont) p_ptr->magic_num2[0]--;
9465 if (p_ptr->magic_num2) p_ptr->action = ACTION_NONE;
9468 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
9469 p_ptr->redraw |= (PR_EXTRA);
9477 if (name) return _("呪力吸収", "Drain curse power");
9478 if (desc) return _("呪われた武器の呪いを吸収して魔力を回復する。", "Drains curse on your weapon and heals SP a little.");
9483 u32b f[TR_FLAG_SIZE];
9486 item_tester_hook = item_tester_hook_cursed;
9487 q = _("どの装備品から吸収しますか?", "Which cursed equipment do you drain mana from?");
9488 s = _("呪われたアイテムを装備していない。", "You have no cursed equipment.");
9490 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
9492 o_ptr = &inventory[item];
9493 object_flags(o_ptr, f);
9495 p_ptr->csp += (p_ptr->lev / 5) + randint1(p_ptr->lev / 5);
9496 if (have_flag(f, TR_TY_CURSE) || (o_ptr->curse_flags & TRC_TY_CURSE)) p_ptr->csp += randint1(5);
9497 if (p_ptr->csp > p_ptr->msp) p_ptr->csp = p_ptr->msp;
9499 if (o_ptr->curse_flags & TRC_PERMA_CURSE)
9503 else if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
9507 msg_print(_("呪いを全て吸い取った。", "Heavy curse vanished away."));
9508 o_ptr->curse_flags = 0L;
9511 else if ((o_ptr->curse_flags & (TRC_CURSED)) && one_in_(3))
9513 msg_print(_("呪いを全て吸い取った。", "Curse vanished away."));
9514 o_ptr->curse_flags = 0L;
9522 if (name) return _("吸血の刃", "Swords to vampires");
9523 if (desc) return _("吸血属性で攻撃する。", "Gives vampiric ability to your weapon.");
9527 msg_print("あなたの武器が血を欲している。");
9529 if (!empty_hands(FALSE))
9530 msg_print("Your weapons want more blood now.");
9532 msg_print("Your weapon wants more blood now.");
9538 msg_print("武器の渇望が消え去った。");
9540 msg_format("Thirsty of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
9546 if (name) return _("朦朧の言葉", "Word of stun");
9547 if (desc) return _("視界内のモンスターを朦朧とさせる。", "Stuns all monsters in your sight.");
9549 if (info) return info_power(power);
9552 stun_monsters(power);
9557 if (name) return _("影移動", "Moving into shadow");
9558 if (desc) return _("モンスターの隣のマスに瞬間移動する。", "Teleports you close to a monster.");
9565 for (i = 0; i < 3; i++)
9567 if (!tgt_pt(&x, &y)) return FALSE;
9571 for (dir = 0; dir < 8; dir++)
9573 int dy = y + ddy_ddd[dir];
9574 int dx = x + ddx_ddd[dir];
9575 if (dir == 5) continue;
9576 if(cave[dy][dx].m_idx) flag = TRUE;
9579 if (!cave_empty_bold(y, x) || (cave[y][x].info & CAVE_ICKY) ||
9580 (distance(y, x, p_ptr->y, p_ptr->x) > plev + 2))
9582 msg_print(_("そこには移動できない。", "Can not teleport to there."));
9588 if (flag && randint0(plev * plev / 2))
9590 teleport_player_to(y, x, 0L);
9594 msg_print(_("おっと!", "Oops!"));
9595 teleport_player(30, 0L);
9603 if (name) return _("反魔法結界", "Anti magic barrier");
9604 if (desc) return _("視界内のモンスターの魔法を阻害するバリアを張る。", "Obstructs all magic spell of monsters in your sight.");
9605 power = plev * 3 / 2;
9606 if (info) return info_power(power);
9609 msg_print(_("魔法を防ぐ呪いをかけた。", "You feel anyone can not cast spells except you."));
9614 if (name) return _("復讐の宣告", "Revenge sentence");
9615 if (desc) return _("数ターン後にそれまで受けたダメージに応じた威力の地獄の劫火の弾を放つ。",
9616 "Fires a ball of hell fire to try revenging after few turns.");
9617 power = p_ptr->magic_num1[2];
9618 if (info) return info_damage(0, 0, power);
9622 int a = 3 - (p_ptr->pspeed - 100) / 10;
9623 r = 1 + randint1(2) + MAX(0, MIN(3, a));
9625 if (p_ptr->magic_num2[2] > 0)
9627 msg_print(_("すでに復讐は宣告済みだ。", "You already pronounced your revenge."));
9631 p_ptr->magic_num2[1] = 2;
9632 p_ptr->magic_num2[2] = r;
9633 msg_format(_("あなたは復讐を宣告した。あと %d ターン。", "You pronounce your revenge. %d turns left."), r);
9638 p_ptr->magic_num2[2]--;
9640 if (p_ptr->magic_num2[2] <= 0)
9650 msg_print(_("復讐の時だ!", "Time to revenge!"));
9652 while (!get_aim_dir(&dir));
9654 fire_ball(GF_HELL_FIRE, dir, power, 1);
9658 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
9663 msg_print(_("復讐する気が失せた。", "You are not a mood to revenge."));
9665 p_ptr->magic_num1[2] = 0;
9672 if ((cast) && (add))
9675 p_ptr->magic_num1[0] |= 1L << (spell);
9676 p_ptr->magic_num2[0]++;
9678 if (p_ptr->action != ACTION_SPELL) set_action(ACTION_SPELL);
9684 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
9685 p_ptr->redraw |= (PR_EXTRA | PR_HP | PR_MANA);
9693 * @brief 魔法処理のメインルーチン
9694 * @param realm 魔法領域のID
9695 * @param spell 各領域の魔法ID
9697 * @return 各領域魔法に各種テキストを求めた場合は文字列参照ポインタ、そうでない場合はNULLポインタを返す。
9699 cptr do_spell(REALM_IDX realm, SPELL_IDX spell, int mode)
9703 case REALM_LIFE: return do_life_spell(spell, mode);
9704 case REALM_SORCERY: return do_sorcery_spell(spell, mode);
9705 case REALM_NATURE: return do_nature_spell(spell, mode);
9706 case REALM_CHAOS: return do_chaos_spell(spell, mode);
9707 case REALM_DEATH: return do_death_spell(spell, mode);
9708 case REALM_TRUMP: return do_trump_spell(spell, mode);
9709 case REALM_ARCANE: return do_arcane_spell(spell, mode);
9710 case REALM_CRAFT: return do_craft_spell(spell, mode);
9711 case REALM_DAEMON: return do_daemon_spell(spell, mode);
9712 case REALM_CRUSADE: return do_crusade_spell(spell, mode);
9713 case REALM_MUSIC: return do_music_spell(spell, mode);
9714 case REALM_HISSATSU: return do_hissatsu_spell(spell, mode);
9715 case REALM_HEX: return do_hex_spell(spell, mode);