3 @brief 魔法のインターフェイスと発動 / Purpose: Do everything for each spell
6 2013 Deskull rearranged comment for Doxygen.
14 * 魔法の効果を「キャプション:ダイス+定数値」のフォーマットで出力する / Generate dice info string such as "foo 2d10"
19 * @return フォーマットに従い整形された文字列
21 static cptr info_string_dice(cptr str, int dice, int sides, int base)
25 return format("%s%d", str, base);
29 return format("%s%dd%d", str, dice, sides);
31 /* Dice plus base value */
33 return format("%s%dd%d%+d", str, dice, sides, base);
38 * @brief 魔法によるダメージを出力する / Generate damage-dice info string such as "dam 2d10"
42 * @return フォーマットに従い整形された文字列
44 static cptr info_damage(int dice, int sides, int base)
46 return info_string_dice(_("損傷:", "dam "), dice, sides, base);
50 * @brief 魔法の効果時間を出力する / Generate duration info string such as "dur 20+1d20"
53 * @return フォーマットに従い整形された文字列
55 static cptr info_duration(int base, int sides)
57 return format(_("期間:%d+1d%d", "dur %d+1d%d"), base, sides);
61 * @brief 魔法の効果範囲を出力する / Generate range info string such as "range 5"
63 * @return フォーマットに従い整形された文字列
65 static cptr info_range(POSITION range)
67 return format(_("範囲:%d", "range %d"), range);
71 * @brief 魔法による回復量を出力する / Generate heal info string such as "heal 2d8"
75 * @return フォーマットに従い整形された文字列
77 static cptr info_heal(int dice, int sides, int base)
79 return info_string_dice(_("回復:", "heal "), dice, sides, base);
83 * @brief 魔法効果発動までの遅延ターンを出力する / Generate delay info string such as "delay 15+1d15"
86 * @return フォーマットに従い整形された文字列
88 static cptr info_delay(int base, int sides)
90 return format(_("遅延:%d+1d%d", "delay %d+1d%d"), base, sides);
95 * @brief 魔法によるダメージを出力する(固定値&複数回処理) / Generate multiple-damage info string such as "dam 25 each"
97 * @return フォーマットに従い整形された文字列
99 static cptr info_multi_damage(HIT_POINT dam)
101 return format(_("損傷:各%d", "dam %d each"), dam);
106 * @brief 魔法によるダメージを出力する(ダイスのみ&複数回処理) / Generate multiple-damage-dice info string such as "dam 5d2 each"
109 * @return フォーマットに従い整形された文字列
111 static cptr info_multi_damage_dice(int dice, int sides)
113 return format(_("損傷:各%dd%d", "dam %dd%d each"), dice, sides);
117 * @brief 魔法による一般的な効力値を出力する(固定値) / Generate power info string such as "power 100"
119 * @return フォーマットに従い整形された文字列
121 static cptr info_power(int power)
123 return format(_("効力:%d", "power %d"), power);
128 * @brief 魔法による一般的な効力値を出力する(ダイス値) / Generate power info string such as "power 100"
131 * @return フォーマットに従い整形された文字列
134 * Generate power info string such as "power 1d100"
136 static cptr info_power_dice(int dice, int sides)
138 return format(_("効力:%dd%d", "power %dd%d"), dice, sides);
143 * @brief 魔法の効果半径を出力する / Generate radius info string such as "rad 100"
145 * @return フォーマットに従い整形された文字列
147 static cptr info_radius(int rad)
149 return format(_("半径:%d", "rad %d"), rad);
154 * @brief 魔法効果の限界重量を出力する / Generate weight info string such as "max wgt 15"
156 * @return フォーマットに従い整形された文字列
158 static cptr info_weight(int weight)
161 return format("最大重量:%d.%dkg", lbtokg1(weight), lbtokg2(weight));
163 return format("max wgt %d", weight/10);
169 * @brief 一部ボルト魔法のビーム化確率を算出する / Prepare standard probability to become beam for fire_bolt_or_beam()
172 * ハードコーティングによる実装が行われている。
173 * メイジは(レベル)%、ハイメイジ、スペルマスターは(レベル)%、それ以外の職業は(レベル/2)%
175 static int beam_chance(void)
177 if (p_ptr->pclass == CLASS_MAGE)
179 if (p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER)
180 return p_ptr->lev + 10;
182 return p_ptr->lev / 2;
186 * @brief トランプ魔法独自の召喚処理を行う / Handle summoning and failure of trump spells
187 * @param num summon_specific()関数を呼び出す回数
188 * @param pet ペット化として召喚されるか否か
193 * @param mode モンスター生成条件フラグ
194 * @return モンスターが(敵対も含めて)召還されたならばTRUEを返す。
196 static bool trump_summoning(int num, bool pet, POSITION y, POSITION x, DEPTH lev, int type, BIT_FLAGS mode)
198 PLAYER_LEVEL plev = p_ptr->lev;
202 bool success = FALSE;
205 if (!lev) lev = plev * 2 / 3 + randint1(plev / 2);
210 mode |= PM_FORCE_PET;
212 /* Only sometimes allow unique monster */
213 if (mode & PM_ALLOW_UNIQUE)
216 if (randint1(50 + plev) >= plev / 10)
217 mode &= ~PM_ALLOW_UNIQUE;
220 /* Player is who summons */
225 /* Prevent taming, allow unique monster */
228 /* Behave as if they appear by themselfs */
232 for (i = 0; i < num; i++)
234 if (summon_specific(who, y, x, lev, type, mode))
240 msg_print(_("誰もあなたのカードの呼び声に答えない。", "Nobody answers to your Trump call."));
248 * @brief 「ワンダー」のランダムな効果を決定して処理する。
252 * This spell should become more useful (more controlled) as the\n
253 * player gains experience levels. Thus, add 1/5 of the player's\n
254 * level to the die roll. This eliminates the worst effects later on,\n
255 * while keeping the results quite random. It also allows some potent\n
256 * effects only at high level.
258 static void cast_wonder(int dir)
260 int plev = p_ptr->lev;
261 int die = randint1(100) + plev / 5;
262 int vir = virtue_number(V_CHANCE);
266 if (p_ptr->virtues[vir - 1] > 0)
268 while (randint1(400) < p_ptr->virtues[vir - 1]) die++;
272 while (randint1(400) < (0-p_ptr->virtues[vir - 1])) die--;
277 chg_virtue(V_CHANCE, 1);
281 msg_print(_("あなたは力がみなぎるのを感じた!", "You feel a surge of power!"));
284 if (die < 8) clone_monster(dir);
285 else if (die < 14) speed_monster(dir, plev);
286 else if (die < 26) heal_monster(dir, damroll(4, 6));
287 else if (die < 31) poly_monster(dir, plev);
289 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir,
290 damroll(3 + ((plev - 1) / 5), 4));
291 else if (die < 41) confuse_monster(dir, plev);
292 else if (die < 46) fire_ball(GF_POIS, dir, 20 + (plev / 2), 3);
293 else if (die < 51) (void)lite_line(dir, damroll(6, 8));
295 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir,
296 damroll(3 + ((plev - 5) / 4), 8));
298 fire_bolt_or_beam(beam_chance() - 10, GF_COLD, dir,
299 damroll(5 + ((plev - 5) / 4), 8));
301 fire_bolt_or_beam(beam_chance(), GF_ACID, dir,
302 damroll(6 + ((plev - 5) / 4), 8));
304 fire_bolt_or_beam(beam_chance(), GF_FIRE, dir,
305 damroll(8 + ((plev - 5) / 4), 8));
306 else if (die < 76) hypodynamic_bolt(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) hypodynamic_bolt(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));
432 hypodynamic_bolt(dir, 75);
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 hypodynamic_bolt(dir, 100 + plev);
456 earthquake(p_ptr->y, p_ptr->x, 12);
460 (void)destroy_area(p_ptr->y, p_ptr->x, 13 + randint0(5), FALSE);
464 symbol_genocide(plev+50, TRUE);
468 dispel_monsters(120);
472 dispel_monsters(150);
474 sleep_monsters(plev);
480 msg_print(_("陰欝な声がクスクス笑う。「もうすぐおまえは我々の仲間になるだろう。弱き者よ。」",
481 "Sepulchral voices chuckle. 'Soon you will join us, mortal.'"));
486 * @brief カオス的効果あるいは及びシャッフルの「運命の輪」効果を引数基準に処理する。
487 * @param spell 基準となる引数ID
490 static void wild_magic(SPELL_IDX spell)
493 int type = SUMMON_MOLD + randint0(6);
495 if (type < SUMMON_MOLD) type = SUMMON_MOLD;
496 else if (type > SUMMON_MIMIC) type = SUMMON_MIMIC;
498 switch (randint1(spell) + randint1(8) + 1)
503 teleport_player(10, TELEPORT_PASSIVE);
508 teleport_player(100, TELEPORT_PASSIVE);
512 teleport_player(200, TELEPORT_PASSIVE);
522 lite_area(damroll(2, 3), 2);
525 destroy_doors_touch();
531 sleep_monsters_touch();
535 trap_creation(p_ptr->y, p_ptr->x);
544 aggravate_monsters(0);
547 earthquake(p_ptr->y, p_ptr->x, 5);
551 (void)gain_random_mutation(0);
561 fire_ball(GF_CHAOS, 0, spell + 5, 1 + (spell / 10));
568 while (counter++ < 8)
570 (void)summon_specific(0, p_ptr->y, p_ptr->x, (dun_level * 3) / 2, type, (PM_ALLOW_GROUP | PM_NO_PET));
575 activate_hi_summon(p_ptr->y, p_ptr->x, FALSE);
578 (void)summon_cyber(-1, p_ptr->y, p_ptr->x);
583 (void)activate_ty_curse(FALSE, &count);
590 * @brief トランプ領域の「シャッフル」の効果をランダムに決めて処理する。
593 static void cast_shuffle(void)
595 int plev = p_ptr->lev;
598 int vir = virtue_number(V_CHANCE);
601 /* Card sharks and high mages get a level bonus */
602 if ((p_ptr->pclass == CLASS_ROGUE) ||
603 (p_ptr->pclass == CLASS_HIGH_MAGE) ||
604 (p_ptr->pclass == CLASS_SORCERER))
605 die = (randint1(110)) + plev / 5;
612 if (p_ptr->virtues[vir - 1] > 0)
614 while (randint1(400) < p_ptr->virtues[vir - 1]) die++;
618 while (randint1(400) < (0-p_ptr->virtues[vir - 1])) die--;
622 msg_print(_("あなたはカードを切って一枚引いた...", "You shuffle the deck and draw a card..."));
625 chg_virtue(V_CHANCE, 1);
629 msg_print(_("なんてこった!《死》だ!", "Oh no! It's Death!"));
631 for (i = 0; i < randint1(3); i++)
632 activate_hi_summon(p_ptr->y, p_ptr->x, FALSE);
636 msg_print(_("なんてこった!《悪魔》だ!", "Oh no! It's the Devil!"));
637 summon_specific(0, p_ptr->y, p_ptr->x, dun_level, SUMMON_DEMON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
642 msg_print(_("なんてこった!《吊られた男》だ!", "Oh no! It's the Hanged Man."));
643 activate_ty_curse(FALSE, &count);
647 msg_print(_("《不調和の剣》だ。", "It's the swords of discord."));
648 aggravate_monsters(0);
652 msg_print(_("《愚者》だ。", "It's the Fool."));
658 msg_print(_("奇妙なモンスターの絵だ。", "It's the picture of a strange monster."));
659 trump_summoning(1, FALSE, p_ptr->y, p_ptr->x, (dun_level * 3 / 2), (32 + randint1(6)), PM_ALLOW_GROUP | PM_ALLOW_UNIQUE);
663 msg_print(_("《月》だ。", "It's the Moon."));
668 msg_print(_("《運命の輪》だ。", "It's the Wheel of Fortune."));
669 wild_magic(randint0(32));
673 msg_print(_("テレポート・カードだ。", "It's a teleport trump card."));
674 teleport_player(10, TELEPORT_PASSIVE);
678 msg_print(_("《正義》だ。", "It's Justice."));
679 set_blessed(p_ptr->lev, FALSE);
683 msg_print(_("テレポート・カードだ。", "It's a teleport trump card."));
684 teleport_player(100, TELEPORT_PASSIVE);
688 msg_print(_("テレポート・カードだ。", "It's a teleport trump card."));
689 teleport_player(200, TELEPORT_PASSIVE);
693 msg_print(_("《塔》だ。", "It's the Tower."));
698 msg_print(_("《節制》だ。", "It's Temperance."));
699 sleep_monsters_touch();
703 msg_print(_("《塔》だ。", "It's the Tower."));
705 earthquake(p_ptr->y, p_ptr->x, 5);
709 msg_print(_("友好的なモンスターの絵だ。", "It's the picture of a friendly monster."));
710 trump_summoning(1, TRUE, p_ptr->y, p_ptr->x, (dun_level * 3 / 2), SUMMON_MOLD, 0L);
714 msg_print(_("友好的なモンスターの絵だ。", "It's the picture of a friendly monster."));
715 trump_summoning(1, TRUE, p_ptr->y, p_ptr->x, (dun_level * 3 / 2), SUMMON_BAT, 0L);
719 msg_print(_("友好的なモンスターの絵だ。", "It's the picture of a friendly monster."));
720 trump_summoning(1, TRUE, p_ptr->y, p_ptr->x, (dun_level * 3 / 2), SUMMON_VORTEX, 0L);
724 msg_print(_("友好的なモンスターの絵だ。", "It's the picture of a friendly monster."));
725 trump_summoning(1, TRUE, p_ptr->y, p_ptr->x, (dun_level * 3 / 2), SUMMON_COIN_MIMIC, 0L);
729 msg_print(_("《恋人》だ。", "It's the Lovers."));
731 if (get_aim_dir(&dir))
732 charm_monster(dir, MIN(p_ptr->lev, 20));
736 msg_print(_("《隠者》だ。", "It's the Hermit."));
741 msg_print(_("《審判》だ。", "It's the Judgement."));
742 do_cmd_rerate(FALSE);
743 lose_all_mutations();
747 msg_print(_("《太陽》だ。", "It's the Sun."));
748 chg_virtue(V_KNOWLEDGE, 1);
749 chg_virtue(V_ENLIGHTEN, 1);
754 msg_print(_("《世界》だ。", "It's the World."));
755 if (p_ptr->exp < PY_MAX_EXP)
757 s32b ee = (p_ptr->exp / 25) + 1;
758 if (ee > 5000) ee = 5000;
759 msg_print(_("更に経験を積んだような気がする。", "You feel more experienced."));
766 * @brief カオス魔法「流星群」の処理としてプレイヤーを中心に隕石落下処理を10+1d10回繰り返す。
767 * / Drop 10+1d10 meteor ball at random places near the player
772 static void cast_meteor(HIT_POINT dam, int rad)
775 int b = 10 + randint1(10);
777 for (i = 0; i < b; i++)
779 POSITION y = 0, x = 0;
782 for (count = 0; count <= 20; count++)
786 x = p_ptr->x - 8 + randint0(17);
787 y = p_ptr->y - 8 + randint0(17);
789 dx = (p_ptr->x > x) ? (p_ptr->x - x) : (x - p_ptr->x);
790 dy = (p_ptr->y > y) ? (p_ptr->y - y) : (y - p_ptr->y);
792 /* Approximate distance */
793 d = (dy > dx) ? (dy + (dx >> 1)) : (dx + (dy >> 1));
795 if (d >= 9) continue;
797 if (!in_bounds(y, x) || !projectable(p_ptr->y, p_ptr->x, y, x)
798 || !cave_have_flag_bold(y, x, FF_PROJECT)) continue;
804 if (count > 20) continue;
806 project(0, rad, y, x, dam, GF_METEOR, PROJECT_KILL | PROJECT_JUMP | PROJECT_ITEM, -1);
812 * @brief 破邪魔法「神の怒り」の処理としてターゲットを指定した後分解のボールを最大20回発生させる。
815 * @return ターゲットを指定し、実行したならばTRUEを返す。
817 static bool cast_wrath_of_the_god(HIT_POINT dam, int rad)
822 int b = 10 + randint1(10);
824 if (!get_aim_dir(&dir)) return FALSE;
826 /* Use the given direction */
827 tx = p_ptr->x + 99 * ddx[dir];
828 ty = p_ptr->y + 99 * ddy[dir];
830 /* Hack -- Use an actual "target" */
831 if ((dir == 5) && target_okay())
842 /* Hack -- Stop at the target */
843 if ((y == ty) && (x == tx)) break;
847 mmove2(&ny, &nx, p_ptr->y, p_ptr->x, ty, tx);
849 /* Stop at maximum range */
850 if (MAX_RANGE <= distance(p_ptr->y, p_ptr->x, ny, nx)) break;
852 /* Stopped by walls/doors */
853 if (!cave_have_flag_bold(ny, nx, FF_PROJECT)) break;
855 /* Stopped by monsters */
856 if ((dir != 5) && cave[ny][nx].m_idx != 0) break;
858 /* Save the new location */
865 for (i = 0; i < b; i++)
867 int count = 20, d = 0;
873 x = tx - 5 + randint0(11);
874 y = ty - 5 + randint0(11);
876 dx = (tx > x) ? (tx - x) : (x - tx);
877 dy = (ty > y) ? (ty - y) : (y - ty);
879 /* Approximate distance */
880 d = (dy > dx) ? (dy + (dx >> 1)) : (dx + (dy >> 1));
881 /* Within the radius */
885 if (count < 0) continue;
887 /* Cannot penetrate perm walls */
888 if (!in_bounds(y,x) ||
889 cave_stop_disintegration(y,x) ||
890 !in_disintegration_range(ty, tx, y, x))
893 project(0, rad, y, x, dam, GF_DISINTEGRATE, PROJECT_JUMP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL, -1);
900 * @brief 悪魔領域のグレーターデーモン召喚に利用可能な死体かどうかを返す。 / An "item_tester_hook" for offer
901 * @param o_ptr オブジェクト構造体の参照ポインタ
902 * @return 生贄に使用可能な死体ならばTRUEを返す。
904 static bool item_tester_offer(object_type *o_ptr)
906 /* Flasks of oil are okay */
907 if (o_ptr->tval != TV_CORPSE) return (FALSE);
909 if (o_ptr->sval != SV_CORPSE) return (FALSE);
911 if (my_strchr("pht", r_info[o_ptr->pval].d_char)) return (TRUE);
913 /* Assume not okay */
918 * @brief 悪魔領域のグレーターデーモン召喚を処理する / Daemon spell Summon Greater Demon
919 * @return 処理を実行したならばTRUEを返す。
921 static bool cast_summon_greater_demon(void)
923 PLAYER_LEVEL plev = p_ptr->lev;
929 item_tester_hook = item_tester_offer;
930 q = _("どの死体を捧げますか? ", "Sacrifice which corpse? ");
931 s = _("捧げられる死体を持っていない。", "You have nothing to scrifice.");
932 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return FALSE;
934 /* Get the item (in the pack) */
937 o_ptr = &inventory[item];
940 /* Get the item (on the floor) */
943 o_ptr = &o_list[0 - item];
946 summon_lev = plev * 2 / 3 + r_info[o_ptr->pval].level;
948 if (summon_specific(-1, p_ptr->y, p_ptr->x, summon_lev, SUMMON_HI_DEMON, (PM_ALLOW_GROUP | PM_FORCE_PET)))
950 msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));
951 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
953 /* Decrease the item (from the pack) */
956 inven_item_increase(item, -1);
957 inven_item_describe(item);
958 inven_item_optimize(item);
961 /* Decrease the item (from the floor) */
964 floor_item_increase(0 - item, -1);
965 floor_item_describe(0 - item);
966 floor_item_optimize(0 - item);
971 msg_print(_("悪魔は現れなかった。", "No Greater Demon arrive."));
978 * @brief 歌の開始を処理する / Start singing if the player is a Bard
979 * @param spell 領域魔法としてのID
980 * @param song 魔法効果のID
983 static void start_singing(SPELL_IDX spell, MAGIC_NUM1 song)
985 /* Remember the song index */
986 SINGING_SONG_EFFECT(p_ptr) = (MAGIC_NUM1)song;
988 /* Remember the index of the spell which activated the song */
989 SINGING_SONG_ID(p_ptr) = (MAGIC_NUM2)spell;
992 /* Now the player is singing */
993 set_action(ACTION_SING);
996 /* Recalculate bonuses */
997 p_ptr->update |= (PU_BONUS);
999 /* Redraw status bar */
1000 p_ptr->redraw |= (PR_STATUS);
1004 * @brief 歌の停止を処理する / Stop singing if the player is a Bard
1007 void stop_singing(void)
1009 if (p_ptr->pclass != CLASS_BARD) return;
1011 /* Are there interupted song? */
1012 if (INTERUPTING_SONG_EFFECT(p_ptr))
1014 /* Forget interupted song */
1015 INTERUPTING_SONG_EFFECT(p_ptr) = MUSIC_NONE;
1019 /* The player is singing? */
1020 if (!SINGING_SONG_EFFECT(p_ptr)) return;
1022 /* Hack -- if called from set_action(), avoid recursive loop */
1023 if (p_ptr->action == ACTION_SING) set_action(ACTION_NONE);
1025 /* Message text of each song or etc. */
1026 do_spell(REALM_MUSIC, SINGING_SONG_ID(p_ptr), SPELL_STOP);
1028 SINGING_SONG_EFFECT(p_ptr) = MUSIC_NONE;
1029 SINGING_SONG_ID(p_ptr) = 0;
1031 /* Recalculate bonuses */
1032 p_ptr->update |= (PU_BONUS);
1034 /* Redraw status bar */
1035 p_ptr->redraw |= (PR_STATUS);
1040 * @brief 生命領域魔法の各処理を行う
1042 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
1043 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
1045 static cptr do_life_spell(SPELL_IDX spell, BIT_FLAGS mode)
1047 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
1048 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
1049 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
1050 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
1053 int plev = p_ptr->lev;
1058 if (name) return _("軽傷の治癒", "Cure Light Wounds");
1059 if (desc) return _("怪我と体力を少し回復させる。", "Heals cut and HP a little.");
1064 if (info) return info_heal(dice, sides, 0);
1068 hp_player(damroll(dice, sides));
1069 set_cut(p_ptr->cut - 10);
1075 if (name) return _("祝福", "Bless");
1076 if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
1080 if (info) return info_duration(base, base);
1084 set_blessed(randint1(base) + base, FALSE);
1090 if (name) return _("軽傷", "Cause Light Wounds");
1091 if (desc) return _("1体のモンスターに小ダメージを与える。抵抗されると無効。", "Wounds a monster a little unless resisted.");
1093 int dice = 3 + (plev - 1) / 5;
1096 if (info) return info_damage(dice, sides, 0);
1100 if (!get_aim_dir(&dir)) return NULL;
1101 fire_ball_hide(GF_WOUNDS, dir, damroll(dice, sides), 0);
1107 if (name) return _("光の召喚", "Call Light");
1108 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
1111 int sides = plev / 2;
1112 int rad = plev / 10 + 1;
1114 if (info) return info_damage(dice, sides, 0);
1118 lite_area(damroll(dice, sides), rad);
1124 if (name) return _("罠 & 隠し扉感知", "Detect Doors & Traps");
1125 if (desc) return _("近くの全ての罠と扉と階段を感知する。", "Detects traps, doors, and stairs in your vicinity.");
1127 int rad = DETECT_RAD_DEFAULT;
1129 if (info) return info_radius(rad);
1133 detect_traps(rad, TRUE);
1141 if (name) return _("重傷の治癒", "Cure Medium Wounds");
1142 if (desc) return _("怪我と体力を中程度回復させる。", "Heals cut and HP more.");
1147 if (info) return info_heal(dice, sides, 0);
1151 hp_player(damroll(dice, sides));
1152 set_cut((p_ptr->cut / 2) - 20);
1158 if (name) return _("解毒", "Cure Poison");
1159 if (desc) return _("体内の毒を取り除く。", "Cure poison status.");
1169 if (name) return _("空腹充足", "Satisfy Hunger");
1170 if (desc) return _("満腹にする。", "Satisfies hunger.");
1174 set_food(PY_FOOD_MAX - 1);
1180 if (name) return _("解呪", "Remove Curse");
1181 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
1187 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
1194 if (name) return _("重傷", "Cause Medium Wounds");
1195 if (desc) return _("1体のモンスターに中ダメージを与える。抵抗されると無効。", "Wounds a monster unless resisted.");
1197 int sides = 8 + (plev - 5) / 4;
1200 if (info) return info_damage(dice, sides, 0);
1204 if (!get_aim_dir(&dir)) return NULL;
1205 fire_ball_hide(GF_WOUNDS, dir, damroll(dice, sides), 0);
1211 if (name) return _("致命傷の治癒", "Cure Critical Wounds");
1212 if (desc) return _("体力を大幅に回復させ、負傷と朦朧状態も全快する。", "Heals cut, stun and HP greatly.");
1217 if (info) return info_heal(dice, sides, 0);
1221 hp_player(damroll(dice, sides));
1229 if (name) return _("耐熱耐寒", "Resist Heat and Cold");
1230 if (desc) return _("一定時間、火炎と冷気に対する耐性を得る。装備による耐性に累積する。",
1231 "Gives resistance to fire and cold. These resistances can be added to which from equipment for more powerful resistances.");
1236 if (info) return info_duration(base, base);
1240 set_oppose_cold(randint1(base) + base, FALSE);
1241 set_oppose_fire(randint1(base) + base, FALSE);
1247 if (name) return _("周辺感知", "Sense Surroundings");
1248 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
1251 int rad = DETECT_RAD_MAP;
1253 if (info) return info_radius(rad);
1263 if (name) return _("パニック・アンデッド", "Turn Undead");
1264 if (desc) return _("視界内のアンデッドを恐怖させる。抵抗されると無効。", "Attempts to scare undead monsters in sight.");
1275 if (name) return _("体力回復", "Healing");
1276 if (desc) return _("極めて強力な回復呪文で、負傷と朦朧状態も全快する。", "Much powerful healing magic, and heals cut and stun completely.");
1281 if (info) return info_heal(0, 0, heal);
1293 if (name) return _("結界の紋章", "Glyph of Warding");
1294 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。",
1295 "Sets a glyph on the floor beneath you. Monsters cannot attack you if you are on a glyph, but can try to break glyph.");
1306 if (name) return _("*解呪*", "Dispel Curse");
1307 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
1312 if (remove_all_curse())
1314 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
1321 if (name) return _("鑑識", "Perception");
1322 if (desc) return _("アイテムを識別する。", "Identifies an item.");
1327 if (!ident_spell(FALSE)) return NULL;
1333 if (name) return _("アンデッド退散", "Dispel Undead");
1334 if (desc) return _("視界内の全てのアンデッドにダメージを与える。", "Damages all undead monsters in sight.");
1338 int sides = plev * 5;
1340 if (info) return info_damage(dice, sides, 0);
1344 dispel_undead(damroll(dice, sides));
1350 if (name) return _("凪の刻", "Day of the Dove");
1351 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
1354 int power = plev * 2;
1356 if (info) return info_power(power);
1360 charm_monsters(power);
1366 if (name) return _("致命傷", "Cause Critical Wounds");
1367 if (desc) return _("1体のモンスターに大ダメージを与える。抵抗されると無効。", "Wounds a monster critically unless resisted.");
1370 int dice = 5 + (plev - 5) / 3;
1373 if (info) return info_damage(dice, sides, 0);
1377 if (!get_aim_dir(&dir)) return NULL;
1378 fire_ball_hide(GF_WOUNDS, dir, damroll(dice, sides), 0);
1384 if (name) return _("帰還の詔", "Word of Recall");
1385 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。", "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
1391 if (info) return info_delay(base, sides);
1395 if (!word_of_recall()) return NULL;
1401 if (name) return _("真実の祭壇", "Alter Reality");
1402 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
1408 if (info) return info_delay(base, sides);
1418 if (name) return _("真・結界", "Warding True");
1419 if (desc) return _("自分のいる床と周囲8マスの床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。", "Creates glyphs in all adjacent squares and under you.");
1424 if (info) return info_radius(rad);
1435 if (name) return _("不毛化", "Sterilization");
1436 if (desc) return _("この階の増殖するモンスターが増殖できなくなる。", "Prevents any breeders on current level from breeding.");
1441 num_repro += MAX_REPRO;
1447 if (name) return _("全感知", "Detection");
1448 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。", "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
1451 int rad = DETECT_RAD_DEFAULT;
1453 if (info) return info_radius(rad);
1463 if (name) return _("アンデッド消滅", "Annihilate Undead");
1464 if (desc) return _("自分の周囲にいるアンデッドを現在の階から消し去る。抵抗されると無効。",
1465 "Eliminates all nearby undead monsters, exhausting you. Powerful or unique monsters may be able to resist.");
1468 int power = plev + 50;
1470 if (info) return info_power(power);
1474 mass_genocide_undead(power, TRUE);
1480 if (name) return _("千里眼", "Clairvoyance");
1481 if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。", "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");
1492 if (name) return _("全復活", "Restoration");
1493 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
1510 if (name) return _("*体力回復*", "Healing True");
1511 if (desc) return _("最強の治癒の魔法で、負傷と朦朧状態も全快する。", "The greatest healing magic. Heals all HP, cut and stun.");
1516 if (info) return info_heal(0, 0, heal);
1528 if (name) return _("聖なるビジョン", "Holy Vision");
1529 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
1534 if (!identify_fully(FALSE)) return NULL;
1540 if (name) return _("究極の耐性", "Ultimate Resistance");
1541 if (desc) return _("一定時間、あらゆる耐性を付け、ACと魔法防御能力を上昇させる。", "Gives ultimate resistance, bonus to AC and speed.");
1544 TIME_EFFECT base = (TIME_EFFECT)plev / 2;
1546 if (info) return info_duration(base, base);
1550 TIME_EFFECT v = randint1(base) + base;
1552 set_oppose_acid(v, FALSE);
1553 set_oppose_elec(v, FALSE);
1554 set_oppose_fire(v, FALSE);
1555 set_oppose_cold(v, FALSE);
1556 set_oppose_pois(v, FALSE);
1557 set_ultimate_res(v, FALSE);
1567 * @brief 仙術領域魔法の各処理を行う
1569 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
1570 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
1572 static cptr do_sorcery_spell(SPELL_IDX spell, BIT_FLAGS mode)
1574 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
1575 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
1576 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
1577 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
1580 int plev = p_ptr->lev;
1585 if (name) return _("モンスター感知", "Detect Monsters");
1586 if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
1589 int rad = DETECT_RAD_DEFAULT;
1591 if (info) return info_radius(rad);
1595 detect_monsters_normal(rad);
1601 if (name) return _("ショート・テレポート", "Phase Door");
1602 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");
1605 POSITION range = 10;
1607 if (info) return info_range(range);
1611 teleport_player(range, 0L);
1617 if (name) return _("罠と扉感知", "Detect Doors and Traps");
1618 if (desc) return _("近くの全ての扉と罠を感知する。", "Detects traps, doors, and stairs in your vicinity.");
1621 int rad = DETECT_RAD_DEFAULT;
1623 if (info) return info_radius(rad);
1627 detect_traps(rad, TRUE);
1635 if (name) return _("ライト・エリア", "Light Area");
1636 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
1640 int sides = plev / 2;
1641 int rad = plev / 10 + 1;
1643 if (info) return info_damage(dice, sides, 0);
1647 lite_area(damroll(dice, sides), rad);
1653 if (name) return _("パニック・モンスター", "Confuse Monster");
1654 if (desc) return _("モンスター1体を混乱させる。抵抗されると無効。", "Attempts to confuse a monster.");
1657 int power = (plev * 3) / 2;
1659 if (info) return info_power(power);
1663 if (!get_aim_dir(&dir)) return NULL;
1665 confuse_monster(dir, power);
1671 if (name) return _("テレポート", "Teleport");
1672 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
1675 POSITION range = plev * 5;
1677 if (info) return info_range(range);
1681 teleport_player(range, 0L);
1687 if (name) return _("スリープ・モンスター", "Sleep Monster");
1688 if (desc) return _("モンスター1体を眠らせる。抵抗されると無効。", "Attempts to sleep a monster.");
1693 if (info) return info_power(power);
1697 if (!get_aim_dir(&dir)) return NULL;
1699 sleep_monster(dir, plev);
1705 if (name) return _("魔力充填", "Recharging");
1706 if (desc) return _("杖/魔法棒の充填回数を増やすか、充填中のロッドの充填時間を減らす。", "Recharges staffs, wands or rods.");
1709 int power = plev * 4;
1711 if (info) return info_power(power);
1715 if (!recharge(power)) return NULL;
1721 if (name) return _("魔法の地図", "Magic Mapping");
1722 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
1725 int rad = DETECT_RAD_MAP;
1727 if (info) return info_radius(rad);
1737 if (name) return _("鑑定", "Identify");
1738 if (desc) return _("アイテムを識別する。", "Identifies an item.");
1743 if (!ident_spell(FALSE)) return NULL;
1749 if (name) return _("スロウ・モンスター", "Slow Monster");
1750 if (desc) return _("モンスター1体を減速さる。抵抗されると無効。", "Attempts to slow a monster.");
1755 if (info) return info_power(power);
1759 if (!get_aim_dir(&dir)) return NULL;
1761 slow_monster(dir, plev);
1767 if (name) return _("周辺スリープ", "Mass Sleep");
1768 if (desc) return _("視界内の全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep all monsters in sight.");
1773 if (info) return info_power(power);
1777 sleep_monsters(plev);
1783 if (name) return _("テレポート・モンスター", "Teleport Away");
1784 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
1789 if (info) return info_power(power);
1793 if (!get_aim_dir(&dir)) return NULL;
1795 fire_beam(GF_AWAY_ALL, dir, power);
1801 if (name) return _("スピード", "Haste Self");
1802 if (desc) return _("一定時間、加速する。", "Hastes you for a while.");
1806 int sides = 20 + plev;
1808 if (info) return info_duration(base, sides);
1812 set_fast(randint1(sides) + base, FALSE);
1818 if (name) return _("真・感知", "Detection True");
1819 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
1820 "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
1823 int rad = DETECT_RAD_DEFAULT;
1825 if (info) return info_radius(rad);
1835 if (name) return _("真・鑑定", "Identify True");
1836 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
1841 if (!identify_fully(FALSE)) return NULL;
1847 if (name) return _("物体と財宝感知", "Detect items and Treasure");
1848 if (desc) return _("近くの全てのアイテムと財宝を感知する。", "Detects all treasures and items in your vicinity.");
1851 int rad = DETECT_RAD_DEFAULT;
1853 if (info) return info_radius(rad);
1857 detect_objects_normal(rad);
1858 detect_treasure(rad);
1859 detect_objects_gold(rad);
1865 if (name) return _("チャーム・モンスター", "Charm Monster");
1866 if (desc) return _("モンスター1体を魅了する。抵抗されると無効。", "Attempts to charm a monster.");
1871 if (info) return info_power(power);
1875 if (!get_aim_dir(&dir)) return NULL;
1877 charm_monster(dir, power);
1883 if (name) return _("精神感知", "Sense Minds");
1884 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
1890 if (info) return info_duration(base, sides);
1894 set_tim_esp(randint1(sides) + base, FALSE);
1900 if (name) return _("街移動", "Teleport to town");
1901 if (desc) return _("街へ移動する。地上にいるときしか使えない。", "Teleport to a town which you choose in a moment. Can only be used outdoors.");
1906 if (!tele_town()) return NULL;
1912 if (name) return _("自己分析", "Self Knowledge");
1913 if (desc) return _("現在の自分の状態を完全に知る。",
1914 "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");
1925 if (name) return _("テレポート・レベル", "Teleport Level");
1926 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");
1931 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
1938 if (name) return _("帰還の呪文", "Word of Recall");
1939 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
1940 "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
1946 if (info) return info_delay(base, sides);
1950 if (!word_of_recall()) return NULL;
1956 if (name) return _("次元の扉", "Dimension Door");
1957 if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleport to given location.");
1960 POSITION range = plev / 2 + 10;
1962 if (info) return info_range(range);
1966 msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));
1967 if (!dimension_door()) return NULL;
1973 if (name) return _("調査", "Probing");
1974 if (desc) return _("モンスターの属性、残り体力、最大体力、スピード、正体を知る。",
1975 "Proves all monsters' alignment, HP, speed and their true character.");
1986 if (name) return _("爆発のルーン", "Explosive Rune");
1987 if (desc) return _("自分のいる床の上に、モンスターが通ると爆発してダメージを与えるルーンを描く。",
1988 "Sets a glyph under you. The glyph will explode when a monster moves on it.");
1995 if (info) return info_damage(dice, sides, base);
2005 if (name) return _("念動力", "Telekinesis");
2006 if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");
2009 int weight = plev * 15;
2011 if (info) return info_weight(weight);
2015 if (!get_aim_dir(&dir)) return NULL;
2017 fetch(dir, weight, FALSE);
2023 if (name) return _("千里眼", "Clairvoyance");
2024 if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。さらに、一定時間テレパシー能力を得る。",
2025 "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");
2031 if (info) return info_duration(base, sides);
2035 chg_virtue(V_KNOWLEDGE, 1);
2036 chg_virtue(V_ENLIGHTEN, 1);
2040 if (!p_ptr->telepathy)
2042 set_tim_esp(randint1(sides) + base, FALSE);
2049 if (name) return _("魅了の視線", "Charm monsters");
2050 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
2053 int power = plev * 2;
2055 if (info) return info_power(power);
2059 charm_monsters(power);
2065 if (name) return _("錬金術", "Alchemy");
2066 if (desc) return _("アイテム1つをお金に変える。", "Turns an item into 1/3 of its value in gold.");
2071 if (!alchemy()) return NULL;
2077 if (name) return _("怪物追放", "Banishment");
2078 if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");
2081 int power = plev * 4;
2083 if (info) return info_power(power);
2087 banish_monsters(power);
2093 if (name) return _("無傷の球", "Globe of Invulnerability");
2094 if (desc) return _("一定時間、ダメージを受けなくなるバリアを張る。切れた瞬間に少しターンを消費するので注意。",
2095 "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks or duration time is exceeded.");
2100 if (info) return info_duration(base, base);
2104 set_invuln(randint1(base) + base, FALSE);
2115 * @brief 自然領域魔法の各処理を行う
2117 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
2118 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
2120 static cptr do_nature_spell(SPELL_IDX spell, BIT_FLAGS mode)
2122 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
2123 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
2124 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
2125 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
2127 static const char s_dam[] = _("損傷:", "dam ");
2128 static const char s_rng[] = _("射程", "rng ");
2131 int plev = p_ptr->lev;
2136 if (name) return _("モンスター感知", "Detect Creatures");
2137 if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
2140 int rad = DETECT_RAD_DEFAULT;
2142 if (info) return info_radius(rad);
2146 detect_monsters_normal(rad);
2152 if (name) return _("稲妻", "Lightning");
2153 if (desc) return _("電撃の短いビームを放つ。", "Fires a short beam of lightning.");
2156 int dice = 3 + (plev - 1) / 5;
2158 POSITION range = plev / 6 + 2;
2160 if (info) return format("%s%dd%d %s%d", s_dam, dice, sides, s_rng, range);
2164 project_length = range;
2166 if (!get_aim_dir(&dir)) return NULL;
2168 fire_beam(GF_ELEC, dir, damroll(dice, sides));
2174 if (name) return _("罠と扉感知", "Detect Doors and Traps");
2175 if (desc) return _("近くの全ての罠と扉を感知する。", "Detects traps, doors, and stairs in your vicinity.");
2178 int rad = DETECT_RAD_DEFAULT;
2180 if (info) return info_radius(rad);
2184 detect_traps(rad, TRUE);
2192 if (name) return _("食糧生成", "Produce Food");
2193 if (desc) return _("食料を一つ作り出す。", "Produces a Ration of Food.");
2198 object_type forge, *q_ptr = &forge;
2199 msg_print(_("食料を生成した。", "A food ration is produced."));
2201 /* Create the food ration */
2202 object_prep(q_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION));
2204 /* Drop the object from heaven */
2205 drop_near(q_ptr, -1, p_ptr->y, p_ptr->x);
2211 if (name) return _("日の光", "Daylight");
2212 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
2216 int sides = plev / 2;
2217 int rad = (plev / 10) + 1;
2219 if (info) return info_damage(dice, sides, 0);
2223 lite_area(damroll(dice, sides), rad);
2225 if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)
2227 msg_print(_("日の光があなたの肉体を焦がした!", "The daylight scorches your flesh!"));
2228 take_hit(DAMAGE_NOESCAPE, damroll(2, 2), _("日の光", "daylight"), -1);
2235 if (name) return _("動物習し", "Animal Taming");
2236 if (desc) return _("動物1体を魅了する。抵抗されると無効。", "Attempts to charm an animal.");
2241 if (info) return info_power(power);
2245 if (!get_aim_dir(&dir)) return NULL;
2247 charm_animal(dir, power);
2253 if (name) return _("環境への耐性", "Resist Environment");
2254 if (desc) return _("一定時間、冷気、炎、電撃に対する耐性を得る。装備による耐性に累積する。",
2255 "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");
2260 if (info) return info_duration(base, base);
2264 set_oppose_cold(randint1(base) + base, FALSE);
2265 set_oppose_fire(randint1(base) + base, FALSE);
2266 set_oppose_elec(randint1(base) + base, FALSE);
2272 if (name) return _("傷と毒治療", "Cure Wounds & Poison");
2273 if (desc) return _("怪我を全快させ、毒を体から完全に取り除き、体力を少し回復させる。", "Heals all cut and poison status. Heals HP a little.");
2279 if (info) return info_heal(dice, sides, 0);
2283 hp_player(damroll(dice, sides));
2291 if (name) return _("岩石溶解", "Stone to Mud");
2292 if (desc) return _("壁を溶かして床にする。", "Turns one rock square to mud.");
2299 if (info) return info_damage(dice, sides, base);
2303 if (!get_aim_dir(&dir)) return NULL;
2305 wall_to_mud(dir, 20 + randint1(30));
2311 if (name) return _("アイス・ボルト", "Frost Bolt");
2312 if (desc) return _("冷気のボルトもしくはビームを放つ。", "Fires a bolt or beam of cold.");
2315 int dice = 3 + (plev - 5) / 4;
2318 if (info) return info_damage(dice, sides, 0);
2322 if (!get_aim_dir(&dir)) return NULL;
2323 fire_bolt_or_beam(beam_chance() - 10, GF_COLD, dir, damroll(dice, sides));
2329 if (name) return _("自然の覚醒", "Nature Awareness");
2330 if (desc) return _("周辺の地形を感知し、近くの罠、扉、階段、全てのモンスターを感知する。",
2331 "Maps nearby area. Detects all monsters, traps, doors and stairs.");
2334 int rad1 = DETECT_RAD_MAP;
2335 int rad2 = DETECT_RAD_DEFAULT;
2337 if (info) return info_radius(MAX(rad1, rad2));
2342 detect_traps(rad2, TRUE);
2344 detect_stairs(rad2);
2345 detect_monsters_normal(rad2);
2351 if (name) return _("ファイア・ボルト", "Fire Bolt");
2352 if (desc) return _("火炎のボルトもしくはビームを放つ。", "Fires a bolt or beam of fire.");
2355 int dice = 5 + (plev - 5) / 4;
2358 if (info) return info_damage(dice, sides, 0);
2362 if (!get_aim_dir(&dir)) return NULL;
2363 fire_bolt_or_beam(beam_chance() - 10, GF_FIRE, dir, damroll(dice, sides));
2369 if (name) return _("太陽光線", "Ray of Sunlight");
2370 if (desc) return _("光線を放つ。光りを嫌うモンスターに効果がある。", "Fires a beam of light which damages to light-sensitive monsters.");
2376 if (info) return info_damage(dice, sides, 0);
2380 if (!get_aim_dir(&dir)) return NULL;
2381 msg_print(_("太陽光線が現れた。", "A line of sunlight appears."));
2382 lite_line(dir, damroll(6, 8));
2388 if (name) return _("足かせ", "Entangle");
2389 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
2394 if (info) return info_power(power);
2398 slow_monsters(plev);
2404 if (name) return _("動物召喚", "Summon Animal");
2405 if (desc) return _("動物を1体召喚する。", "Summons an animal.");
2410 if (!(summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_ANIMAL_RANGER, (PM_ALLOW_GROUP | PM_FORCE_PET))))
2412 msg_print(_("動物は現れなかった。", "No animals arrive."));
2420 if (name) return _("薬草治療", "Herbal Healing");
2421 if (desc) return _("体力を大幅に回復させ、負傷、朦朧状態、毒から全快する。", "Heals HP greatly. And heals cut, stun and poison completely.");
2426 if (info) return info_heal(0, 0, heal);
2439 if (name) return _("階段生成", "Stair Building");
2440 if (desc) return _("自分のいる位置に階段を作る。", "Creates a stair which goes down or up.");
2451 if (name) return _("肌石化", "Stone Skin");
2452 if (desc) return _("一定時間、ACを上昇させる。", "Gives bonus to AC for a while.");
2458 if (info) return info_duration(base, sides);
2462 set_shield(randint1(sides) + base, FALSE);
2468 if (name) return _("真・耐性", "Resistance True");
2469 if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
2470 "Gives resistance to fire, cold, electricity, acid and poison for a while. These resistances can be added to which from equipment for more powerful resistances.");
2475 if (info) return info_duration(base, base);
2479 set_oppose_acid(randint1(base) + base, FALSE);
2480 set_oppose_elec(randint1(base) + base, FALSE);
2481 set_oppose_fire(randint1(base) + base, FALSE);
2482 set_oppose_cold(randint1(base) + base, FALSE);
2483 set_oppose_pois(randint1(base) + base, FALSE);
2489 if (name) return _("森林創造", "Forest Creation");
2490 if (desc) return _("周囲に木を作り出す。", "Creates trees in all adjacent squares.");
2501 if (name) return _("動物友和", "Animal Friendship");
2502 if (desc) return _("視界内の全ての動物を魅了する。抵抗されると無効。", "Attempts to charm all animals in sight.");
2505 int power = plev * 2;
2507 if (info) return info_power(power);
2511 charm_animals(power);
2517 if (name) return _("試金石", "Stone Tell");
2518 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
2523 if (!identify_fully(FALSE)) return NULL;
2529 if (name) return _("石の壁", "Wall of Stone");
2530 if (desc) return _("自分の周囲に花崗岩の壁を作る。", "Creates granite walls in all adjacent squares.");
2541 if (name) return _("腐食防止", "Protect from Corrosion");
2542 if (desc) return _("アイテムを酸で傷つかないよう加工する。", "Makes an equipment acid-proof.");
2547 if (!rustproof()) return NULL;
2553 if (name) return _("地震", "Earthquake");
2554 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
2555 "Shakes dungeon structure, and results in random swapping of floors and walls.");
2560 if (info) return info_radius(rad);
2564 earthquake(p_ptr->y, p_ptr->x, rad);
2570 if (name) return _("カマイタチ", "Cyclone");
2571 if (desc) return _("全方向に向かって攻撃する。", "Attacks all adjacent monsters.");
2578 monster_type *m_ptr;
2580 for (dir = 0; dir < 8; dir++)
2582 y = p_ptr->y + ddy_ddd[dir];
2583 x = p_ptr->x + ddx_ddd[dir];
2584 c_ptr = &cave[y][x];
2586 /* Get the monster */
2587 m_ptr = &m_list[c_ptr->m_idx];
2589 /* Hack -- attack monsters */
2590 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
2598 if (name) return _("ブリザード", "Blizzard");
2599 if (desc) return _("巨大な冷気の球を放つ。", "Fires a huge ball of cold.");
2602 HIT_POINT dam = 70 + plev * 3 / 2;
2603 int rad = plev / 12 + 1;
2605 if (info) return info_damage(0, 0, dam);
2609 if (!get_aim_dir(&dir)) return NULL;
2611 fire_ball(GF_COLD, dir, dam, rad);
2617 if (name) return _("稲妻嵐", "Lightning Storm");
2618 if (desc) return _("巨大な電撃の球を放つ。", "Fires a huge electric ball.");
2621 HIT_POINT dam = 90 + plev * 3 / 2;
2622 int rad = plev / 12 + 1;
2624 if (info) return info_damage(0, 0, dam);
2628 if (!get_aim_dir(&dir)) return NULL;
2629 fire_ball(GF_ELEC, dir, dam, rad);
2636 if (name) return _("渦潮", "Whirlpool");
2637 if (desc) return _("巨大な水の球を放つ。", "Fires a huge ball of water.");
2640 HIT_POINT dam = 100 + plev * 3 / 2;
2641 int rad = plev / 12 + 1;
2643 if (info) return info_damage(0, 0, dam);
2647 if (!get_aim_dir(&dir)) return NULL;
2648 fire_ball(GF_WATER, dir, dam, rad);
2654 if (name) return _("陽光召喚", "Call Sunlight");
2655 if (desc) return _("自分を中心とした光の球を発生させる。さらに、その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。",
2656 "Generates ball of light centered on you. Maps and lights whole dungeon level. Knows all objects location.");
2659 HIT_POINT dam = 150;
2662 if (info) return info_damage(0, 0, dam/2);
2666 fire_ball(GF_LITE, 0, dam, rad);
2667 chg_virtue(V_KNOWLEDGE, 1);
2668 chg_virtue(V_ENLIGHTEN, 1);
2671 if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)
2673 msg_print(_("日光があなたの肉体を焦がした!", "The sunlight scorches your flesh!"));
2674 take_hit(DAMAGE_NOESCAPE, 50, _("日光", "sunlight"), -1);
2681 if (name) return _("精霊の刃", "Elemental Branding");
2682 if (desc) return _("武器に炎か冷気の属性をつける。", "Makes current weapon fire or frost branded.");
2687 brand_weapon(randint0(2));
2693 if (name) return _("自然の脅威", "Nature's Wrath");
2694 if (desc) return _("近くの全てのモンスターにダメージを与え、地震を起こし、自分を中心とした分解の球を発生させる。",
2695 "Damages all monsters in sight. Makes quake. Generates disintegration ball centered on you.");
2698 int d_dam = 4 * plev;
2699 int b_dam = (100 + plev) * 2;
2700 int b_rad = 1 + plev / 12;
2701 int q_rad = 20 + plev / 2;
2703 if (info) return format("%s%d+%d", s_dam, d_dam, b_dam/2);
2707 dispel_monsters(d_dam);
2708 earthquake(p_ptr->y, p_ptr->x, q_rad);
2709 project(0, b_rad, p_ptr->y, p_ptr->x, b_dam, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM, -1);
2720 * @brief カオス領域魔法の各処理を行う
2722 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
2723 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
2725 static cptr do_chaos_spell(SPELL_IDX spell, BIT_FLAGS mode)
2727 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
2728 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
2729 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
2730 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
2732 static const char s_dam[] = _("損傷:", "dam ");
2733 static const char s_random[] = _("ランダム", "random");
2736 int plev = p_ptr->lev;
2741 if (name) return _("マジック・ミサイル", "Magic Missile");
2742 if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");
2745 int dice = 3 + ((plev - 1) / 5);
2748 if (info) return info_damage(dice, sides, 0);
2752 if (!get_aim_dir(&dir)) return NULL;
2754 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));
2760 if (name) return _("トラップ/ドア破壊", "Trap / Door Destruction");
2761 if (desc) return _("隣接する罠と扉を破壊する。", "Destroys all traps in adjacent squares.");
2766 if (info) return info_radius(rad);
2770 destroy_doors_touch();
2776 if (name) return _("閃光", "Flash of Light");
2777 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
2781 int sides = plev / 2;
2782 int rad = (plev / 10) + 1;
2784 if (info) return info_damage(dice, sides, 0);
2788 lite_area(damroll(dice, sides), rad);
2794 if (name) return _("混乱の手", "Touch of Confusion");
2795 if (desc) return _("相手を混乱させる攻撃をできるようにする。", "Attempts to confuse the next monster that you hit.");
2800 if (!(p_ptr->special_attack & ATTACK_CONFUSE))
2802 msg_print(_("あなたの手は光り始めた。", "Your hands start glowing."));
2803 p_ptr->special_attack |= ATTACK_CONFUSE;
2804 p_ptr->redraw |= (PR_STATUS);
2811 if (name) return _("魔力炸裂", "Mana Burst");
2812 if (desc) return _("魔法の球を放つ。", "Fires a ball of magic.");
2817 int rad = (plev < 30) ? 2 : 3;
2820 if (p_ptr->pclass == CLASS_MAGE ||
2821 p_ptr->pclass == CLASS_HIGH_MAGE ||
2822 p_ptr->pclass == CLASS_SORCERER)
2823 base = plev + plev / 2;
2825 base = plev + plev / 4;
2828 if (info) return info_damage(dice, sides, base);
2832 if (!get_aim_dir(&dir)) return NULL;
2834 fire_ball(GF_MISSILE, dir, damroll(dice, sides) + base, rad);
2837 * Shouldn't actually use GF_MANA, as
2838 * it will destroy all items on the
2846 if (name) return _("ファイア・ボルト", "Fire Bolt");
2847 if (desc) return _("炎のボルトもしくはビームを放つ。", "Fires a bolt or beam of fire.");
2850 int dice = 8 + (plev - 5) / 4;
2853 if (info) return info_damage(dice, sides, 0);
2857 if (!get_aim_dir(&dir)) return NULL;
2859 fire_bolt_or_beam(beam_chance(), GF_FIRE, dir, damroll(dice, sides));
2865 if (name) return _("力の拳", "Fist of Force");
2866 if (desc) return _("ごく小さな分解の球を放つ。", "Fires a tiny ball of disintegration.");
2869 int dice = 8 + ((plev - 5) / 4);
2872 if (info) return info_damage(dice, sides, 0);
2876 if (!get_aim_dir(&dir)) return NULL;
2878 fire_ball(GF_DISINTEGRATE, dir,
2879 damroll(dice, sides), 0);
2885 if (name) return _("テレポート", "Teleport Self");
2886 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
2889 POSITION range = plev * 5;
2891 if (info) return info_range(range);
2895 teleport_player(range, 0L);
2901 if (name) return _("ワンダー", "Wonder");
2902 if (desc) return _("モンスターにランダムな効果を与える。", "Fires something with random effects.");
2905 if (info) return s_random;
2910 if (!get_aim_dir(&dir)) return NULL;
2918 if (name) return _("カオス・ボルト", "Chaos Bolt");
2919 if (desc) return _("カオスのボルトもしくはビームを放つ。", "Fires a bolt or ball of chaos.");
2922 int dice = 10 + (plev - 5) / 4;
2925 if (info) return info_damage(dice, sides, 0);
2929 if (!get_aim_dir(&dir)) return NULL;
2931 fire_bolt_or_beam(beam_chance(), GF_CHAOS, dir, damroll(dice, sides));
2937 if (name) return _("ソニック・ブーム", "Sonic Boom");
2938 if (desc) return _("自分を中心とした轟音の球を発生させる。", "Generates a ball of sound centered on you.");
2941 HIT_POINT dam = 60 + plev;
2942 int rad = plev / 10 + 2;
2944 if (info) return info_damage(0, 0, dam/2);
2948 msg_print(_("ドーン!部屋が揺れた!", "BOOM! Shake the room!"));
2949 project(0, rad, p_ptr->y, p_ptr->x, dam, GF_SOUND, PROJECT_KILL | PROJECT_ITEM, -1);
2955 if (name) return _("破滅の矢", "Doom Bolt");
2956 if (desc) return _("純粋な魔力のビームを放つ。", "Fires a beam of pure mana.");
2959 int dice = 11 + (plev - 5) / 4;
2962 if (info) return info_damage(dice, sides, 0);
2966 if (!get_aim_dir(&dir)) return NULL;
2968 fire_beam(GF_MANA, dir, damroll(dice, sides));
2974 if (name) return _("ファイア・ボール", "Fire Ball");
2975 if (desc) return _("炎の球を放つ。", "Fires a ball of fire.");
2978 HIT_POINT dam = plev + 55;
2981 if (info) return info_damage(0, 0, dam);
2985 if (!get_aim_dir(&dir)) return NULL;
2987 fire_ball(GF_FIRE, dir, dam, rad);
2993 if (name) return _("テレポート・アウェイ", "Teleport Other");
2994 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
2999 if (info) return info_power(power);
3003 if (!get_aim_dir(&dir)) return NULL;
3005 fire_beam(GF_AWAY_ALL, dir, power);
3011 if (name) return _("破壊の言葉", "Word of Destruction");
3012 if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroy everything in nearby area.");
3020 destroy_area(p_ptr->y, p_ptr->x, base + randint1(sides), FALSE);
3026 if (name) return _("ログルス発動", "Invoke Logrus");
3027 if (desc) return _("巨大なカオスの球を放つ。", "Fires a huge ball of chaos.");
3030 HIT_POINT dam = plev * 2 + 99;
3033 if (info) return info_damage(0, 0, dam);
3037 if (!get_aim_dir(&dir)) return NULL;
3039 fire_ball(GF_CHAOS, dir, dam, rad);
3045 if (name) return _("他者変容", "Polymorph Other");
3046 if (desc) return _("モンスター1体を変身させる。抵抗されると無効。", "Attempts to polymorph a monster.");
3051 if (info) return info_power(power);
3055 if (!get_aim_dir(&dir)) return NULL;
3057 poly_monster(dir, plev);
3063 if (name) return _("連鎖稲妻", "Chain Lightning");
3064 if (desc) return _("全方向に対して電撃のビームを放つ。", "Fires lightning beams in all directions.");
3067 int dice = 5 + plev / 10;
3070 if (info) return info_damage(dice, sides, 0);
3074 for (dir = 0; dir <= 9; dir++)
3075 fire_beam(GF_ELEC, dir, damroll(dice, sides));
3081 if (name) return _("魔力封入", "Arcane Binding");
3082 if (desc) return _("杖/魔法棒の充填回数を増やすか、充填中のロッドの充填時間を減らす。", "Recharges staffs, wands or rods.");
3087 if (info) return info_power(power);
3091 if (!recharge(power)) return NULL;
3097 if (name) return _("原子分解", "Disintegrate");
3098 if (desc) return _("巨大な分解の球を放つ。", "Fires a huge ball of disintegration.");
3101 HIT_POINT dam = plev + 70;
3102 int rad = 3 + plev / 40;
3104 if (info) return info_damage(0, 0, dam);
3108 if (!get_aim_dir(&dir)) return NULL;
3110 fire_ball(GF_DISINTEGRATE, dir, dam, rad);
3116 if (name) return _("現実変容", "Alter Reality");
3117 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
3123 if (info) return info_delay(base, sides);
3133 if (name) return _("マジック・ロケット", "Magic Rocket");
3134 if (desc) return _("ロケットを発射する。", "Fires a magic rocket.");
3137 HIT_POINT dam = 120 + plev * 2;
3140 if (info) return info_damage(0, 0, dam);
3144 if (!get_aim_dir(&dir)) return NULL;
3146 msg_print(_("ロケット発射!", "You launch a rocket!"));
3147 fire_rocket(GF_ROCKET, dir, dam, rad);
3153 if (name) return _("混沌の刃", "Chaos Branding");
3154 if (desc) return _("武器にカオスの属性をつける。", "Makes current weapon a Chaotic weapon.");
3165 if (name) return _("悪魔召喚", "Summon Demon");
3166 if (desc) return _("悪魔を1体召喚する。", "Summons a demon.");
3172 bool pet = !one_in_(3);
3174 if (pet) flg |= PM_FORCE_PET;
3175 else flg |= PM_NO_PET;
3176 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
3178 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_DEMON, flg))
3180 msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));
3183 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
3187 msg_print(_("「卑しき者よ、我は汝の下僕にあらず! お前の魂を頂くぞ!」",
3188 "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));
3196 if (name) return _("重力光線", "Beam of Gravity");
3197 if (desc) return _("重力のビームを放つ。", "Fires a beam of gravity.");
3200 int dice = 9 + (plev - 5) / 4;
3203 if (info) return info_damage(dice, sides, 0);
3207 if (!get_aim_dir(&dir)) return NULL;
3209 fire_beam(GF_GRAVITY, dir, damroll(dice, sides));
3215 if (name) return _("流星群", "Meteor Swarm");
3216 if (desc) return _("自分の周辺に隕石を落とす。", "Makes meteor balls fall down to nearby random locations.");
3219 HIT_POINT dam = plev * 2;
3222 if (info) return info_multi_damage(dam);
3226 cast_meteor(dam, rad);
3232 if (name) return _("焔の一撃", "Flame Strike");
3233 if (desc) return _("自分を中心とした超巨大な炎の球を発生させる。", "Generate a huge ball of fire centered on you.");
3236 HIT_POINT dam = 300 + 3 * plev;
3239 if (info) return info_damage(0, 0, dam/2);
3243 fire_ball(GF_FIRE, 0, dam, rad);
3249 if (name) return _("混沌召来", "Call Chaos");
3250 if (desc) return _("ランダムな属性の球やビームを発生させる。", "Generate random kind of balls or beams.");
3253 if (info) return format("%s150 / 250", s_dam);
3263 if (name) return _("自己変容", "Polymorph Self");
3264 if (desc) return _("自分を変身させようとする。", "Polymorphs yourself.");
3269 if (!get_check(_("変身します。よろしいですか?", "You will polymorph yourself. Are you sure? "))) return NULL;
3276 if (name) return _("魔力の嵐", "Mana Storm");
3277 if (desc) return _("非常に強力で巨大な純粋な魔力の球を放つ。", "Fires an extremely powerful huge ball of pure mana.");
3280 HIT_POINT dam = 300 + plev * 4;
3283 if (info) return info_damage(0, 0, dam);
3287 if (!get_aim_dir(&dir)) return NULL;
3289 fire_ball(GF_MANA, dir, dam, rad);
3295 if (name) return _("ログルスのブレス", "Breathe Logrus");
3296 if (desc) return _("非常に強力なカオスの球を放つ。", "Fires an extremely powerful ball of chaos.");
3299 HIT_POINT dam = p_ptr->chp;
3302 if (info) return info_damage(0, 0, dam);
3306 if (!get_aim_dir(&dir)) return NULL;
3308 fire_ball(GF_CHAOS, dir, dam, rad);
3314 if (name) return _("虚無召来", "Call the Void");
3315 if (desc) return _("自分に周囲に向かって、ロケット、純粋な魔力の球、放射性廃棄物の球を放つ。ただし、壁に隣接して使用すると広範囲を破壊する。",
3316 "Fires rockets, mana balls and nuclear waste balls in all directions each unless you are not adjacent to any walls. Otherwise *destroys* huge area.");
3319 if (info) return format("%s3 * 175", s_dam);
3333 * @brief 暗黒領域魔法の各処理を行う
3335 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
3336 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
3338 static cptr do_death_spell(SPELL_IDX spell, BIT_FLAGS mode)
3340 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
3341 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
3342 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
3343 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
3345 static const char s_dam[] = _("損傷:", "dam ");
3346 static const char s_random[] = _("ランダム", "random");
3349 int plev = p_ptr->lev;
3354 if (name) return _("無生命感知", "Detect Unlife");
3355 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
3358 int rad = DETECT_RAD_DEFAULT;
3360 if (info) return info_radius(rad);
3364 detect_monsters_nonliving(rad);
3370 if (name) return _("呪殺弾", "Malediction");
3371 if (desc) return _("ごく小さな邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",
3372 "Fires a tiny ball of evil power which hurts good monsters greatly.");
3375 int dice = 3 + (plev - 1) / 5;
3379 if (info) return info_damage(dice, sides, 0);
3383 if (!get_aim_dir(&dir)) return NULL;
3386 * A radius-0 ball may (1) be aimed at
3387 * objects etc., and will affect them;
3388 * (2) may be aimed at ANY visible
3389 * monster, unlike a 'bolt' which must
3390 * travel to the monster.
3393 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides), rad);
3397 /* Special effect first */
3398 int effect = randint1(1000);
3401 fire_ball_hide(GF_DEATH_RAY, dir, plev * 200, 0);
3402 else if (effect < 500)
3403 fire_ball_hide(GF_TURN_ALL, dir, plev, 0);
3404 else if (effect < 800)
3405 fire_ball_hide(GF_OLD_CONF, dir, plev, 0);
3407 fire_ball_hide(GF_STUN, dir, plev, 0);
3414 if (name) return _("邪悪感知", "Detect Evil");
3415 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
3418 int rad = DETECT_RAD_DEFAULT;
3420 if (info) return info_radius(rad);
3424 detect_monsters_evil(rad);
3430 if (name) return _("悪臭雲", "Stinking Cloud");
3431 if (desc) return _("毒の球を放つ。", "Fires a ball of poison.");
3434 HIT_POINT dam = 10 + plev / 2;
3437 if (info) return info_damage(0, 0, dam);
3441 if (!get_aim_dir(&dir)) return NULL;
3443 fire_ball(GF_POIS, dir, dam, rad);
3449 if (name) return _("黒い眠り", "Black Sleep");
3450 if (desc) return _("1体のモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep a monster.");
3455 if (info) return info_power(power);
3459 if (!get_aim_dir(&dir)) return NULL;
3461 sleep_monster(dir, plev);
3467 if (name) return _("耐毒", "Resist Poison");
3468 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",
3469 "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");
3474 if (info) return info_duration(base, base);
3478 set_oppose_pois(randint1(base) + base, FALSE);
3484 if (name) return _("恐慌", "Horrify");
3485 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
3490 if (info) return info_power(power);
3494 if (!get_aim_dir(&dir)) return NULL;
3496 fear_monster(dir, power);
3497 stun_monster(dir, power);
3503 if (name) return _("アンデッド従属", "Enslave Undead");
3504 if (desc) return _("アンデッド1体を魅了する。抵抗されると無効。", "Attempts to charm an undead monster.");
3509 if (info) return info_power(power);
3513 if (!get_aim_dir(&dir)) return NULL;
3515 control_one_undead(dir, power);
3521 if (name) return _("エントロピーの球", "Orb of Entropy");
3522 if (desc) return _("生命のある者のHPと最大HP双方にダメージを与える効果のある球を放つ。", "Fires a ball which damages to both HP and MaxHP of living monsters.");
3527 int rad = (plev < 30) ? 2 : 3;
3530 if (p_ptr->pclass == CLASS_MAGE ||
3531 p_ptr->pclass == CLASS_HIGH_MAGE ||
3532 p_ptr->pclass == CLASS_SORCERER)
3533 base = plev + plev / 2;
3535 base = plev + plev / 4;
3538 if (info) return info_damage(dice, sides, base);
3542 if (!get_aim_dir(&dir)) return NULL;
3544 fire_ball(GF_HYPODYNAMIA, dir, damroll(dice, sides) + base, rad);
3550 if (name) return _("地獄の矢", "Nether Bolt");
3551 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
3554 int dice = 8 + (plev - 5) / 4;
3557 if (info) return info_damage(dice, sides, 0);
3561 if (!get_aim_dir(&dir)) return NULL;
3563 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
3569 if (name) return _("殺戮雲", "Cloud kill");
3570 if (desc) return _("自分を中心とした毒の球を発生させる。", "Generate a ball of poison centered on you.");
3573 HIT_POINT dam = (30 + plev) * 2;
3574 int rad = plev / 10 + 2;
3576 if (info) return info_damage(0, 0, dam/2);
3580 project(0, rad, p_ptr->y, p_ptr->x, dam, GF_POIS, PROJECT_KILL | PROJECT_ITEM, -1);
3586 if (name) return _("モンスター消滅", "Genocide One");
3587 if (desc) return _("モンスター1体を消し去る。経験値やアイテムは手に入らない。抵抗されると無効。", "Attempts to vanish a monster.");
3590 int power = plev + 50;
3592 if (info) return info_power(power);
3596 if (!get_aim_dir(&dir)) return NULL;
3598 fire_ball_hide(GF_GENOCIDE, dir, power, 0);
3604 if (name) return _("毒の刃", "Poison Branding");
3605 if (desc) return _("武器に毒の属性をつける。", "Makes current weapon poison branded.");
3616 if (name) return _("吸血の矢", "Vampiric Bolt");
3617 if (desc) return _("ボルトによりモンスター1体から生命力を吸いとる。吸いとった生命力によって満腹度が上がる。",
3618 "Absorbs some HP from a monster and gives them to you by bolt. You will also gain nutritional sustenance from this.");
3622 int sides = plev * 2;
3623 int base = plev * 2;
3625 if (info) return info_damage(dice, sides, base);
3629 HIT_POINT dam = base + damroll(dice, sides);
3631 if (!get_aim_dir(&dir)) return NULL;
3633 if (hypodynamic_bolt(dir, dam))
3635 chg_virtue(V_SACRIFICE, -1);
3636 chg_virtue(V_VITALITY, -1);
3641 * Gain nutritional sustenance:
3644 * A Food ration gives 5000
3645 * food points (by contrast)
3646 * Don't ever get more than
3647 * "Full" this way But if we
3648 * ARE Gorged, it won't cure
3651 dam = p_ptr->food + MIN(5000, 100 * dam);
3653 /* Not gorged already */
3654 if (p_ptr->food < PY_FOOD_MAX)
3655 set_food(dam >= PY_FOOD_MAX ? PY_FOOD_MAX - 1 : dam);
3662 if (name) return _("反魂の術", "Animate dead");
3663 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
3668 animate_dead(0, p_ptr->y, p_ptr->x);
3674 if (name) return _("抹殺", "Genocide");
3675 if (desc) return _("指定した文字のモンスターを現在の階から消し去る。抵抗されると無効。",
3676 "Eliminates an entire class of monster, exhausting you. Powerful or unique monsters may resist.");
3679 int power = plev+50;
3681 if (info) return info_power(power);
3685 symbol_genocide(power, TRUE);
3691 if (name) return _("狂戦士化", "Berserk");
3692 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");
3697 if (info) return info_duration(base, base);
3701 set_shero(randint1(base) + base, FALSE);
3709 if (name) return _("悪霊召喚", "Invoke Spirits");
3710 if (desc) return _("ランダムで様々な効果が起こる。", "Causes random effects.");
3713 if (info) return s_random;
3717 if (!get_aim_dir(&dir)) return NULL;
3719 cast_invoke_spirits(dir);
3725 if (name) return _("暗黒の矢", "Dark Bolt");
3726 if (desc) return _("暗黒のボルトもしくはビームを放つ。", "Fires a bolt or beam of darkness.");
3729 int dice = 4 + (plev - 5) / 4;
3732 if (info) return info_damage(dice, sides, 0);
3736 if (!get_aim_dir(&dir)) return NULL;
3738 fire_bolt_or_beam(beam_chance(), GF_DARK, dir, damroll(dice, sides));
3744 if (name) return _("狂乱戦士", "Battle Frenzy");
3745 if (desc) return _("狂戦士化し、恐怖を除去し、加速する。",
3746 "Gives another bonus to hit and HP, immunity to fear for a while. Hastes you. But decreases AC.");
3750 int sp_base = plev / 2;
3751 int sp_sides = 20 + plev / 2;
3753 if (info) return info_duration(b_base, b_base);
3757 set_shero(randint1(25) + 25, FALSE);
3760 set_fast(randint1(sp_sides) + sp_base, FALSE);
3766 if (name) return _("吸血の刃", "Vampiric Branding");
3767 if (desc) return _("武器に吸血の属性をつける。", "Makes current weapon Vampiric.");
3778 if (name) return _("吸血の連矢", "Vampiric Bolts");
3779 if (desc) return _("3連射のボルトによりモンスター1体から生命力を吸いとる。吸いとった生命力によって体力が回復する。",
3780 "Fires 3 bolts. Each of the bolts absorbs some HP from a monster and gives them to you.");
3782 HIT_POINT dam = 100;
3784 if (info) return format("%s3*%d", s_dam, dam);
3790 if (!get_aim_dir(&dir)) return NULL;
3792 chg_virtue(V_SACRIFICE, -1);
3793 chg_virtue(V_VITALITY, -1);
3795 for (i = 0; i < 3; i++)
3797 if (hypodynamic_bolt(dir, dam))
3805 if (name) return _("死の言魂", "Nether Wave");
3806 if (desc) return _("視界内の生命のあるモンスターにダメージを与える。", "Damages all living monsters in sight.");
3809 int sides = plev * 3;
3811 if (info) return info_damage(1, sides, 0);
3815 dispel_living(randint1(sides));
3821 if (name) return _("暗黒の嵐", "Darkness Storm");
3822 if (desc) return _("巨大な暗黒の球を放つ。", "Fires a huge ball of darkness.");
3825 HIT_POINT dam = 100 + plev * 2;
3828 if (info) return info_damage(0, 0, dam);
3832 if (!get_aim_dir(&dir)) return NULL;
3834 fire_ball(GF_DARK, dir, dam, rad);
3840 if (name) return _("死の光線", "Death Ray");
3841 if (desc) return _("死の光線を放つ。", "Fires a beam of death.");
3846 if (!get_aim_dir(&dir)) return NULL;
3848 death_ray(dir, plev);
3854 if (name) return _("死者召喚", "Raise the Dead");
3855 if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");
3861 bool pet = one_in_(3);
3864 type = (plev > 47 ? SUMMON_HI_UNDEAD : SUMMON_UNDEAD);
3866 if (!pet || (pet && (plev > 24) && one_in_(3)))
3867 flg |= PM_ALLOW_GROUP;
3869 if (pet) flg |= PM_FORCE_PET;
3870 else flg |= (PM_ALLOW_UNIQUE | PM_NO_PET);
3872 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, type, flg))
3874 msg_print(_("冷たい風があなたの周りに吹き始めた。それは腐敗臭を運んでいる...",
3875 "Cold winds begin to blow around you, carrying with them the stench of decay..."));
3880 msg_print(_("古えの死せる者共があなたに仕えるため土から甦った!",
3881 "Ancient, long-dead forms arise from the ground to serve you!"));
3885 msg_print(_("死者が甦った。眠りを妨げるあなたを罰するために!",
3886 "'The dead arise... to punish you for disturbing them!'"));
3889 chg_virtue(V_UNLIFE, 1);
3896 if (name) return _("死者の秘伝", "Esoteria");
3897 if (desc) return _("アイテムを1つ識別する。レベルが高いとアイテムの能力を完全に知ることができる。",
3898 "Identifies an item. Or *identifies* an item at higher level.");
3903 if (randint1(50) > plev)
3905 if (!ident_spell(FALSE)) return NULL;
3909 if (!identify_fully(FALSE)) return NULL;
3916 if (name) return _("吸血鬼変化", "Polymorph Vampire");
3917 if (desc) return _("一定時間、吸血鬼に変化する。変化している間は本来の種族の能力を失い、代わりに吸血鬼としての能力を得る。",
3918 "Mimic a vampire for a while. Loses abilities of original race and gets abilities as a vampire.");
3921 int base = 10 + plev / 2;
3923 if (info) return info_duration(base, base);
3927 set_mimic(base + randint1(base), MIMIC_VAMPIRE, FALSE);
3933 if (name) return _("経験値復活", "Restore Life");
3934 if (desc) return _("失った経験値を回復する。", "Restore lost experience.");
3945 if (name) return _("周辺抹殺", "Mass Genocide");
3946 if (desc) return _("自分の周囲にいるモンスターを現在の階から消し去る。抵抗されると無効。",
3947 "Eliminates all nearby monsters, exhausting you. Powerful or unique monsters may be able to resist.");
3950 int power = plev + 50;
3952 if (info) return info_power(power);
3956 mass_genocide(power, TRUE);
3962 if (name) return _("地獄の劫火", "Hellfire");
3963 if (desc) return _("邪悪な力を持つ宝珠を放つ。善良なモンスターには大きなダメージを与える。",
3964 "Fires a powerful ball of evil power. Hurts good monsters greatly.");
3967 HIT_POINT dam = 666;
3970 if (info) return info_damage(0, 0, dam);
3974 if (!get_aim_dir(&dir)) return NULL;
3976 fire_ball(GF_HELL_FIRE, dir, dam, rad);
3977 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("地獄の劫火の呪文を唱えた疲労", "the strain of casting Hellfire"), -1);
3983 if (name) return _("幽体化", "Wraithform");
3984 if (desc) return _("一定時間、壁を通り抜けることができ受けるダメージが軽減される幽体の状態に変身する。",
3985 "Becomes wraith form which gives ability to pass walls and makes all damages half.");
3988 int base = plev / 2;
3990 if (info) return info_duration(base, base);
3994 set_wraith_form(randint1(base) + base, FALSE);
4005 * @brief トランプ領域魔法の各処理を行う
4007 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
4008 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
4010 static cptr do_trump_spell(SPELL_IDX spell, BIT_FLAGS mode)
4012 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
4013 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
4014 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
4015 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
4016 bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
4017 static const char s_random[] = _("ランダム", "random");
4020 int plev = p_ptr->lev;
4025 if (name) return _("ショート・テレポート", "Phase Door");
4026 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");
4029 POSITION range = 10;
4031 if (info) return info_range(range);
4035 teleport_player(range, 0L);
4041 if (name) return _("蜘蛛のカード", "Trump Spiders");
4042 if (desc) return _("蜘蛛を召喚する。", "Summons spiders.");
4047 msg_print(_("あなたは蜘蛛のカードに集中する...", "You concentrate on the trump of an spider..."));
4048 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_SPIDER, PM_ALLOW_GROUP))
4052 msg_print(_("召喚された蜘蛛は怒っている!", "The summoned spiders get angry!"));
4060 if (name) return _("シャッフル", "Shuffle");
4061 if (desc) return _("カードの占いをする。", "Causes random effects.");
4064 if (info) return s_random;
4074 if (name) return _("フロア・リセット", "Reset Recall");
4075 if (desc) return _("最深階を変更する。", "Resets the 'deepest' level for recall spell.");
4080 if (!reset_recall()) return NULL;
4086 if (name) return _("テレポート", "Teleport");
4087 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
4090 POSITION range = plev * 4;
4092 if (info) return info_range(range);
4096 teleport_player(range, 0L);
4102 if (name) return _("感知のカード", "Trump Spying");
4103 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
4109 if (info) return info_duration(base, sides);
4113 set_tim_esp(randint1(sides) + base, FALSE);
4119 if (name) return _("テレポート・モンスター", "Teleport Away");
4120 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
4125 if (info) return info_power(power);
4129 if (!get_aim_dir(&dir)) return NULL;
4131 fire_beam(GF_AWAY_ALL, dir, power);
4137 if (name) return _("動物のカード", "Trump Animals");
4138 if (desc) return _("1体の動物を召喚する。", "Summons an animal.");
4143 int type = (!fail ? SUMMON_ANIMAL_RANGER : SUMMON_ANIMAL);
4144 msg_print(_("あなたは動物のカードに集中する...", "You concentrate on the trump of an animal..."));
4145 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, type, 0L))
4149 msg_print(_("召喚された動物は怒っている!", "The summoned animal gets angry!"));
4157 if (name) return _("移動のカード", "Trump Reach");
4158 if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");
4161 int weight = plev * 15;
4163 if (info) return info_weight(weight);
4167 if (!get_aim_dir(&dir)) return NULL;
4169 fetch(dir, weight, FALSE);
4175 if (name) return _("カミカゼのカード", "Trump Kamikaze");
4176 if (desc) return _("複数の爆発するモンスターを召喚する。", "Summons monsters which explode by itself.");
4186 if (!target_set(TARGET_KILL)) return NULL;
4192 /* Summons near player when failed */
4197 if (p_ptr->pclass == CLASS_BEASTMASTER)
4198 type = SUMMON_KAMIKAZE_LIVING;
4200 type = SUMMON_KAMIKAZE;
4202 msg_print(_("あなたはカミカゼのカードに集中する...", "You concentrate on several trumps at once..."));
4203 if (trump_summoning(2 + randint0(plev / 7), !fail, y, x, 0, type, 0L))
4207 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
4215 if (name) return _("幻霊召喚", "Phantasmal Servant");
4216 if (desc) return _("1体の幽霊を召喚する。", "Summons a ghost.");
4219 /* Phantasmal Servant is not summoned as enemy when failed */
4222 int summon_lev = plev * 2 / 3 + randint1(plev / 2);
4224 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, (summon_lev * 3 / 2), SUMMON_PHANTOM, 0L))
4226 msg_print(_("御用でございますか、御主人様?", "'Your wish, master?'"));
4233 if (name) return _("スピード・モンスター", "Haste Monster");
4234 if (desc) return _("モンスター1体を加速させる。", "Hastes a monster.");
4241 /* Temporary enable target_pet option */
4242 bool old_target_pet = target_pet;
4245 result = get_aim_dir(&dir);
4247 /* Restore target_pet option */
4248 target_pet = old_target_pet;
4250 if (!result) return NULL;
4252 speed_monster(dir, plev);
4258 if (name) return _("テレポート・レベル", "Teleport Level");
4259 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");
4264 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
4271 if (name) return _("次元の扉", "Dimension Door");
4272 if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleport to given location.");
4275 POSITION range = plev / 2 + 10;
4277 if (info) return info_range(range);
4281 msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));
4282 if (!dimension_door()) return NULL;
4288 if (name) return _("帰還の呪文", "Word of Recall");
4289 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
4290 "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
4296 if (info) return info_delay(base, sides);
4300 if (!word_of_recall()) return NULL;
4306 if (name) return _("怪物追放", "Banish");
4307 if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");
4310 int power = plev * 4;
4312 if (info) return info_power(power);
4316 banish_monsters(power);
4322 if (name) return _("位置交換のカード", "Swap Position");
4323 if (desc) return _("1体のモンスターと位置を交換する。", "Swap positions of you and a monster.");
4330 /* HACK -- No range limit */
4331 project_length = -1;
4333 result = get_aim_dir(&dir);
4335 /* Restore range to default */
4338 if (!result) return NULL;
4346 if (name) return _("アンデッドのカード", "Trump Undead");
4347 if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");
4352 msg_print(_("あなたはアンデッドのカードに集中する...", "You concentrate on the trump of an undead creature..."));
4353 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_UNDEAD, 0L))
4357 msg_print(_("召喚されたアンデッドは怒っている!", "The summoned undead creature gets angry!"));
4365 if (name) return _("爬虫類のカード", "Trump Reptiles");
4366 if (desc) return _("1体のヒドラを召喚する。", "Summons a hydra.");
4371 msg_print(_("あなたは爬虫類のカードに集中する...", "You concentrate on the trump of a reptile..."));
4372 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HYDRA, 0L))
4376 msg_print(_("召喚された爬虫類は怒っている!", "The summoned reptile gets angry!"));
4384 if (name) return _("モンスターのカード", "Trump Monsters");
4385 if (desc) return _("複数のモンスターを召喚する。", "Summons some monsters.");
4391 msg_print(_("あなたはモンスターのカードに集中する...", "You concentrate on several trumps at once..."));
4392 if (p_ptr->pclass == CLASS_BEASTMASTER)
4393 type = SUMMON_LIVING;
4397 if (trump_summoning((1 + (plev - 15)/ 10), !fail, p_ptr->y, p_ptr->x, 0, type, 0L))
4401 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
4410 if (name) return _("ハウンドのカード", "Trump Hounds");
4411 if (desc) return _("1グループのハウンドを召喚する。", "Summons a group of hounds.");
4416 msg_print(_("あなたはハウンドのカードに集中する...", "You concentrate on the trump of a hound..."));
4417 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HOUND, PM_ALLOW_GROUP))
4421 msg_print(_("召喚されたハウンドは怒っている!", "The summoned hounds get angry!"));
4429 if (name) return _("トランプの刃", "Trump Branding");
4430 if (desc) return _("武器にトランプの属性をつける。", "Makes current weapon a Trump weapon.");
4441 if (name) return _("人間トランプ", "Living Trump");
4442 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",
4443 "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");
4451 /* Teleport control */
4454 /* Random teleportation (uncontrolled) */
4457 /* Gain the mutation */
4458 if (gain_random_mutation(mutation))
4460 msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));
4467 if (name) return _("サイバーデーモンのカード", "Trump Cyberdemon");
4468 if (desc) return _("1体のサイバーデーモンを召喚する。", "Summons a cyber demon.");
4473 msg_print(_("あなたはサイバーデーモンのカードに集中する...", "You concentrate on the trump of a Cyberdemon..."));
4474 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_CYBER, 0L))
4478 msg_print(_("召喚されたサイバーデーモンは怒っている!", "The summoned Cyberdemon gets angry!"));
4486 if (name) return _("予見のカード", "Trump Divination");
4487 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
4488 "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
4491 int rad = DETECT_RAD_DEFAULT;
4493 if (info) return info_radius(rad);
4503 if (name) return _("知識のカード", "Trump Lore");
4504 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
4509 if (!identify_fully(FALSE)) return NULL;
4515 if (name) return _("回復モンスター", "Heal Monster");
4516 if (desc) return _("モンスター1体の体力を回復させる。", "Heal a monster.");
4519 int heal = plev * 10 + 200;
4521 if (info) return info_heal(0, 0, heal);
4527 /* Temporary enable target_pet option */
4528 bool old_target_pet = target_pet;
4531 result = get_aim_dir(&dir);
4533 /* Restore target_pet option */
4534 target_pet = old_target_pet;
4536 if (!result) return NULL;
4538 heal_monster(dir, heal);
4544 if (name) return _("ドラゴンのカード", "Trump Dragon");
4545 if (desc) return _("1体のドラゴンを召喚する。", "Summons a dragon.");
4550 msg_print(_("あなたはドラゴンのカードに集中する...", "You concentrate on the trump of a dragon..."));
4551 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_DRAGON, 0L))
4555 msg_print(_("召喚されたドラゴンは怒っている!", "The summoned dragon gets angry!"));
4563 if (name) return _("隕石のカード", "Trump Meteor");
4564 if (desc) return _("自分の周辺に隕石を落とす。", "Makes meteor balls fall down to nearby random locations.");
4567 HIT_POINT dam = plev * 2;
4570 if (info) return info_multi_damage(dam);
4574 cast_meteor(dam, rad);
4580 if (name) return _("デーモンのカード", "Trump Demon");
4581 if (desc) return _("1体の悪魔を召喚する。", "Summons a demon.");
4586 msg_print(_("あなたはデーモンのカードに集中する...", "You concentrate on the trump of a demon..."));
4587 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_DEMON, 0L))
4591 msg_print(_("召喚されたデーモンは怒っている!", "The summoned demon gets angry!"));
4599 if (name) return _("地獄のカード", "Trump Greater Undead");
4600 if (desc) return _("1体の上級アンデッドを召喚する。", "Summons a greater undead.");
4605 msg_print(_("あなたは強力なアンデッドのカードに集中する...", "You concentrate on the trump of a greater undead being..."));
4606 /* May allow unique depend on level and dice roll */
4607 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HI_UNDEAD, PM_ALLOW_UNIQUE))
4611 msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead creature gets angry!"));
4619 if (name) return _("古代ドラゴンのカード", "Trump Ancient Dragon");
4620 if (desc) return _("1体の古代ドラゴンを召喚する。", "Summons an ancient dragon.");
4627 if (p_ptr->pclass == CLASS_BEASTMASTER)
4628 type = SUMMON_HI_DRAGON_LIVING;
4630 type = SUMMON_HI_DRAGON;
4632 msg_print(_("あなたは古代ドラゴンのカードに集中する...", "You concentrate on the trump of an ancient dragon..."));
4633 /* May allow unique depend on level and dice roll */
4634 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, type, PM_ALLOW_UNIQUE))
4638 msg_print(_("召喚された古代ドラゴンは怒っている!", "The summoned ancient dragon gets angry!"));
4651 * @brief 秘術領域魔法の各処理を行う
4653 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
4654 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
4656 static cptr do_arcane_spell(SPELL_IDX spell, BIT_FLAGS mode)
4658 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
4659 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
4660 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
4661 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
4664 int plev = p_ptr->lev;
4669 if (name) return _("電撃", "Zap");
4670 if (desc) return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");
4673 int dice = 3 + (plev - 1) / 5;
4676 if (info) return info_damage(dice, sides, 0);
4680 if (!get_aim_dir(&dir)) return NULL;
4682 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));
4688 if (name) return _("魔法の施錠", "Wizard Lock");
4689 if (desc) return _("扉に鍵をかける。", "Locks a door.");
4694 if (!get_aim_dir(&dir)) return NULL;
4702 if (name) return _("透明体感知", "Detect Invisibility");
4703 if (desc) return _("近くの透明なモンスターを感知する。", "Detects all invisible monsters in your vicinity.");
4706 int rad = DETECT_RAD_DEFAULT;
4708 if (info) return info_radius(rad);
4712 detect_monsters_invis(rad);
4718 if (name) return _("モンスター感知", "Detect Monsters");
4719 if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
4722 int rad = DETECT_RAD_DEFAULT;
4724 if (info) return info_radius(rad);
4728 detect_monsters_normal(rad);
4734 if (name) return _("ショート・テレポート", "Blink");
4735 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");
4738 POSITION range = 10;
4740 if (info) return info_range(range);
4744 teleport_player(range, 0L);
4750 if (name) return _("ライト・エリア", "Light Area");
4751 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
4755 int sides = plev / 2;
4756 int rad = plev / 10 + 1;
4758 if (info) return info_damage(dice, sides, 0);
4762 lite_area(damroll(dice, sides), rad);
4768 if (name) return _("罠と扉 破壊", "Trap & Door Destruction");
4769 if (desc) return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");
4774 if (!get_aim_dir(&dir)) return NULL;
4782 if (name) return _("軽傷の治癒", "Cure Light Wounds");
4783 if (desc) return _("怪我と体力を少し回復させる。", "Heals cut and HP a little.");
4789 if (info) return info_heal(dice, sides, 0);
4793 hp_player(damroll(dice, sides));
4794 set_cut(p_ptr->cut - 10);
4800 if (name) return _("罠と扉 感知", "Detect Doors & Traps");
4801 if (desc) return _("近くの全ての罠と扉と階段を感知する。", "Detects traps, doors, and stairs in your vicinity.");
4804 int rad = DETECT_RAD_DEFAULT;
4806 if (info) return info_radius(rad);
4810 detect_traps(rad, TRUE);
4818 if (name) return _("燃素", "Phlogiston");
4819 if (desc) return _("光源に燃料を補給する。", "Adds more turns of light to a lantern or torch.");
4830 if (name) return _("財宝感知", "Detect Treasure");
4831 if (desc) return _("近くの財宝を感知する。", "Detects all treasures in your vicinity.");
4834 int rad = DETECT_RAD_DEFAULT;
4836 if (info) return info_radius(rad);
4840 detect_treasure(rad);
4841 detect_objects_gold(rad);
4847 if (name) return _("魔法 感知", "Detect Enchantment");
4848 if (desc) return _("近くの魔法がかかったアイテムを感知する。", "Detects all magical items in your vicinity.");
4851 int rad = DETECT_RAD_DEFAULT;
4853 if (info) return info_radius(rad);
4857 detect_objects_magic(rad);
4863 if (name) return _("アイテム感知", "Detect Objects");
4864 if (desc) return _("近くの全てのアイテムを感知する。", "Detects all items in your vicinity.");
4867 int rad = DETECT_RAD_DEFAULT;
4869 if (info) return info_radius(rad);
4873 detect_objects_normal(rad);
4879 if (name) return _("解毒", "Cure Poison");
4880 if (desc) return _("毒を体内から完全に取り除く。", "Cures poison status.");
4891 if (name) return _("耐冷", "Resist Cold");
4892 if (desc) return _("一定時間、冷気への耐性を得る。装備による耐性に累積する。", "Gives resistance to cold. This resistance can be added to which from equipment for more powerful resistance.");
4897 if (info) return info_duration(base, base);
4901 set_oppose_cold(randint1(base) + base, FALSE);
4907 if (name) return _("耐火", "Resist Fire");
4908 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
4909 "Gives resistance to fire. This resistance can be added to which from equipment for more powerful resistance.");
4914 if (info) return info_duration(base, base);
4918 set_oppose_fire(randint1(base) + base, FALSE);
4924 if (name) return _("耐電", "Resist Lightning");
4925 if (desc) return _("一定時間、電撃への耐性を得る。装備による耐性に累積する。",
4926 "Gives resistance to electricity. This resistance can be added to which from equipment for more powerful resistance.");
4931 if (info) return info_duration(base, base);
4935 set_oppose_elec(randint1(base) + base, FALSE);
4941 if (name) return _("耐酸", "Resist Acid");
4942 if (desc) return _("一定時間、酸への耐性を得る。装備による耐性に累積する。",
4943 "Gives resistance to acid. This resistance can be added to which from equipment for more powerful resistance.");
4948 if (info) return info_duration(base, base);
4952 set_oppose_acid(randint1(base) + base, FALSE);
4958 if (name) return _("重傷の治癒", "Cure Medium Wounds");
4959 if (desc) return _("怪我と体力を中程度回復させる。", "Heals cut and HP more.");
4965 if (info) return info_heal(dice, sides, 0);
4969 hp_player(damroll(dice, sides));
4970 set_cut((p_ptr->cut / 2) - 50);
4976 if (name) return _("テレポート", "Teleport");
4977 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
4980 POSITION range = plev * 5;
4982 if (info) return info_range(range);
4986 teleport_player(range, 0L);
4992 if (name) return _("鑑定", "Identify");
4993 if (desc) return _("アイテムを識別する。", "Identifies an item.");
4998 if (!ident_spell(FALSE)) return NULL;
5004 if (name) return _("岩石溶解", "Stone to Mud");
5005 if (desc) return _("壁を溶かして床にする。", "Turns one rock square to mud.");
5012 if (info) return info_damage(dice, sides, base);
5016 if (!get_aim_dir(&dir)) return NULL;
5018 wall_to_mud(dir, 20 + randint1(30));
5024 if (name) return _("閃光", "Ray of Light");
5025 if (desc) return _("光線を放つ。光りを嫌うモンスターに効果がある。", "Fires a beam of light which damages to light-sensitive monsters.");
5031 if (info) return info_damage(dice, sides, 0);
5035 if (!get_aim_dir(&dir)) return NULL;
5037 msg_print(_("光線が放たれた。", "A line of light appears."));
5038 lite_line(dir, damroll(6, 8));
5044 if (name) return _("空腹充足", "Satisfy Hunger");
5045 if (desc) return _("満腹にする。", "Satisfies hunger.");
5050 set_food(PY_FOOD_MAX - 1);
5056 if (name) return _("透明視認", "See Invisible");
5057 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
5062 if (info) return info_duration(base, base);
5066 set_tim_invis(randint1(base) + base, FALSE);
5072 if (name) return _("エレメンタル召喚", "Conjure Elemental");
5073 if (desc) return _("1体のエレメンタルを召喚する。", "Summons an elemental.");
5078 if (!summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_ELEMENTAL, (PM_ALLOW_GROUP | PM_FORCE_PET)))
5080 msg_print(_("エレメンタルは現れなかった。", "No Elementals arrive."));
5087 if (name) return _("テレポート・レベル", "Teleport Level");
5088 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");
5093 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
5100 if (name) return _("テレポート・モンスター", "Teleport Away");
5101 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
5106 if (info) return info_power(power);
5110 if (!get_aim_dir(&dir)) return NULL;
5112 fire_beam(GF_AWAY_ALL, dir, power);
5118 if (name) return _("元素の球", "Elemental Ball");
5119 if (desc) return _("炎、電撃、冷気、酸のどれかの球を放つ。", "Fires a ball of some elements.");
5122 HIT_POINT dam = 75 + plev;
5125 if (info) return info_damage(0, 0, dam);
5131 if (!get_aim_dir(&dir)) return NULL;
5133 switch (randint1(4))
5135 case 1: type = GF_FIRE;break;
5136 case 2: type = GF_ELEC;break;
5137 case 3: type = GF_COLD;break;
5138 default: type = GF_ACID;break;
5141 fire_ball(type, dir, dam, rad);
5147 if (name) return _("全感知", "Detection");
5148 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
5149 "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
5152 int rad = DETECT_RAD_DEFAULT;
5154 if (info) return info_radius(rad);
5164 if (name) return _("帰還の呪文", "Word of Recall");
5165 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
5166 "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
5172 if (info) return info_delay(base, sides);
5176 if (!word_of_recall()) return NULL;
5182 if (name) return _("千里眼", "Clairvoyance");
5183 if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。さらに、一定時間テレパシー能力を得る。",
5184 "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");
5190 if (info) return info_duration(base, sides);
5194 chg_virtue(V_KNOWLEDGE, 1);
5195 chg_virtue(V_ENLIGHTEN, 1);
5199 if (!p_ptr->telepathy)
5201 set_tim_esp(randint1(sides) + base, FALSE);
5212 * @brief 匠領域魔法の各処理を行う
5214 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
5215 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
5217 static cptr do_craft_spell(SPELL_IDX spell, BIT_FLAGS mode)
5219 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
5220 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
5221 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
5222 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
5224 int plev = p_ptr->lev;
5229 if (name) return _("赤外線視力", "Infravision");
5230 if (desc) return _("一定時間、赤外線視力が増強される。", "Gives infravision for a while.");
5235 if (info) return info_duration(base, base);
5239 set_tim_infra(base + randint1(base), FALSE);
5245 if (name) return _("回復力強化", "Regeneration");
5246 if (desc) return _("一定時間、回復力が増強される。", "Gives regeneration ability for a while.");
5251 if (info) return info_duration(base, base);
5255 set_tim_regen(base + randint1(base), FALSE);
5261 if (name) return _("空腹充足", "Satisfy Hunger");
5262 if (desc) return _("満腹になる。", "Satisfies hunger.");
5267 set_food(PY_FOOD_MAX - 1);
5273 if (name) return _("耐冷気", "Resist Cold");
5274 if (desc) return _("一定時間、冷気への耐性を得る。装備による耐性に累積する。",
5275 "Gives resistance to cold. This resistance can be added to which from equipment for more powerful resistance.");
5280 if (info) return info_duration(base, base);
5284 set_oppose_cold(randint1(base) + base, FALSE);
5290 if (name) return _("耐火炎", "Resist Fire");
5291 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
5292 "Gives resistance to fire. This resistance can be added to which from equipment for more powerful resistance.");
5297 if (info) return info_duration(base, base);
5301 set_oppose_fire(randint1(base) + base, FALSE);
5307 if (name) return _("士気高揚", "Heroism");
5308 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
5313 if (info) return info_duration(base, base);
5317 set_hero(randint1(base) + base, FALSE);
5325 if (name) return _("耐電撃", "Resist Lightning");
5326 if (desc) return _("一定時間、電撃への耐性を得る。装備による耐性に累積する。",
5327 "Gives resistance to electricity. This resistance can be added to which from equipment for more powerful resistance.");
5332 if (info) return info_duration(base, base);
5336 set_oppose_elec(randint1(base) + base, FALSE);
5342 if (name) return _("耐酸", "Resist Acid");
5343 if (desc) return _("一定時間、酸への耐性を得る。装備による耐性に累積する。",
5344 "Gives resistance to acid. This resistance can be added to which from equipment for more powerful resistance.");
5349 if (info) return info_duration(base, base);
5353 set_oppose_acid(randint1(base) + base, FALSE);
5359 if (name) return _("透明視認", "See Invisibility");
5360 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
5365 if (info) return info_duration(base, base);
5369 set_tim_invis(randint1(base) + base, FALSE);
5375 if (name) return _("解呪", "Remove Curse");
5376 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
5383 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
5390 if (name) return _("耐毒", "Resist Poison");
5391 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",
5392 "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");
5397 if (info) return info_duration(base, base);
5401 set_oppose_pois(randint1(base) + base, FALSE);
5407 if (name) return _("狂戦士化", "Berserk");
5408 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");
5413 if (info) return info_duration(base, base);
5417 set_shero(randint1(base) + base, FALSE);
5425 if (name) return _("自己分析", "Self Knowledge");
5426 if (desc) return _("現在の自分の状態を完全に知る。",
5427 "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");
5438 if (name) return _("対邪悪結界", "Protection from Evil");
5439 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");
5442 int base = 3 * plev;
5445 if (info) return info_duration(base, sides);
5449 set_protevil(randint1(sides) + base, FALSE);
5455 if (name) return _("癒し", "Cure");
5456 if (desc) return _("毒、朦朧状態、負傷を全快させ、幻覚を直す。", "Heals poison, stun, cut and hallucination completely.");
5470 if (name) return _("魔法剣", "Mana Branding");
5471 if (desc) return _("一定時間、武器に冷気、炎、電撃、酸、毒のいずれかの属性をつける。武器を持たないと使えない。",
5472 "Makes current weapon some elemental branded. You must wield weapons.");
5475 int base = plev / 2;
5477 if (info) return info_duration(base, base);
5481 if (!choose_ele_attack()) return NULL;
5487 if (name) return _("テレパシー", "Telepathy");
5488 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
5494 if (info) return info_duration(base, sides);
5498 set_tim_esp(randint1(sides) + base, FALSE);
5504 if (name) return _("肌石化", "Stone Skin");
5505 if (desc) return _("一定時間、ACを上昇させる。", "Gives bonus to AC for a while.");
5511 if (info) return info_duration(base, sides);
5515 set_shield(randint1(sides) + base, FALSE);
5521 if (name) return _("全耐性", "Resistance");
5522 if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
5523 "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.");
5528 if (info) return info_duration(base, base);
5532 set_oppose_acid(randint1(base) + base, FALSE);
5533 set_oppose_elec(randint1(base) + base, FALSE);
5534 set_oppose_fire(randint1(base) + base, FALSE);
5535 set_oppose_cold(randint1(base) + base, FALSE);
5536 set_oppose_pois(randint1(base) + base, FALSE);
5542 if (name) return _("スピード", "Haste Self");
5543 if (desc) return _("一定時間、加速する。", "Hastes you for a while.");
5547 int sides = 20 + plev;
5549 if (info) return info_duration(base, sides);
5553 set_fast(randint1(sides) + base, FALSE);
5559 if (name) return _("壁抜け", "Walk through Wall");
5560 if (desc) return _("一定時間、半物質化し壁を通り抜けられるようになる。", "Gives ability to pass walls for a while.");
5563 int base = plev / 2;
5565 if (info) return info_duration(base, base);
5569 set_kabenuke(randint1(base) + base, FALSE);
5575 if (name) return _("盾磨き", "Polish Shield");
5576 if (desc) return _("盾に反射の属性をつける。", "Makes a shield a shield of reflection.");
5587 if (name) return _("ゴーレム製造", "Create Golem");
5588 if (desc) return _("1体のゴーレムを製造する。", "Creates a golem.");
5593 if (summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_GOLEM, PM_FORCE_PET))
5595 msg_print(_("ゴーレムを作った。", "You make a golem."));
5599 msg_print(_("うまくゴーレムを作れなかった。", "No Golems arrive."));
5606 if (name) return _("魔法の鎧", "Magical armor");
5607 if (desc) return _("一定時間、魔法防御力とACが上がり、混乱と盲目の耐性、反射能力、麻痺知らず、浮遊を得る。",
5608 "Gives resistance to magic, bonus to AC, resistance to confusion, blindness, reflection, free action and levitation for a while.");
5613 if (info) return info_duration(base, base);
5617 set_magicdef(randint1(base) + base, FALSE);
5623 if (name) return _("装備無力化", "Remove Enchantment");
5624 if (desc) return _("武器・防具にかけられたあらゆる魔力を完全に解除する。", "Removes all magics completely from any weapon or armor.");
5629 if (!mundane_spell(TRUE)) return NULL;
5635 if (name) return _("呪い粉砕", "Remove All Curse");
5636 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
5641 if (remove_all_curse())
5643 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
5650 if (name) return _("完全なる知識", "Knowledge True");
5651 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
5656 if (!identify_fully(FALSE)) return NULL;
5662 if (name) return _("武器強化", "Enchant Weapon");
5663 if (desc) return _("武器の命中率修正とダメージ修正を強化する。", "Attempts to increase +to-hit, +to-dam of a weapon.");
5668 if (!enchant_spell(randint0(4) + 1, randint0(4) + 1, 0)) return NULL;
5674 if (name) return _("防具強化", "Enchant Armor");
5675 if (desc) return _("鎧の防御修正を強化する。", "Attempts to increase +AC of an armor.");
5680 if (!enchant_spell(0, 0, randint0(3) + 2)) return NULL;
5686 if (name) return _("武器属性付与", "Brand Weapon");
5687 if (desc) return _("武器にランダムに属性をつける。", "Makes current weapon a random ego weapon.");
5692 brand_weapon(randint0(18));
5698 if (name) return _("人間トランプ", "Living Trump");
5699 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",
5700 "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");
5708 /* Teleport control */
5711 /* Random teleportation (uncontrolled) */
5714 /* Gain the mutation */
5715 if (gain_random_mutation(mutation))
5717 msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));
5724 if (name) return _("属性への免疫", "Immunity");
5725 if (desc) return _("一定時間、冷気、炎、電撃、酸のいずれかに対する免疫を得る。",
5726 "Gives an immunity to fire, cold, electricity or acid for a while.");
5731 if (info) return info_duration(base, base);
5735 if (!choose_ele_immune(base + randint1(base))) return NULL;
5745 * @brief 悪魔領域魔法の各処理を行う
5747 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
5748 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
5750 static cptr do_daemon_spell(SPELL_IDX spell, BIT_FLAGS mode)
5752 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
5753 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
5754 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
5755 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
5756 static const char s_dam[] = _("損傷:", "dam ");
5759 int plev = p_ptr->lev;
5764 if (name) return _("マジック・ミサイル", "Magic Missile");
5765 if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");
5768 int dice = 3 + (plev - 1) / 5;
5771 if (info) return info_damage(dice, sides, 0);
5775 if (!get_aim_dir(&dir)) return NULL;
5777 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));
5783 if (name) return _("無生命感知", "Detect Unlife");
5784 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
5787 int rad = DETECT_RAD_DEFAULT;
5789 if (info) return info_radius(rad);
5793 detect_monsters_nonliving(rad);
5799 if (name) return _("邪なる祝福", "Evil Bless");
5800 if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
5805 if (info) return info_duration(base, base);
5809 set_blessed(randint1(base) + base, FALSE);
5815 if (name) return _("耐火炎", "Resist Fire");
5816 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
5817 "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");
5822 if (info) return info_duration(base, base);
5826 set_oppose_fire(randint1(base) + base, FALSE);
5832 if (name) return _("恐慌", "Horrify");
5833 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
5838 if (info) return info_power(power);
5842 if (!get_aim_dir(&dir)) return NULL;
5844 fear_monster(dir, power);
5845 stun_monster(dir, power);
5851 if (name) return _("地獄の矢", "Nether Bolt");
5852 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
5855 int dice = 6 + (plev - 5) / 4;
5858 if (info) return info_damage(dice, sides, 0);
5862 if (!get_aim_dir(&dir)) return NULL;
5864 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
5870 if (name) return _("古代の死霊召喚", "Summon Manes");
5871 if (desc) return _("古代の死霊を召喚する。", "Summons a manes.");
5876 if (!summon_specific(-1, p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET)))
5878 msg_print(_("古代の死霊は現れなかった。", "No Manes arrive."));
5885 if (name) return _("地獄の焔", "Hellish Flame");
5886 if (desc) return _("邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",
5887 "Fires a ball of evil power. Hurts good monsters greatly.");
5892 int rad = (plev < 30) ? 2 : 3;
5895 if (p_ptr->pclass == CLASS_MAGE ||
5896 p_ptr->pclass == CLASS_HIGH_MAGE ||
5897 p_ptr->pclass == CLASS_SORCERER)
5898 base = plev + plev / 2;
5900 base = plev + plev / 4;
5903 if (info) return info_damage(dice, sides, base);
5907 if (!get_aim_dir(&dir)) return NULL;
5909 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides) + base, rad);
5915 if (name) return _("デーモン支配", "Dominate Demon");
5916 if (desc) return _("悪魔1体を魅了する。抵抗されると無効", "Attempts to charm a demon.");
5921 if (info) return info_power(power);
5925 if (!get_aim_dir(&dir)) return NULL;
5927 control_one_demon(dir, power);
5933 if (name) return _("ビジョン", "Vision");
5934 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
5937 int rad = DETECT_RAD_MAP;
5939 if (info) return info_radius(rad);
5949 if (name) return _("耐地獄", "Resist Nether");
5950 if (desc) return _("一定時間、地獄への耐性を得る。", "Gives resistance to nether for a while.");
5955 if (info) return info_duration(base, base);
5959 set_tim_res_nether(randint1(base) + base, FALSE);
5965 if (name) return _("プラズマ・ボルト", "Plasma bolt");
5966 if (desc) return _("プラズマのボルトもしくはビームを放つ。", "Fires a bolt or beam of plasma.");
5969 int dice = 11 + (plev - 5) / 4;
5972 if (info) return info_damage(dice, sides, 0);
5976 if (!get_aim_dir(&dir)) return NULL;
5978 fire_bolt_or_beam(beam_chance(), GF_PLASMA, dir, damroll(dice, sides));
5984 if (name) return _("ファイア・ボール", "Fire Ball");
5985 if (desc) return _("炎の球を放つ。", "Fires a ball of fire.");
5988 HIT_POINT dam = plev + 55;
5991 if (info) return info_damage(0, 0, dam);
5995 if (!get_aim_dir(&dir)) return NULL;
5997 fire_ball(GF_FIRE, dir, dam, rad);
6003 if (name) return _("炎の刃", "Fire Branding");
6004 if (desc) return _("武器に炎の属性をつける。", "Makes current weapon fire branded.");
6015 if (name) return _("地獄球", "Nether Ball");
6016 if (desc) return _("大きな地獄の球を放つ。", "Fires a huge ball of nether.");
6019 HIT_POINT dam = plev * 3 / 2 + 100;
6020 int rad = plev / 20 + 2;
6022 if (info) return info_damage(0, 0, dam);
6026 if (!get_aim_dir(&dir)) return NULL;
6028 fire_ball(GF_NETHER, dir, dam, rad);
6034 if (name) return _("デーモン召喚", "Summon Demon");
6035 if (desc) return _("悪魔1体を召喚する。", "Summons a demon.");
6040 bool pet = !one_in_(3);
6043 if (pet) flg |= PM_FORCE_PET;
6044 else flg |= PM_NO_PET;
6045 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
6047 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, plev*2/3+randint1(plev/2), SUMMON_DEMON, flg))
6049 msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));
6053 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
6057 msg_print(_("「卑しき者よ、我は汝の下僕にあらず! お前の魂を頂くぞ!」",
6058 "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));
6063 msg_print(_("悪魔は現れなかった。", "No demons arrive."));
6071 if (name) return _("悪魔の目", "Devilish Eye");
6072 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
6078 if (info) return info_duration(base, sides);
6082 set_tim_esp(randint1(sides) + base, FALSE);
6088 if (name) return _("悪魔のクローク", "Devil Cloak");
6089 if (desc) return _("恐怖を取り除き、一定時間、炎と冷気の耐性、炎のオーラを得る。耐性は装備による耐性に累積する。",
6090 "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.");
6093 TIME_EFFECT base = 20;
6095 if (info) return info_duration(base, base);
6099 TIME_EFFECT dur = randint1(base) + base;
6101 set_oppose_fire(dur, FALSE);
6102 set_oppose_cold(dur, FALSE);
6103 set_tim_sh_fire(dur, FALSE);
6111 if (name) return _("溶岩流", "The Flow of Lava");
6112 if (desc) return _("自分を中心とした炎の球を作り出し、床を溶岩に変える。",
6113 "Generates a ball of fire centered on you which transforms floors to magma.");
6116 HIT_POINT dam = (55 + plev) * 2;
6119 if (info) return info_damage(0, 0, dam/2);
6123 fire_ball(GF_FIRE, 0, dam, rad);
6124 fire_ball_hide(GF_LAVA_FLOW, 0, 2 + randint1(2), rad);
6130 if (name) return _("プラズマ球", "Plasma Ball");
6131 if (desc) return _("プラズマの球を放つ。", "Fires a ball of plasma.");
6134 HIT_POINT dam = plev * 3 / 2 + 80;
6135 int rad = 2 + plev / 40;
6137 if (info) return info_damage(0, 0, dam);
6141 if (!get_aim_dir(&dir)) return NULL;
6143 fire_ball(GF_PLASMA, dir, dam, rad);
6149 if (name) return _("悪魔変化", "Polymorph Demon");
6150 if (desc) return _("一定時間、悪魔に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔としての能力を得る。",
6151 "Mimic a demon for a while. Loses abilities of original race and gets abilities as a demon.");
6154 int base = 10 + plev / 2;
6156 if (info) return info_duration(base, base);
6160 set_mimic(base + randint1(base), MIMIC_DEMON, FALSE);
6166 if (name) return _("地獄の波動", "Nather Wave");
6167 if (desc) return _("視界内の全てのモンスターにダメージを与える。善良なモンスターに特に大きなダメージを与える。",
6168 "Damages all monsters in sight. Hurts good monsters greatly.");
6171 int sides1 = plev * 2;
6172 int sides2 = plev * 2;
6174 if (info) return format("%sd%d+d%d", s_dam, sides1, sides2);
6178 dispel_monsters(randint1(sides1));
6179 dispel_good(randint1(sides2));
6185 if (name) return _("サキュバスの接吻", "Kiss of Succubus");
6186 if (desc) return _("因果混乱の球を放つ。", "Fires a ball of nexus.");
6189 HIT_POINT dam = 100 + plev * 2;
6192 if (info) return info_damage(0, 0, dam);
6196 if (!get_aim_dir(&dir)) return NULL;
6197 fire_ball(GF_NEXUS, dir, dam, rad);
6203 if (name) return _("破滅の手", "Doom Hand");
6204 if (desc) return _("破滅の手を放つ。食らったモンスターはそのときのHPの半分前後のダメージを受ける。", "Attempts to make a monster's HP almost half.");
6209 if (!get_aim_dir(&dir))
6212 msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));
6214 fire_ball_hide(GF_HAND_DOOM, dir, plev * 2, 0);
6220 if (name) return _("士気高揚", "Raise the Morale");
6221 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
6226 if (info) return info_duration(base, base);
6230 set_hero(randint1(base) + base, FALSE);
6238 if (name) return _("不滅の肉体", "Immortal Body");
6239 if (desc) return _("一定時間、時間逆転への耐性を得る。", "Gives resistance to time for a while.");
6244 if (info) return info_duration(base, base);
6248 set_tim_res_time(randint1(base)+base, FALSE);
6254 if (name) return _("狂気の円環", "Insanity Circle");
6255 if (desc) return _("自分を中心としたカオスの球、混乱の球を発生させ、近くのモンスターを魅了する。",
6256 "Generate balls of chaos, confusion and charm centered on you.");
6259 HIT_POINT dam = 50 + plev;
6260 int power = 20 + plev;
6261 int rad = 3 + plev / 20;
6263 if (info) return format("%s%d+%d", s_dam, dam/2, dam/2);
6267 fire_ball(GF_CHAOS, 0, dam, rad);
6268 fire_ball(GF_CONFUSION, 0, dam, rad);
6269 fire_ball(GF_CHARM, 0, power, rad);
6275 if (name) return _("ペット爆破", "Explode Pets");
6276 if (desc) return _("全てのペットを強制的に爆破させる。", "Makes all pets explode.");
6287 if (name) return _("グレーターデーモン召喚", "Summon Greater Demon");
6288 if (desc) return _("上級デーモンを召喚する。召喚するには人間('p','h','t'で表されるモンスター)の死体を捧げなければならない。",
6289 "Summons greater demon. It need to sacrifice a corpse of human ('p','h' or 't').");
6294 if (!cast_summon_greater_demon()) return NULL;
6300 if (name) return _("地獄嵐", "Nether Storm");
6301 if (desc) return _("超巨大な地獄の球を放つ。", "Generate a huge ball of nether.");
6304 HIT_POINT dam = plev * 15;
6307 if (info) return info_damage(0, 0, dam);
6311 if (!get_aim_dir(&dir)) return NULL;
6313 fire_ball(GF_NETHER, dir, dam, rad);
6319 if (name) return _("血の呪い", "Bloody Curse");
6320 if (desc) return _("自分がダメージを受けることによって対象に呪いをかけ、ダメージを与え様々な効果を引き起こす。",
6321 "Puts blood curse which damages and causes various effects on a monster. You also take damage.");
6324 HIT_POINT dam = 600;
6327 if (info) return info_damage(0, 0, dam);
6331 if (!get_aim_dir(&dir)) return NULL;
6333 fire_ball_hide(GF_BLOOD_CURSE, dir, dam, rad);
6334 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("血の呪い", "Blood curse"), -1);
6340 if (name) return _("魔王変化", "Polymorph Demonlord");
6341 if (desc) return _("悪魔の王に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔の王としての能力を得、壁を破壊しながら歩く。",
6342 "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.");
6347 if (info) return info_duration(base, base);
6351 set_mimic(base + randint1(base), MIMIC_DEMON_LORD, FALSE);
6361 * @brief 破邪領域魔法の各処理を行う
6363 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
6364 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
6366 static cptr do_crusade_spell(SPELL_IDX spell, BIT_FLAGS mode)
6368 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
6369 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
6370 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
6371 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
6374 int plev = p_ptr->lev;
6379 if (name) return _("懲罰", "Punishment");
6380 if (desc) return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");
6383 int dice = 3 + (plev - 1) / 5;
6386 if (info) return info_damage(dice, sides, 0);
6390 if (!get_aim_dir(&dir)) return NULL;
6392 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));
6398 if (name) return _("邪悪存在感知", "Detect Evil");
6399 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
6402 int rad = DETECT_RAD_DEFAULT;
6404 if (info) return info_radius(rad);
6408 detect_monsters_evil(rad);
6414 if (name) return _("恐怖除去", "Remove Fear");
6415 if (desc) return _("恐怖を取り除く。", "Removes fear.");
6426 if (name) return _("威圧", "Scare Monster");
6427 if (desc) return _("モンスター1体を恐怖させる。抵抗されると無効。", "Attempts to scare a monster.");
6432 if (info) return info_power(power);
6436 if (!get_aim_dir(&dir)) return NULL;
6438 fear_monster(dir, power);
6444 if (name) return _("聖域", "Sanctuary");
6445 if (desc) return _("隣接した全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep monsters in the adjacent squares.");
6450 if (info) return info_power(power);
6454 sleep_monsters_touch();
6460 if (name) return _("入口", "Portal");
6461 if (desc) return _("中距離のテレポートをする。", "Teleport medium distance.");
6464 POSITION range = 25 + plev / 2;
6466 if (info) return info_range(range);
6470 teleport_player(range, 0L);
6476 if (name) return _("スターダスト", "Star Dust");
6477 if (desc) return _("ターゲット付近に閃光のボルトを連射する。", "Fires many bolts of light near the target.");
6480 int dice = 3 + (plev - 1) / 9;
6483 if (info) return info_multi_damage_dice(dice, sides);
6487 if (!get_aim_dir(&dir)) return NULL;
6488 fire_blast(GF_LITE, dir, dice, sides, 10, 3);
6494 if (name) return _("身体浄化", "Purify");
6495 if (desc) return _("傷、毒、朦朧から全快する。", "Heals all cut, stun and poison status.");
6508 if (name) return _("邪悪飛ばし", "Scatter Evil");
6509 if (desc) return _("邪悪なモンスター1体をテレポートさせる。抵抗されると無効。", "Attempts to teleport an evil monster away.");
6512 int power = MAX_SIGHT * 5;
6514 if (info) return info_power(power);
6518 if (!get_aim_dir(&dir)) return NULL;
6519 fire_ball(GF_AWAY_EVIL, dir, power, 0);
6525 if (name) return _("聖なる光球", "Holy Orb");
6526 if (desc) return _("聖なる力をもつ宝珠を放つ。邪悪なモンスターに対して大きなダメージを与えるが、善良なモンスターには効果がない。",
6527 "Fires a ball with holy power. Hurts evil monsters greatly, but don't effect good monsters.");
6532 int rad = (plev < 30) ? 2 : 3;
6535 if (p_ptr->pclass == CLASS_PRIEST ||
6536 p_ptr->pclass == CLASS_HIGH_MAGE ||
6537 p_ptr->pclass == CLASS_SORCERER)
6538 base = plev + plev / 2;
6540 base = plev + plev / 4;
6543 if (info) return info_damage(dice, sides, base);
6547 if (!get_aim_dir(&dir)) return NULL;
6549 fire_ball(GF_HOLY_FIRE, dir, damroll(dice, sides) + base, rad);
6555 if (name) return _("悪魔払い", "Exorcism");
6556 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与え、邪悪なモンスターを恐怖させる。",
6557 "Damages all undead and demons in sight, and scares all evil monsters in sight.");
6563 if (info) return info_damage(1, sides, 0);
6567 dispel_undead(randint1(sides));
6568 dispel_demons(randint1(sides));
6575 if (name) return _("解呪", "Remove Curse");
6576 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
6583 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
6590 if (name) return _("透明視認", "Sense Unseen");
6591 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
6596 if (info) return info_duration(base, base);
6600 set_tim_invis(randint1(base) + base, FALSE);
6606 if (name) return _("対邪悪結界", "Protection from Evil");
6607 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");
6611 int sides = 3 * plev;
6613 if (info) return info_duration(base, sides);
6617 set_protevil(randint1(sides) + base, FALSE);
6623 if (name) return _("裁きの雷", "Judgment Thunder");
6624 if (desc) return _("強力な電撃のボルトを放つ。", "Fires a powerful bolt of lightning.");
6627 HIT_POINT dam = plev * 5;
6629 if (info) return info_damage(0, 0, dam);
6633 if (!get_aim_dir(&dir)) return NULL;
6634 fire_bolt(GF_ELEC, dir, dam);
6640 if (name) return _("聖なる御言葉", "Holy Word");
6641 if (desc) return _("視界内の邪悪な存在に大きなダメージを与え、体力を回復し、毒、恐怖、朦朧状態、負傷から全快する。",
6642 "Damages all evil monsters in sight, heals HP somewhat, and completely heals poison, fear, stun and cut status.");
6645 int dam_sides = plev * 6;
6648 if (info) return format(_("損:1d%d/回%d", "dam:d%d/h%d"), dam_sides, heal);
6651 dispel_evil(randint1(dam_sides));
6662 if (name) return _("開かれた道", "Unbarring Ways");
6663 if (desc) return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");
6668 if (!get_aim_dir(&dir)) return NULL;
6676 if (name) return _("封魔", "Arrest");
6677 if (desc) return _("邪悪なモンスターの動きを止める。", "Attempts to paralyze an evil monster.");
6680 int power = plev * 2;
6682 if (info) return info_power(power);
6686 if (!get_aim_dir(&dir)) return NULL;
6693 if (name) return _("聖なるオーラ", "Holy Aura");
6694 if (desc) return _("一定時間、邪悪なモンスターを傷つける聖なるオーラを得る。",
6695 "Gives aura of holy power which injures evil monsters which attacked you for a while.");
6700 if (info) return info_duration(base, base);
6704 set_tim_sh_holy(randint1(base) + base, FALSE);
6710 if (name) return _("アンデッド&悪魔退散", "Dispel Undead & Demons");
6711 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与える。", "Damages all undead and demons in sight.");
6714 int sides = plev * 4;
6716 if (info) return info_damage(1, sides, 0);
6720 dispel_undead(randint1(sides));
6721 dispel_demons(randint1(sides));
6727 if (name) return _("邪悪退散", "Dispel Evil");
6728 if (desc) return _("視界内の全ての邪悪なモンスターにダメージを与える。", "Damages all evil monsters in sight.");
6731 int sides = plev * 4;
6733 if (info) return info_damage(1, sides, 0);
6737 dispel_evil(randint1(sides));
6743 if (name) return _("聖なる刃", "Holy Blade");
6744 if (desc) return _("通常の武器に滅邪の属性をつける。", "Makes current weapon especially deadly against evil monsters.");
6755 if (name) return _("スターバースト", "Star Burst");
6756 if (desc) return _("巨大な閃光の球を放つ。", "Fires a huge ball of powerful light.");
6759 HIT_POINT dam = 100 + plev * 2;
6762 if (info) return info_damage(0, 0, dam);
6766 if (!get_aim_dir(&dir)) return NULL;
6768 fire_ball(GF_LITE, dir, dam, rad);
6774 if (name) return _("天使召喚", "Summon Angel");
6775 if (desc) return _("天使を1体召喚する。", "Summons an angel.");
6780 bool pet = !one_in_(3);
6783 if (pet) flg |= PM_FORCE_PET;
6784 else flg |= PM_NO_PET;
6785 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
6787 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_ANGEL, flg))
6791 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
6795 msg_print(_("「我は汝の下僕にあらず! 悪行者よ、悔い改めよ!」", "Mortal! Repent of thy impiousness."));
6803 if (name) return _("士気高揚", "Heroism");
6804 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
6809 if (info) return info_duration(base, base);
6813 set_hero(randint1(base) + base, FALSE);
6821 if (name) return _("呪い退散", "Dispel Curse");
6822 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
6827 if (remove_all_curse())
6829 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
6836 if (name) return _("邪悪追放", "Banish Evil");
6837 if (desc) return _("視界内の全ての邪悪なモンスターをテレポートさせる。抵抗されると無効。",
6838 "Teleports all evil monsters in sight away unless resisted.");
6843 if (info) return info_power(power);
6847 if (banish_evil(power))
6849 msg_print(_("神聖な力が邪悪を打ち払った!", "The holy power banishes evil!"));
6856 if (name) return _("ハルマゲドン", "Armageddon");
6857 if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroy everything in nearby area.");
6865 destroy_area(p_ptr->y, p_ptr->x, base + randint1(sides), FALSE);
6871 if (name) return _("目には目を", "An Eye for an Eye");
6872 if (desc) return _("一定時間、自分がダメージを受けたときに攻撃を行ったモンスターに対して同等のダメージを与える。",
6873 "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.");
6878 if (info) return info_duration(base, base);
6882 set_tim_eyeeye(randint1(base) + base, FALSE);
6888 if (name) return _("神の怒り", "Wrath of the God");
6889 if (desc) return _("ターゲットの周囲に分解の球を多数落とす。", "Drops many balls of disintegration near the target.");
6892 HIT_POINT dam = plev * 3 + 25;
6895 if (info) return info_multi_damage(dam);
6899 if (!cast_wrath_of_the_god(dam, rad)) return NULL;
6905 if (name) return _("神威", "Divine Intervention");
6906 if (desc) return _("隣接するモンスターに聖なるダメージを与え、視界内のモンスターにダメージ、減速、朦朧、混乱、恐怖、眠りを与える。さらに体力を回復する。",
6907 "Damages all adjacent monsters with holy power. Damages and attempt to slow, stun, confuse, scare and freeze all monsters in sight. And heals HP.");
6910 int b_dam = plev * 11;
6911 int d_dam = plev * 4;
6913 int power = plev * 4;
6915 if (info) return format(_("回%d/損%d+%d", "h%d/dm%d+%d"), heal, d_dam, b_dam/2);
6918 project(0, 1, p_ptr->y, p_ptr->x, b_dam, GF_HOLY_FIRE, PROJECT_KILL, -1);
6919 dispel_monsters(d_dam);
6920 slow_monsters(plev);
6921 stun_monsters(power);
6922 confuse_monsters(power);
6923 turn_monsters(power);
6924 stasis_monsters(power);
6931 if (name) return _("聖戦", "Crusade");
6932 if (desc) return _("視界内の善良なモンスターをペットにしようとし、ならなかった場合及び善良でないモンスターを恐怖させる。さらに多数の加速された騎士を召喚し、ヒーロー、祝福、加速、対邪悪結界を得る。",
6933 "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.");
6939 int sp_sides = 20 + plev;
6944 for (i = 0; i < 12; i++)
6947 POSITION my = 0, mx = 0;
6951 scatter(&my, &mx, p_ptr->y, p_ptr->x, 4, 0);
6953 /* Require empty grids */
6954 if (cave_empty_bold2(my, mx)) break;
6956 if (attempt < 0) continue;
6957 summon_specific(-1, my, mx, plev, SUMMON_KNIGHTS, (PM_ALLOW_GROUP | PM_FORCE_PET | PM_HASTE));
6959 set_hero(randint1(base) + base, FALSE);
6960 set_blessed(randint1(base) + base, FALSE);
6961 set_fast(randint1(sp_sides) + sp_base, FALSE);
6962 set_protevil(randint1(base) + base, FALSE);
6976 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP)
6977 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
6979 static cptr do_music_spell(SPELL_IDX spell, BIT_FLAGS mode)
6981 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
6982 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
6983 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
6984 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
6985 bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
6986 bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
6987 bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
6988 static const char s_dam[] = _("損傷:", "dam ");
6991 int plev = p_ptr->lev;
6996 if (name) return _("遅鈍の歌", "Song of Holding");
6997 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
6999 /* Stop singing before start another */
7000 if (cast || fail) stop_singing();
7004 msg_print(_("ゆっくりとしたメロディを口ずさみ始めた...", "You start humming a slow, steady melody..."));
7005 start_singing(spell, MUSIC_SLOW);
7011 if (info) return info_power(power);
7015 slow_monsters(plev);
7021 if (name) return _("祝福の歌", "Song of Blessing");
7022 if (desc) return _("命中率とACのボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
7024 /* Stop singing before start another */
7025 if (cast || fail) stop_singing();
7029 msg_print(_("厳かなメロディを奏で始めた...", "The holy power of the Music of the Ainur enters you..."));
7030 start_singing(spell, MUSIC_BLESS);
7035 if (!p_ptr->blessed)
7037 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
7044 if (name) return _("崩壊の音色", "Wrecking Note");
7045 if (desc) return _("轟音のボルトを放つ。", "Fires a bolt of sound.");
7047 /* Stop singing before start another */
7048 if (cast || fail) stop_singing();
7051 int dice = 4 + (plev - 1) / 5;
7054 if (info) return info_damage(dice, sides, 0);
7058 if (!get_aim_dir(&dir)) return NULL;
7060 fire_bolt(GF_SOUND, dir, damroll(dice, sides));
7066 if (name) return _("朦朧の旋律", "Stun Pattern");
7067 if (desc) return _("視界内の全てのモンスターを朦朧させる。抵抗されると無効。", "Attempts to stun all monsters in sight.");
7069 /* Stop singing before start another */
7070 if (cast || fail) stop_singing();
7074 msg_print(_("眩惑させるメロディを奏で始めた...", "You weave a pattern of sounds to bewilder and daze..."));
7075 start_singing(spell, MUSIC_STUN);
7079 int dice = plev / 10;
7082 if (info) return info_power_dice(dice, sides);
7086 stun_monsters(damroll(dice, sides));
7093 if (name) return _("生命の流れ", "Flow of Life");
7094 if (desc) return _("体力を少し回復させる。", "Heals HP a little.");
7096 /* Stop singing before start another */
7097 if (cast || fail) stop_singing();
7101 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing a song of healing..."));
7102 start_singing(spell, MUSIC_L_LIFE);
7109 if (info) return info_heal(dice, sides, 0);
7113 hp_player(damroll(dice, sides));
7120 if (name) return _("太陽の歌", "Song of the Sun");
7121 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
7123 /* Stop singing before start another */
7124 if (cast || fail) stop_singing();
7128 int sides = plev / 2;
7129 int rad = plev / 10 + 1;
7131 if (info) return info_damage(dice, sides, 0);
7135 msg_print(_("光り輝く歌が辺りを照らした。", "Your uplifting song brings brightness to dark places..."));
7136 lite_area(damroll(dice, sides), rad);
7142 if (name) return _("恐怖の歌", "Song of Fear");
7143 if (desc) return _("視界内の全てのモンスターを恐怖させる。抵抗されると無効。", "Attempts to scare all monsters in sight.");
7145 /* Stop singing before start another */
7146 if (cast || fail) stop_singing();
7150 msg_print(_("おどろおどろしいメロディを奏で始めた...", "You start weaving a fearful pattern..."));
7151 start_singing(spell, MUSIC_FEAR);
7157 if (info) return info_power(power);
7161 project_hack(GF_TURN_ALL, power);
7168 if (name) return _("戦いの歌", "Heroic Ballad");
7169 if (desc) return _("ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
7171 /* Stop singing before start another */
7172 if (cast || fail) stop_singing();
7176 msg_print(_("激しい戦いの歌を歌った...", "You start singing a song of intense fighting..."));
7178 (void)hp_player(10);
7179 (void)set_afraid(0);
7181 /* Recalculate hitpoints */
7182 p_ptr->update |= (PU_HP);
7184 start_singing(spell, MUSIC_HERO);
7191 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
7192 /* Recalculate hitpoints */
7193 p_ptr->update |= (PU_HP);
7200 if (name) return _("霊的知覚", "Clairaudience");
7201 if (desc) return _("近くの罠/扉/階段を感知する。レベル15で全てのモンスター、20で財宝とアイテムを感知できるようになる。レベル25で周辺の地形を感知し、40でその階全体を永久に照らし、ダンジョン内のすべてのアイテムを感知する。この効果は歌い続けることで順に起こる。",
7202 "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.");
7204 /* Stop singing before start another */
7205 if (cast || fail) stop_singing();
7209 msg_print(_("静かな音楽が感覚を研ぎ澄まさせた...", "Your quiet music sharpens your sense of hearing..."));
7210 /* Hack -- Initialize the turn count */
7211 SINGING_COUNT(p_ptr) = 0;
7212 start_singing(spell, MUSIC_DETECT);
7216 int rad = DETECT_RAD_DEFAULT;
7218 if (info) return info_radius(rad);
7222 int count = SINGING_COUNT(p_ptr);
7224 if (count >= 19) wiz_lite(FALSE);
7228 if (plev > 39 && count < 19)
7229 SINGING_COUNT(p_ptr) = count + 1;
7233 /* There are too many hidden treasure. So... */
7234 /* detect_treasure(rad); */
7235 detect_objects_gold(rad);
7236 detect_objects_normal(rad);
7238 if (plev > 24 && count < 11)
7239 SINGING_COUNT(p_ptr) = count + 1;
7243 detect_monsters_invis(rad);
7244 detect_monsters_normal(rad);
7246 if (plev > 19 && count < 6)
7247 SINGING_COUNT(p_ptr) = count + 1;
7249 detect_traps(rad, TRUE);
7253 if (plev > 14 && count < 3)
7254 SINGING_COUNT(p_ptr) = count + 1;
7261 if (name) return _("魂の歌", "Soul Shriek");
7262 if (desc) return _("視界内の全てのモンスターに対して精神攻撃を行う。", "Damages all monsters in sight with PSI damages.");
7264 /* Stop singing before start another */
7265 if (cast || fail) stop_singing();
7269 msg_print(_("精神を捻じ曲げる歌を歌った...", "You start singing a song of soul in pain..."));
7270 start_singing(spell, MUSIC_PSI);
7275 int sides = plev * 3 / 2;
7277 if (info) return info_damage(dice, sides, 0);
7281 project_hack(GF_PSI, damroll(dice, sides));
7288 if (name) return _("知識の歌", "Song of Lore");
7289 if (desc) return _("自分のいるマスと隣りのマスに落ちているアイテムを鑑定する。", "Identifies all items which are in the adjacent squares.");
7291 /* Stop singing before start another */
7292 if (cast || fail) stop_singing();
7296 msg_print(_("この世界の知識が流れ込んできた...", "You recall the rich lore of the world..."));
7297 start_singing(spell, MUSIC_ID);
7303 if (info) return info_radius(rad);
7307 * MP不足で鑑定が発動される前に歌が中断してしまうのを防止。
7311 project(0, rad, p_ptr->y, p_ptr->x, 0, GF_IDENTIFY, PROJECT_ITEM, -1);
7318 if (name) return _("隠遁の歌", "Hiding Tune");
7319 if (desc) return _("隠密行動能力を上昇させる。", "Gives improved stealth.");
7321 /* Stop singing before start another */
7322 if (cast || fail) stop_singing();
7326 msg_print(_("あなたの姿が景色にとけこんでいった...", "Your song carries you beyond the sight of mortal eyes..."));
7327 start_singing(spell, MUSIC_STEALTH);
7332 if (!p_ptr->tim_stealth)
7334 msg_print(_("姿がはっきりと見えるようになった。", "You are no longer hided."));
7341 if (name) return _("幻影の旋律", "Illusion Pattern");
7342 if (desc) return _("視界内の全てのモンスターを混乱させる。抵抗されると無効。", "Attempts to confuse all monsters in sight.");
7344 /* Stop singing before start another */
7345 if (cast || fail) stop_singing();
7349 msg_print(_("辺り一面に幻影が現れた...", "You weave a pattern of sounds to beguile and confuse..."));
7350 start_singing(spell, MUSIC_CONF);
7354 int power = plev * 2;
7356 if (info) return info_power(power);
7360 confuse_monsters(power);
7367 if (name) return _("破滅の叫び", "Doomcall");
7368 if (desc) return _("視界内の全てのモンスターに対して轟音攻撃を行う。", "Damages all monsters in sight with booming sound.");
7370 /* Stop singing before start another */
7371 if (cast || fail) stop_singing();
7375 msg_print(_("轟音が響いた...", "The fury of the Downfall of Numenor lashes out..."));
7376 start_singing(spell, MUSIC_SOUND);
7380 int dice = 10 + plev / 5;
7383 if (info) return info_damage(dice, sides, 0);
7387 project_hack(GF_SOUND, damroll(dice, sides));
7394 if (name) return _("フィリエルの歌", "Firiel's Song");
7395 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
7398 /* Stop singing before start another */
7399 if (cast || fail) stop_singing();
7403 msg_print(_("生命と復活のテーマを奏で始めた...", "The themes of life and revival are woven into your song..."));
7404 animate_dead(0, p_ptr->y, p_ptr->x);
7410 if (name) return _("旅の仲間", "Fellowship Chant");
7411 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
7413 /* Stop singing before start another */
7414 if (cast || fail) stop_singing();
7418 msg_print(_("安らかなメロディを奏で始めた...", "You weave a slow, soothing melody of imploration..."));
7419 start_singing(spell, MUSIC_CHARM);
7423 int dice = 10 + plev / 15;
7426 if (info) return info_power_dice(dice, sides);
7430 charm_monsters(damroll(dice, sides));
7437 if (name) return _("分解音波", "Sound of disintegration");
7438 if (desc) return _("壁を掘り進む。自分の足元のアイテムは蒸発する。", "Makes you be able to burrow into walls. Objects under your feet evaporate.");
7440 /* Stop singing before start another */
7441 if (cast || fail) stop_singing();
7445 msg_print(_("粉砕するメロディを奏で始めた...", "You weave a violent pattern of sounds to break wall."));
7446 start_singing(spell, MUSIC_WALL);
7452 * MP不足で効果が発動される前に歌が中断してしまうのを防止。
7456 project(0, 0, p_ptr->y, p_ptr->x,
7457 0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1);
7463 if (name) return _("元素耐性", "Finrod's Resistance");
7464 if (desc) return _("酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
7465 "Gives resistance to fire, cold, electricity, acid and poison. These resistances can be added to which from equipment for more powerful resistances.");
7467 /* Stop singing before start another */
7468 if (cast || fail) stop_singing();
7472 msg_print(_("元素の力に対する忍耐の歌を歌った。", "You sing a song of perseverance against powers..."));
7473 start_singing(spell, MUSIC_RESIST);
7478 if (!p_ptr->oppose_acid)
7480 msg_print(_("酸への耐性が薄れた気がする。", "You feel less resistant to acid."));
7483 if (!p_ptr->oppose_elec)
7485 msg_print(_("電撃への耐性が薄れた気がする。", "You feel less resistant to elec."));
7488 if (!p_ptr->oppose_fire)
7490 msg_print(_("火への耐性が薄れた気がする。", "You feel less resistant to fire."));
7493 if (!p_ptr->oppose_cold)
7495 msg_print(_("冷気への耐性が薄れた気がする。", "You feel less resistant to cold."));
7498 if (!p_ptr->oppose_pois)
7500 msg_print(_("毒への耐性が薄れた気がする。", "You feel less resistant to pois."));
7507 if (name) return _("ホビットのメロディ", "Hobbit Melodies");
7508 if (desc) return _("加速する。", "Hastes you.");
7510 /* Stop singing before start another */
7511 if (cast || fail) stop_singing();
7515 msg_print(_("軽快な歌を口ずさみ始めた...", "You start singing joyful pop song..."));
7516 start_singing(spell, MUSIC_SPEED);
7523 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
7530 if (name) return _("歪んだ世界", "World Contortion");
7531 if (desc) return _("近くのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all nearby monsters away unless resisted.");
7534 int rad = plev / 15 + 1;
7535 int power = plev * 3 + 1;
7537 if (info) return info_radius(rad);
7539 /* Stop singing before start another */
7540 if (cast || fail) stop_singing();
7544 msg_print(_("歌が空間を歪めた...", "Reality whirls wildly as you sing a dizzying melody..."));
7545 project(0, rad, p_ptr->y, p_ptr->x, power, GF_AWAY_ALL, PROJECT_KILL, -1);
7551 if (name) return _("退散の歌", "Dispelling chant");
7552 if (desc) return _("視界内の全てのモンスターにダメージを与える。邪悪なモンスターに特に大きなダメージを与える。",
7553 "Damages all monsters in sight. Hurts evil monsters greatly.");
7555 /* Stop singing before start another */
7556 if (cast || fail) stop_singing();
7560 msg_print(_("耐えられない不協和音が敵を責め立てた...", "You cry out in an ear-wracking voice..."));
7561 start_singing(spell, MUSIC_DISPEL);
7565 int m_sides = plev * 3;
7566 int e_sides = plev * 3;
7568 if (info) return format("%s1d%d+1d%d", s_dam, m_sides, e_sides);
7572 dispel_monsters(randint1(m_sides));
7573 dispel_evil(randint1(e_sides));
7579 if (name) return _("サルマンの甘言", "The Voice of Saruman");
7580 if (desc) return _("視界内の全てのモンスターを減速させ、眠らせようとする。抵抗されると無効。", "Attempts to slow and sleep all monsters in sight.");
7582 /* Stop singing before start another */
7583 if (cast || fail) stop_singing();
7587 msg_print(_("優しく、魅力的な歌を口ずさみ始めた...", "You start humming a gentle and attractive song..."));
7588 start_singing(spell, MUSIC_SARUMAN);
7594 if (info) return info_power(power);
7598 slow_monsters(plev);
7599 sleep_monsters(plev);
7606 if (name) return _("嵐の音色", "Song of the Tempest");
7607 if (desc) return _("轟音のビームを放つ。", "Fires a beam of sound.");
7610 int dice = 15 + (plev - 1) / 2;
7613 if (info) return info_damage(dice, sides, 0);
7615 /* Stop singing before start another */
7616 if (cast || fail) stop_singing();
7620 if (!get_aim_dir(&dir)) return NULL;
7622 fire_beam(GF_SOUND, dir, damroll(dice, sides));
7628 if (name) return _("もう一つの世界", "Ambarkanta");
7629 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
7635 if (info) return info_delay(base, sides);
7637 /* Stop singing before start another */
7638 if (cast || fail) stop_singing();
7642 msg_print(_("周囲が変化し始めた...", "You sing of the primeval shaping of Middle-earth..."));
7649 if (name) return _("破壊の旋律", "Wrecking Pattern");
7650 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
7651 "Shakes dungeon structure, and results in random swapping of floors and walls.");
7653 /* Stop singing before start another */
7654 if (cast || fail) stop_singing();
7658 msg_print(_("破壊的な歌が響きわたった...", "You weave a pattern of sounds to contort and shatter..."));
7659 start_singing(spell, MUSIC_QUAKE);
7665 if (info) return info_radius(rad);
7669 earthquake(p_ptr->y, p_ptr->x, 10);
7677 if (name) return _("停滞の歌", "Stationary Shriek");
7678 if (desc) return _("視界内の全てのモンスターを麻痺させようとする。抵抗されると無効。", "Attempts to freeze all monsters in sight.");
7680 /* Stop singing before start another */
7681 if (cast || fail) stop_singing();
7685 msg_print(_("ゆっくりとしたメロディを奏で始めた...", "You weave a very slow pattern which is almost likely to stop..."));
7686 start_singing(spell, MUSIC_STASIS);
7690 int power = plev * 4;
7692 if (info) return info_power(power);
7696 stasis_monsters(power);
7703 if (name) return _("守りの歌", "Endurance");
7704 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。",
7705 "Sets a glyph on the floor beneath you. Monsters cannot attack you if you are on a glyph, but can try to break glyph.");
7708 /* Stop singing before start another */
7709 if (cast || fail) stop_singing();
7713 msg_print(_("歌が神聖な場を作り出した...", "The holy power of the Music is creating sacred field..."));
7720 if (name) return _("英雄の詩", "The Hero's Poem");
7721 if (desc) return _("加速し、ヒーロー気分になり、視界内の全てのモンスターにダメージを与える。",
7722 "Hastes you. Gives heroism. Damages all monsters in sight.");
7724 /* Stop singing before start another */
7725 if (cast || fail) stop_singing();
7729 msg_print(_("英雄の歌を口ずさんだ...", "You chant a powerful, heroic call to arms..."));
7730 (void)hp_player(10);
7731 (void)set_afraid(0);
7733 /* Recalculate hitpoints */
7734 p_ptr->update |= (PU_HP);
7736 start_singing(spell, MUSIC_SHERO);
7743 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
7744 /* Recalculate hitpoints */
7745 p_ptr->update |= (PU_HP);
7750 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
7756 int sides = plev * 3;
7758 if (info) return info_damage(dice, sides, 0);
7762 dispel_monsters(damroll(dice, sides));
7768 if (name) return _("ヤヴァンナの助け", "Relief of Yavanna");
7769 if (desc) return _("強力な回復の歌で、負傷と朦朧状態も全快する。", "Powerful healing song. Also heals cut and stun completely.");
7771 /* Stop singing before start another */
7772 if (cast || fail) stop_singing();
7776 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing the song..."));
7777 start_singing(spell, MUSIC_H_LIFE);
7784 if (info) return info_heal(dice, sides, 0);
7788 hp_player(damroll(dice, sides));
7797 if (name) return _("再生の歌", "Goddess' rebirth");
7798 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
7801 /* Stop singing before start another */
7802 if (cast || fail) stop_singing();
7806 msg_print(_("暗黒の中に光と美をふりまいた。体が元の活力を取り戻した。",
7807 "You strewed light and beauty in the dark as you sing. You feel refreshed."));
7808 (void)do_res_stat(A_STR);
7809 (void)do_res_stat(A_INT);
7810 (void)do_res_stat(A_WIS);
7811 (void)do_res_stat(A_DEX);
7812 (void)do_res_stat(A_CON);
7813 (void)do_res_stat(A_CHR);
7814 (void)restore_level();
7820 if (name) return _("サウロンの魔術", "Wizardry of Sauron");
7821 if (desc) return _("非常に強力でごく小さい轟音の球を放つ。", "Fires an extremely powerful tiny ball of sound.");
7824 int dice = 50 + plev;
7828 if (info) return info_damage(dice, sides, 0);
7830 /* Stop singing before start another */
7831 if (cast || fail) stop_singing();
7835 if (!get_aim_dir(&dir)) return NULL;
7837 fire_ball(GF_SOUND, dir, damroll(dice, sides), rad);
7843 if (name) return _("フィンゴルフィンの挑戦", "Fingolfin's Challenge");
7844 if (desc) return _("ダメージを受けなくなるバリアを張る。",
7845 "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks.");
7847 /* Stop singing before start another */
7848 if (cast || fail) stop_singing();
7852 msg_print(_("フィンゴルフィンの冥王への挑戦を歌った...",
7853 "You recall the valor of Fingolfin's challenge to the Dark Lord..."));
7856 p_ptr->redraw |= (PR_MAP);
7858 /* Update monsters */
7859 p_ptr->update |= (PU_MONSTERS);
7862 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
7864 start_singing(spell, MUSIC_INVULN);
7871 msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));
7873 p_ptr->redraw |= (PR_MAP);
7875 /* Update monsters */
7876 p_ptr->update |= (PU_MONSTERS);
7879 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
7892 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_CAST)
7893 * @return SPELL_NAME / SPELL_DESC 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
7895 static cptr do_hissatsu_spell(SPELL_IDX spell, BIT_FLAGS mode)
7897 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
7898 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
7899 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
7902 int plev = p_ptr->lev;
7907 if (name) return _("飛飯綱", "Tobi-Izuna");
7908 if (desc) return _("2マス離れたところにいるモンスターを攻撃する。", "Attacks a two squares distant monster.");
7913 if (!get_aim_dir(&dir)) return NULL;
7915 project_hook(GF_ATTACK, dir, HISSATSU_2, PROJECT_STOP | PROJECT_KILL);
7920 if (name) return _("五月雨斬り", "3-Way Attack");
7921 if (desc) return _("3方向に対して攻撃する。", "Attacks in 3 directions in one time.");
7928 if (!get_rep_dir2(&dir)) return NULL;
7929 if (dir == 5) return NULL;
7931 for (cdir = 0;cdir < 8; cdir++)
7933 if (cdd[cdir] == dir) break;
7936 if (cdir == 8) return NULL;
7938 y = p_ptr->y + ddy_cdd[cdir];
7939 x = p_ptr->x + ddx_cdd[cdir];
7940 if (cave[y][x].m_idx)
7943 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
7945 y = p_ptr->y + ddy_cdd[(cdir + 7) % 8];
7946 x = p_ptr->x + ddx_cdd[(cdir + 7) % 8];
7947 if (cave[y][x].m_idx)
7950 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
7952 y = p_ptr->y + ddy_cdd[(cdir + 1) % 8];
7953 x = p_ptr->x + ddx_cdd[(cdir + 1) % 8];
7954 if (cave[y][x].m_idx)
7957 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
7962 if (name) return _("ブーメラン", "Boomerang");
7963 if (desc) return _("武器を手元に戻ってくるように投げる。戻ってこないこともある。",
7964 "Throws current weapon. And it'll return to your hand unless failed.");
7968 if (!do_cmd_throw_aux(1, TRUE, -1)) return NULL;
7973 if (name) return _("焔霊", "Burning Strike");
7974 if (desc) return _("火炎耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to fire.");
7980 if (!get_rep_dir2(&dir)) return NULL;
7981 if (dir == 5) return NULL;
7983 y = p_ptr->y + ddy[dir];
7984 x = p_ptr->x + ddx[dir];
7986 if (cave[y][x].m_idx)
7987 py_attack(y, x, HISSATSU_FIRE);
7990 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
7997 if (name) return _("殺気感知", "Detect Ferocity");
7998 if (desc) return _("近くの思考することができるモンスターを感知する。", "Detects all monsters except mindless in your vicinity.");
8002 detect_monsters_mind(DETECT_RAD_DEFAULT);
8007 if (name) return _("みね打ち", "Strike to Stun");
8008 if (desc) return _("相手にダメージを与えないが、朦朧とさせる。", "Attempts to stun a monster in the adjacent.");
8014 if (!get_rep_dir2(&dir)) return NULL;
8015 if (dir == 5) return NULL;
8017 y = p_ptr->y + ddy[dir];
8018 x = p_ptr->x + ddx[dir];
8020 if (cave[y][x].m_idx)
8021 py_attack(y, x, HISSATSU_MINEUCHI);
8024 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8031 if (name) return _("カウンター", "Counter");
8032 if (desc) return _("相手に攻撃されたときに反撃する。反撃するたびにMPを消費。",
8033 "Prepares to counterattack. When attack by a monster, strikes back using SP each time.");
8039 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
8042 msg_print(_("相手の攻撃に対して身構えた。", "You prepare to counter blow."));
8043 p_ptr->counter = TRUE;
8048 if (name) return _("払い抜け", "Harainuke");
8049 if (desc) return _("攻撃した後、反対側に抜ける。",
8050 "Attacks monster with your weapons normally, then move through counter side of the monster.");
8058 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
8062 if (!get_rep_dir2(&dir)) return NULL;
8064 if (dir == 5) return NULL;
8065 y = p_ptr->y + ddy[dir];
8066 x = p_ptr->x + ddx[dir];
8068 if (!cave[y][x].m_idx)
8070 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8076 if (!player_can_enter(cave[y][x].feat, 0) || is_trap(cave[y][x].feat))
8082 if (player_can_enter(cave[y][x].feat, 0) && !is_trap(cave[y][x].feat) && !cave[y][x].m_idx)
8086 /* Move the player */
8087 (void)move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);
8093 if (name) return _("サーペンツタン", "Serpent's Tongue");
8094 if (desc) return _("毒耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to poison.");
8100 if (!get_rep_dir2(&dir)) return NULL;
8101 if (dir == 5) return NULL;
8103 y = p_ptr->y + ddy[dir];
8104 x = p_ptr->x + ddx[dir];
8106 if (cave[y][x].m_idx)
8107 py_attack(y, x, HISSATSU_POISON);
8110 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8117 if (name) return _("斬魔剣弐の太刀", "Zammaken");
8118 if (desc) return _("生命のない邪悪なモンスターに大ダメージを与えるが、他のモンスターには全く効果がない。",
8119 "Attacks an evil unliving monster with great damage. No effect to other monsters.");
8125 if (!get_rep_dir2(&dir)) return NULL;
8126 if (dir == 5) return NULL;
8128 y = p_ptr->y + ddy[dir];
8129 x = p_ptr->x + ddx[dir];
8131 if (cave[y][x].m_idx)
8132 py_attack(y, x, HISSATSU_ZANMA);
8135 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8142 if (name) return _("裂風剣", "Wind Blast");
8143 if (desc) return _("攻撃した相手を後方へ吹き飛ばす。", "Attacks an adjacent monster, and blow it away.");
8149 if (!get_rep_dir2(&dir)) return NULL;
8150 if (dir == 5) return NULL;
8152 y = p_ptr->y + ddy[dir];
8153 x = p_ptr->x + ddx[dir];
8155 if (cave[y][x].m_idx)
8159 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8162 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
8166 if (cave[y][x].m_idx)
8169 POSITION ty = y, tx = x;
8170 POSITION oy = y, ox = x;
8171 MONSTER_IDX m_idx = cave[y][x].m_idx;
8172 monster_type *m_ptr = &m_list[m_idx];
8175 monster_desc(m_name, m_ptr, 0);
8177 for (i = 0; i < 5; i++)
8181 if (cave_empty_bold(y, x))
8188 if ((ty != oy) || (tx != ox))
8190 msg_format(_("%sを吹き飛ばした!", "You blow %s away!"), m_name);
8191 cave[oy][ox].m_idx = 0;
8192 cave[ty][tx].m_idx = m_idx;
8196 update_mon(m_idx, TRUE);
8200 if (r_info[m_ptr->r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))
8201 p_ptr->update |= (PU_MON_LITE);
8208 if (name) return _("刀匠の目利き", "Judge");
8209 if (desc) return _("武器・防具を1つ識別する。レベル45以上で武器・防具の能力を完全に知ることができる。",
8210 "Identifies a weapon or armor. Or *identifies* these at level 45.");
8216 if (!identify_fully(TRUE)) return NULL;
8220 if (!ident_spell(TRUE)) return NULL;
8226 if (name) return _("破岩斬", "Rock Smash");
8227 if (desc) return _("岩を壊し、岩石系のモンスターに大ダメージを与える。", "Breaks rock. Or greatly damage a monster made by rocks.");
8233 if (!get_rep_dir2(&dir)) return NULL;
8234 if (dir == 5) return NULL;
8236 y = p_ptr->y + ddy[dir];
8237 x = p_ptr->x + ddx[dir];
8239 if (cave[y][x].m_idx)
8240 py_attack(y, x, HISSATSU_HAGAN);
8242 if (!cave_have_flag_bold(y, x, FF_HURT_ROCK)) break;
8244 /* Destroy the feature */
8245 cave_alter_feat(y, x, FF_HURT_ROCK);
8247 /* Update some things */
8248 p_ptr->update |= (PU_FLOW);
8253 if (name) return _("乱れ雪月花", "Midare-Setsugekka");
8254 if (desc) return _("攻撃回数が増え、冷気耐性のないモンスターに大ダメージを与える。",
8255 "Attacks a monster with increased number of attacks and more damage unless it has resistance to cold.");
8261 if (!get_rep_dir2(&dir)) return NULL;
8262 if (dir == 5) return NULL;
8264 y = p_ptr->y + ddy[dir];
8265 x = p_ptr->x + ddx[dir];
8267 if (cave[y][x].m_idx)
8268 py_attack(y, x, HISSATSU_COLD);
8271 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8278 if (name) return _("急所突き", "Spot Aiming");
8279 if (desc) return _("モンスターを一撃で倒す攻撃を繰り出す。失敗すると1点しかダメージを与えられない。",
8280 "Attempts to kill a monster instantly. If failed cause only 1HP of damage.");
8286 if (!get_rep_dir2(&dir)) return NULL;
8287 if (dir == 5) return NULL;
8289 y = p_ptr->y + ddy[dir];
8290 x = p_ptr->x + ddx[dir];
8292 if (cave[y][x].m_idx)
8293 py_attack(y, x, HISSATSU_KYUSHO);
8296 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8303 if (name) return _("魔神斬り", "Majingiri");
8304 if (desc) return _("会心の一撃で攻撃する。攻撃がかわされやすい。",
8305 "Attempts to attack with critical hit. But this attack is easy to evade for a monster.");
8311 if (!get_rep_dir2(&dir)) return NULL;
8312 if (dir == 5) return NULL;
8314 y = p_ptr->y + ddy[dir];
8315 x = p_ptr->x + ddx[dir];
8317 if (cave[y][x].m_idx)
8318 py_attack(y, x, HISSATSU_MAJIN);
8321 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8328 if (name) return _("捨て身", "Desperate Attack");
8329 if (desc) return _("強力な攻撃を繰り出す。次のターンまでの間、食らうダメージが増える。",
8330 "Attacks with all of your power. But all damages you take will be doubled for one turn.");
8336 if (!get_rep_dir2(&dir)) return NULL;
8337 if (dir == 5) return NULL;
8339 y = p_ptr->y + ddy[dir];
8340 x = p_ptr->x + ddx[dir];
8342 if (cave[y][x].m_idx)
8343 py_attack(y, x, HISSATSU_SUTEMI);
8346 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8349 p_ptr->sutemi = TRUE;
8354 if (name) return _("雷撃鷲爪斬", "Lightning Eagle");
8355 if (desc) return _("電撃耐性のないモンスターに非常に大きいダメージを与える。",
8356 "Attacks a monster with more damage unless it has resistance to electricity.");
8362 if (!get_rep_dir2(&dir)) return NULL;
8363 if (dir == 5) return NULL;
8365 y = p_ptr->y + ddy[dir];
8366 x = p_ptr->x + ddx[dir];
8368 if (cave[y][x].m_idx)
8369 py_attack(y, x, HISSATSU_ELEC);
8372 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8379 if (name) return _("入身", "Rush Attack");
8380 if (desc) return _("素早く相手に近寄り攻撃する。", "Steps close to a monster and attacks at a time.");
8384 if (!rush_attack(NULL)) return NULL;
8389 if (name) return _("赤流渦", "Bloody Maelstrom");
8390 if (desc) return _("自分自身も傷を作りつつ、その傷が深いほど大きい威力で全方向の敵を攻撃できる。生きていないモンスターには効果がない。",
8391 "Attacks all adjacent monsters with power corresponding to your cut status. Then increases your cut status. No effect to unliving monsters.");
8398 monster_type *m_ptr;
8400 if (p_ptr->cut < 300)
8401 set_cut(p_ptr->cut + 300);
8403 set_cut(p_ptr->cut * 2);
8405 for (dir = 0; dir < 8; dir++)
8407 y = p_ptr->y + ddy_ddd[dir];
8408 x = p_ptr->x + ddx_ddd[dir];
8409 c_ptr = &cave[y][x];
8411 /* Get the monster */
8412 m_ptr = &m_list[c_ptr->m_idx];
8414 /* Hack -- attack monsters */
8415 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
8417 if (!monster_living(&r_info[m_ptr->r_idx]))
8421 monster_desc(m_name, m_ptr, 0);
8422 msg_format(_("%sには効果がない!", "%s is unharmed!"), m_name);
8424 else py_attack(y, x, HISSATSU_SEKIRYUKA);
8431 if (name) return _("激震撃", "Earthquake Blow");
8432 if (desc) return _("地震を起こす。", "Shakes dungeon structure, and results in random swapping of floors and walls.");
8438 if (!get_rep_dir2(&dir)) return NULL;
8439 if (dir == 5) return NULL;
8441 y = p_ptr->y + ddy[dir];
8442 x = p_ptr->x + ddx[dir];
8444 if (cave[y][x].m_idx)
8445 py_attack(y, x, HISSATSU_QUAKE);
8447 earthquake(p_ptr->y, p_ptr->x, 10);
8452 if (name) return _("地走り", "Crack");
8453 if (desc) return _("衝撃波のビームを放つ。", "Fires a beam of shock wave.");
8457 int total_damage = 0, basedam, i;
8458 u32b flgs[TR_FLAG_SIZE];
8460 if (!get_aim_dir(&dir)) return NULL;
8461 msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
8462 for (i = 0; i < 2; i++)
8466 if (!buki_motteruka(INVEN_RARM+i)) break;
8467 o_ptr = &inventory[INVEN_RARM+i];
8468 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
8469 damage = o_ptr->to_d * 100;
8470 object_flags(o_ptr, flgs);
8471 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
8477 else if (have_flag(flgs, TR_VORPAL))
8479 /* vorpal flag only */
8484 damage *= p_ptr->num_blow[i];
8485 total_damage += damage / 200;
8486 if (i) total_damage = total_damage*7/10;
8488 fire_beam(GF_FORCE, dir, total_damage);
8493 if (name) return _("気迫の雄叫び", "War Cry");
8494 if (desc) return _("視界内の全モンスターに対して轟音の攻撃を行う。さらに、近くにいるモンスターを怒らせる。",
8495 "Damages all monsters in sight with sound. Aggravate nearby monsters.");
8499 msg_print(_("雄叫びをあげた!", "You roar out!"));
8500 project_hack(GF_SOUND, randint1(plev * 3));
8501 aggravate_monsters(0);
8506 if (name) return _("無双三段", "Musou-Sandan");
8507 if (desc) return _("強力な3段攻撃を繰り出す。", "Attacks with powerful 3 strikes.");
8513 if (!get_rep_dir2(&dir)) return NULL;
8514 if (dir == 5) return NULL;
8516 for (i = 0; i < 3; i++)
8522 monster_type *m_ptr;
8524 y = p_ptr->y + ddy[dir];
8525 x = p_ptr->x + ddx[dir];
8526 c_ptr = &cave[y][x];
8529 py_attack(y, x, HISSATSU_3DAN);
8532 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8536 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
8541 /* Monster is dead? */
8542 if (!c_ptr->m_idx) break;
8546 m_idx = c_ptr->m_idx;
8547 m_ptr = &m_list[m_idx];
8549 /* Monster cannot move back? */
8550 if (!monster_can_enter(ny, nx, &r_info[m_ptr->r_idx], 0))
8553 if (i < 2) msg_print(NULL);
8558 cave[ny][nx].m_idx = m_idx;
8562 update_mon(m_idx, TRUE);
8564 /* Redraw the old spot */
8567 /* Redraw the new spot */
8570 /* Player can move forward? */
8571 if (player_can_enter(c_ptr->feat, 0))
8573 /* Move the player */
8574 if (!move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP)) break;
8582 if (i < 2) msg_print(NULL);
8588 if (name) return _("吸血鬼の牙", "Vampire's Fang");
8589 if (desc) return _("攻撃した相手の体力を吸いとり、自分の体力を回復させる。生命を持たないモンスターには通じない。",
8590 "Attacks with vampiric strikes which absorbs HP from a monster and gives them to you. No effect to unliving monsters.");
8596 if (!get_rep_dir2(&dir)) return NULL;
8597 if (dir == 5) return NULL;
8599 y = p_ptr->y + ddy[dir];
8600 x = p_ptr->x + ddx[dir];
8602 if (cave[y][x].m_idx)
8603 py_attack(y, x, HISSATSU_DRAIN);
8606 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8613 if (name) return _("幻惑", "Moon Dazzling");
8614 if (desc) return _("視界内の起きている全モンスターに朦朧、混乱、眠りを与えようとする。", "Attempts to stun, confuse and sleep all waking monsters.");
8618 msg_print(_("武器を不規則に揺らした...", "You irregularly wave your weapon..."));
8619 project_hack(GF_ENGETSU, plev * 4);
8620 project_hack(GF_ENGETSU, plev * 4);
8621 project_hack(GF_ENGETSU, plev * 4);
8626 if (name) return _("百人斬り", "Hundred Slaughter");
8627 if (desc) return _("連続して入身でモンスターを攻撃する。攻撃するたびにMPを消費。MPがなくなるか、モンスターを倒せなかったら百人斬りは終了する。",
8628 "Performs a series of rush attacks. The series continues while killing each monster in a time and SP remains.");
8632 const int mana_cost_per_monster = 8;
8638 if (!rush_attack(&mdeath)) break;
8641 /* Reserve needed mana point */
8642 p_ptr->csp -= technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
8646 p_ptr->csp -= mana_cost_per_monster;
8651 p_ptr->redraw |= PR_MANA;
8654 while (p_ptr->csp > mana_cost_per_monster);
8656 if (is_new) return NULL;
8658 /* Restore reserved mana */
8659 p_ptr->csp += technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
8664 if (name) return _("天翔龍閃", "Dragonic Flash");
8665 if (desc) return _("視界内の場所を指定して、その場所と自分の間にいる全モンスターを攻撃し、その場所に移動する。",
8666 "Runs toward given location while attacking all monsters on the path.");
8672 if (!tgt_pt(&x, &y)) return NULL;
8674 if (!cave_player_teleportable_bold(y, x, 0L) ||
8675 (distance(y, x, p_ptr->y, p_ptr->x) > MAX_SIGHT / 2) ||
8676 !projectable(p_ptr->y, p_ptr->x, y, x))
8678 msg_print(_("失敗!", "You cannot move to that place!"));
8681 if (p_ptr->anti_tele)
8683 msg_print(_("不思議な力がテレポートを防いだ!", "A mysterious force prevents you from teleporting!"));
8686 project(0, 0, y, x, HISSATSU_ISSEN, GF_ATTACK, PROJECT_BEAM | PROJECT_KILL, -1);
8687 teleport_player_to(y, x, 0L);
8692 if (name) return _("二重の剣撃", "Twin Slash");
8693 if (desc) return _("1ターンで2度攻撃を行う。", "double attacks at a time.");
8699 if (!get_rep_dir(&dir, FALSE)) return NULL;
8701 y = p_ptr->y + ddy[dir];
8702 x = p_ptr->x + ddx[dir];
8704 if (cave[y][x].m_idx)
8707 if (cave[y][x].m_idx)
8715 msg_print(_("その方向にはモンスターはいません。", "You don't see any monster in this direction"));
8722 if (name) return _("虎伏絶刀勢", "Kofuku-Zettousei");
8723 if (desc) return _("強力な攻撃を行い、近くの場所にも効果が及ぶ。", "Performs a powerful attack which even effect nearby monsters.");
8727 int total_damage = 0, basedam, i;
8729 u32b flgs[TR_FLAG_SIZE];
8732 if (!get_rep_dir2(&dir)) return NULL;
8733 if (dir == 5) return NULL;
8735 y = p_ptr->y + ddy[dir];
8736 x = p_ptr->x + ddx[dir];
8738 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
8740 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));
8743 msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
8744 for (i = 0; i < 2; i++)
8747 if (!buki_motteruka(INVEN_RARM+i)) break;
8748 o_ptr = &inventory[INVEN_RARM+i];
8749 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
8750 damage = o_ptr->to_d * 100;
8751 object_flags(o_ptr, flgs);
8752 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
8758 else if (have_flag(flgs, TR_VORPAL))
8760 /* vorpal flag only */
8765 damage += p_ptr->to_d[i] * 100;
8766 damage *= p_ptr->num_blow[i];
8767 total_damage += (damage / 100);
8769 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);
8774 if (name) return _("慶雲鬼忍剣", "Keiun-Kininken");
8775 if (desc) return _("自分もダメージをくらうが、相手に非常に大きなダメージを与える。アンデッドには特に効果がある。",
8776 "Attacks a monster with extremely powerful damage. But you also takes some damages. Hurts a undead monster greatly.");
8782 if (!get_rep_dir2(&dir)) return NULL;
8783 if (dir == 5) return NULL;
8785 y = p_ptr->y + ddy[dir];
8786 x = p_ptr->x + ddx[dir];
8788 if (cave[y][x].m_idx)
8789 py_attack(y, x, HISSATSU_UNDEAD);
8792 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8795 take_hit(DAMAGE_NOESCAPE, 100 + randint1(100), _("慶雲鬼忍剣を使った衝撃", "exhaustion on using Keiun-Kininken"), -1);
8800 if (name) return _("切腹", "Harakiri");
8801 if (desc) return _("「武士道とは、死ぬことと見つけたり。」", "'Busido is found in death'");
8806 if (!get_check(_("本当に自殺しますか?", "Do you really want to commit suicide? "))) return NULL;
8807 /* Special Verification for suicide */
8808 prt(_("確認のため '@' を押して下さい。", "Please verify SUICIDE by typing the '@' sign: "), 0, 0);
8813 if (i != '@') return NULL;
8814 if (p_ptr->total_winner)
8816 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
8817 p_ptr->total_winner = TRUE;
8821 msg_print(_("武士道とは、死ぬことと見つけたり。", "Meaning of Bushi-do is found in the death."));
8822 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
8832 * @brief 呪術領域の武器呪縛の対象にできる武器かどうかを返す。 / An "item_tester_hook" for offer
8833 * @param o_ptr オブジェクト構造体の参照ポインタ
8834 * @return 呪縛可能な武器ならばTRUEを返す
8836 static bool item_tester_hook_weapon_except_bow(object_type *o_ptr)
8838 switch (o_ptr->tval)
8853 * @brief 呪術領域の各処理に使える呪われた装備かどうかを返す。 / An "item_tester_hook" for offer
8854 * @param o_ptr オブジェクト構造体の参照ポインタ
8855 * @return 使える装備ならばTRUEを返す
8857 static bool item_tester_hook_cursed(object_type *o_ptr)
8859 return (bool)(object_is_cursed(o_ptr));
8863 * @brief 呪術領域魔法の各処理を行う
8865 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_CONT / SPELL_STOP)
8866 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
8868 static cptr do_hex_spell(SPELL_IDX spell, BIT_FLAGS mode)
8870 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
8871 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
8872 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
8873 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
8874 bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
8875 bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
8879 PLAYER_LEVEL plev = p_ptr->lev;
8884 /*** 1st book (0-7) ***/
8886 if (name) return _("邪なる祝福", "Evily blessing");
8887 if (desc) return _("祝福により攻撃精度と防御力が上がる。", "Attempts to increase +to_hit of a weapon and AC");
8890 if (!p_ptr->blessed)
8892 msg_print(_("高潔な気分になった!", "You feel righteous!"));
8897 if (!p_ptr->blessed)
8899 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
8905 if (name) return _("軽傷の治癒", "Cure light wounds");
8906 if (desc) return _("HPや傷を少し回復させる。", "Heals cut and HP a little.");
8907 if (info) return info_heal(1, 10, 0);
8910 msg_print(_("気分が良くなってくる。", "You feel better and better."));
8914 hp_player(damroll(1, 10));
8915 set_cut(p_ptr->cut - 10);
8920 if (name) return _("悪魔のオーラ", "Demonic aura");
8921 if (desc) return _("炎のオーラを身にまとい、回復速度が速くなる。", "Gives fire aura and regeneration.");
8924 msg_print(_("体が炎のオーラで覆われた。", "You have enveloped by fiery aura!"));
8928 msg_print(_("炎のオーラが消え去った。", "Fiery aura disappeared."));
8933 if (name) return _("悪臭霧", "Stinking mist");
8934 if (desc) return _("視界内のモンスターに微弱量の毒のダメージを与える。", "Deals few damages of poison to all monsters in your sight.");
8935 power = plev / 2 + 5;
8936 if (info) return info_damage(1, power, 0);
8939 project_hack(GF_POIS, randint1(power));
8944 if (name) return _("腕力強化", "Extra might");
8945 if (desc) return _("術者の腕力を上昇させる。", "Attempts to increase your strength.");
8948 msg_print(_("何だか力が湧いて来る。", "You feel you get stronger."));
8953 if (name) return _("武器呪縛", "Curse weapon");
8954 if (desc) return _("装備している武器を呪う。", "Curses your weapon.");
8959 char o_name[MAX_NLEN];
8961 u32b f[TR_FLAG_SIZE];
8963 item_tester_hook = item_tester_hook_weapon_except_bow;
8964 q = _("どれを呪いますか?", "Which weapon do you curse?");
8965 s = _("武器を装備していない。", "You wield no weapons.");
8967 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
8969 o_ptr = &inventory[item];
8970 object_desc(o_name, o_ptr, OD_NAME_ONLY);
8971 object_flags(o_ptr, f);
8973 if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
8976 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
8978 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
8981 if (o_ptr->to_d > 0)
8983 o_ptr->to_d -= randint1(3) % 2;
8984 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
8986 if (o_ptr->to_h > 0)
8988 o_ptr->to_h -= randint1(3) % 2;
8989 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
8991 if (o_ptr->to_a > 0)
8993 o_ptr->to_a -= randint1(3) % 2;
8994 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
8996 msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
9002 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
9003 o_ptr->curse_flags |= (TRC_CURSED);
9005 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
9008 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
9011 o_ptr->curse_flags |= (TRC_TY_CURSE);
9012 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
9014 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
9015 add_flag(o_ptr->art_flags, TR_VORPAL);
9016 add_flag(o_ptr->art_flags, TR_VAMPIRIC);
9017 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
9022 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);
9025 p_ptr->update |= (PU_BONUS);
9031 if (name) return _("邪悪感知", "Evil detection");
9032 if (desc) return _("周囲の邪悪なモンスターを感知する。", "Detects evil monsters.");
9033 if (info) return info_range(MAX_SIGHT);
9036 msg_print(_("邪悪な生物の存在を感じ取ろうとした。", "You attend to the presence of evil creatures."));
9041 if (name) return _("我慢", "Patience");
9042 if (desc) return _("数ターン攻撃を耐えた後、受けたダメージを地獄の業火として周囲に放出する。",
9043 "Bursts hell fire strongly after patients any damage while few turns.");
9044 power = MIN(200, (HEX_REVENGE_POWER(p_ptr) * 2));
9045 if (info) return info_damage(0, 0, power);
9048 int a = 3 - (p_ptr->pspeed - 100) / 10;
9049 MAGIC_NUM2 r = 3 + randint1(3) + MAX(0, MIN(3, a));
9051 if (HEX_REVENGE_TURN(p_ptr) > 0)
9053 msg_print(_("すでに我慢をしている。", "You are already patienting."));
9057 HEX_REVENGE_TYPE(p_ptr) = 1;
9058 HEX_REVENGE_TURN(p_ptr) = r;
9059 HEX_REVENGE_POWER(p_ptr) = 0;
9060 msg_print(_("じっと耐えることにした。", "You decide to patient all damages."));
9065 int rad = 2 + (power / 50);
9067 HEX_REVENGE_TURN(p_ptr)--;
9069 if ((HEX_REVENGE_TURN(p_ptr) <= 0) || (power >= 200))
9071 msg_print(_("我慢が解かれた!", "Time for end of patioence!"));
9074 project(0, rad, p_ptr->y, p_ptr->x, power, GF_HELL_FIRE,
9075 (PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);
9079 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
9083 HEX_REVENGE_TYPE(p_ptr) = 0;
9084 HEX_REVENGE_TURN(p_ptr) = 0;
9085 HEX_REVENGE_POWER(p_ptr) = 0;
9090 /*** 2nd book (8-15) ***/
9092 if (name) return _("氷の鎧", "Ice armor");
9093 if (desc) return _("氷のオーラを身にまとい、防御力が上昇する。", "Gives fire aura and bonus to AC.");
9096 msg_print(_("体が氷の鎧で覆われた。", "You have enveloped by ice armor!"));
9100 msg_print(_("氷の鎧が消え去った。", "Ice armor disappeared."));
9105 if (name) return _("重傷の治癒", "Cure serious wounds");
9106 if (desc) return _("体力や傷を多少回復させる。", "Heals cut and HP more.");
9107 if (info) return info_heal(2, 10, 0);
9110 msg_print(_("気分が良くなってくる。", "You feel better and better."));
9114 hp_player(damroll(2, 10));
9115 set_cut((p_ptr->cut / 2) - 10);
9120 if (name) return _("薬品吸入", "Inhail potion");
9121 if (desc) return _("呪文詠唱を中止することなく、薬の効果を得ることができる。", "Quaffs a potion without canceling of casting a spell.");
9124 CASTING_HEX_FLAGS(p_ptr) |= (1L << HEX_INHAIL);
9125 do_cmd_quaff_potion();
9126 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_INHAIL);
9132 if (name) return _("衰弱の霧", "Hypodynamic mist");
9133 if (desc) return _("視界内のモンスターに微弱量の衰弱属性のダメージを与える。",
9134 "Deals few damages of hypodynamia to all monsters in your sight.");
9135 power = (plev / 2) + 5;
9136 if (info) return info_damage(1, power, 0);
9139 project_hack(GF_HYPODYNAMIA, randint1(power));
9144 if (name) return _("魔剣化", "Swords to runeswords");
9145 if (desc) return _("武器の攻撃力を上げる。切れ味を得、呪いに応じて与えるダメージが上昇し、善良なモンスターに対するダメージが2倍になる。",
9146 "Gives vorpal ability to your weapon. Increases damages by your weapon acccording to curse of your weapon.");
9150 msg_print("あなたの武器が黒く輝いた。");
9152 if (!empty_hands(FALSE))
9153 msg_print("Your weapons glow bright black.");
9155 msg_print("Your weapon glows bright black.");
9161 msg_print("武器の輝きが消え去った。");
9163 msg_format("Brightness of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
9169 if (name) return _("混乱の手", "Touch of confusion");
9170 if (desc) return _("攻撃した際モンスターを混乱させる。", "Confuses a monster when you attack.");
9173 msg_print(_("あなたの手が赤く輝き始めた。", "Your hands glow bright red."));
9177 msg_print(_("手の輝きがなくなった。", "Brightness on your hands disappeard."));
9182 if (name) return _("肉体強化", "Building up");
9183 if (desc) return _("術者の腕力、器用さ、耐久力を上昇させる。攻撃回数の上限を 1 増加させる。",
9184 "Attempts to increases your strength, dexterity and constitusion.");
9187 msg_print(_("身体が強くなった気がした。", "You feel your body is developed more now."));
9192 if (name) return _("反テレポート結界", "Anti teleport barrier");
9193 if (desc) return _("視界内のモンスターのテレポートを阻害するバリアを張る。", "Obstructs all teleportations by monsters in your sight.");
9194 power = plev * 3 / 2;
9195 if (info) return info_power(power);
9198 msg_print(_("テレポートを防ぐ呪いをかけた。", "You feel anyone can not teleport except you."));
9202 /*** 3rd book (16-23) ***/
9204 if (name) return _("衝撃のクローク", "Cloak of shock");
9205 if (desc) return _("電気のオーラを身にまとい、動きが速くなる。", "Gives lightning aura and a bonus to speed.");
9208 msg_print(_("体が稲妻のオーラで覆われた。", "You have enveloped by electrical aura!"));
9212 msg_print(_("稲妻のオーラが消え去った。", "Electrical aura disappeared."));
9217 if (name) return _("致命傷の治癒", "Cure critical wounds");
9218 if (desc) return _("体力や傷を回復させる。", "Heals cut and HP greatry.");
9219 if (info) return info_heal(4, 10, 0);
9222 msg_print(_("気分が良くなってくる。", "You feel better and better."));
9226 hp_player(damroll(4, 10));
9234 if (name) return _("呪力封入", "Recharging");
9235 if (desc) return _("魔法の道具に魔力を再充填する。", "Recharges a magic device.");
9237 if (info) return info_power(power);
9240 if (!recharge(power)) return NULL;
9246 if (name) return _("死者復活", "Animate Dead");
9247 if (desc) return _("死体を蘇らせてペットにする。", "Raises corpses and skeletons from dead.");
9250 msg_print(_("死者への呼びかけを始めた。", "You start to call deads.!"));
9254 animate_dead(0, p_ptr->y, p_ptr->x);
9259 if (name) return _("防具呪縛", "Curse armor");
9260 if (desc) return _("装備している防具に呪いをかける。", "Curse a piece of armour that you wielding.");
9265 char o_name[MAX_NLEN];
9267 u32b f[TR_FLAG_SIZE];
9269 item_tester_hook = object_is_armour;
9270 q = _("どれを呪いますか?", "Which piece of armour do you curse?");
9271 s = _("防具を装備していない。", "You wield no piece of armours.");
9273 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
9275 o_ptr = &inventory[item];
9276 object_desc(o_name, o_ptr, OD_NAME_ONLY);
9277 object_flags(o_ptr, f);
9279 if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
9282 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
9284 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
9287 if (o_ptr->to_d > 0)
9289 o_ptr->to_d -= randint1(3) % 2;
9290 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
9292 if (o_ptr->to_h > 0)
9294 o_ptr->to_h -= randint1(3) % 2;
9295 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
9297 if (o_ptr->to_a > 0)
9299 o_ptr->to_a -= randint1(3) % 2;
9300 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
9302 msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
9308 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
9309 o_ptr->curse_flags |= (TRC_CURSED);
9311 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
9314 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
9317 o_ptr->curse_flags |= (TRC_TY_CURSE);
9318 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
9320 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
9321 add_flag(o_ptr->art_flags, TR_RES_POIS);
9322 add_flag(o_ptr->art_flags, TR_RES_DARK);
9323 add_flag(o_ptr->art_flags, TR_RES_NETHER);
9324 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
9329 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);
9332 p_ptr->update |= (PU_BONUS);
9338 if (name) return _("影のクローク", "Cloak of shadow");
9339 if (desc) return _("影のオーラを身にまとい、敵に影のダメージを与える。", "Gives aura of shadow.");
9342 object_type *o_ptr = &inventory[INVEN_OUTER];
9346 msg_print(_("クロークを身につけていない!", "You don't ware any cloak."));
9349 else if (!object_is_cursed(o_ptr))
9351 msg_print(_("クロークは呪われていない!", "Your cloak is not cursed."));
9356 msg_print(_("影のオーラを身にまとった。", "You have enveloped by shadow aura!"));
9361 object_type *o_ptr = &inventory[INVEN_OUTER];
9363 if ((!o_ptr->k_idx) || (!object_is_cursed(o_ptr)))
9365 do_spell(REALM_HEX, spell, SPELL_STOP);
9366 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << spell);
9367 CASTING_HEX_NUM(p_ptr)--;
9368 if (!SINGING_SONG_ID(p_ptr)) set_action(ACTION_NONE);
9373 msg_print(_("影のオーラが消え去った。", "Shadow aura disappeared."));
9378 if (name) return _("苦痛を魔力に", "Pains to mana");
9379 if (desc) return _("視界内のモンスターに精神ダメージ与え、魔力を吸い取る。", "Deals psychic damages to all monsters in sight, and drains some mana.");
9380 power = plev * 3 / 2;
9381 if (info) return info_damage(1, power, 0);
9384 project_hack(GF_PSI_DRAIN, randint1(power));
9389 if (name) return _("目には目を", "Eye for an eye");
9390 if (desc) return _("打撃や魔法で受けたダメージを、攻撃元のモンスターにも与える。", "Returns same damage which you got to the monster which damaged you.");
9393 msg_print(_("復讐したい欲望にかられた。", "You wish strongly you want to revenge anything."));
9397 /*** 4th book (24-31) ***/
9399 if (name) return _("反増殖結界", "Anti multiply barrier");
9400 if (desc) return _("その階の増殖するモンスターの増殖を阻止する。", "Obstructs all multiplying by monsters in entire floor.");
9403 msg_print(_("増殖を阻止する呪いをかけた。", "You feel anyone can not already multiply."));
9408 if (name) return _("全復活", "Restoration");
9409 if (desc) return _("経験値を徐々に復活し、減少した能力値を回復させる。", "Restores experience and status.");
9412 msg_print(_("体が元の活力を取り戻し始めた。", "You feel your lost status starting to return."));
9417 int d = (p_ptr->max_exp - p_ptr->exp);
9418 int r = (p_ptr->exp / 20);
9424 p_ptr->exp = p_ptr->max_exp;
9428 /* Check the experience */
9433 for (i = A_STR; i < 6; i ++)
9435 if (p_ptr->stat_cur[i] < p_ptr->stat_max[i])
9437 if (p_ptr->stat_cur[i] < 18)
9438 p_ptr->stat_cur[i]++;
9440 p_ptr->stat_cur[i] += 10;
9442 if (p_ptr->stat_cur[i] > p_ptr->stat_max[i])
9443 p_ptr->stat_cur[i] = p_ptr->stat_max[i];
9445 /* Recalculate bonuses */
9446 p_ptr->update |= (PU_BONUS);
9454 msg_format(_("%sの呪文の詠唱をやめた。", "Finish casting '%^s'."), do_spell(REALM_HEX, HEX_RESTORE, SPELL_NAME));
9455 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_RESTORE);
9456 if (cont) CASTING_HEX_NUM(p_ptr)--;
9457 if (CASTING_HEX_NUM(p_ptr)) p_ptr->action = ACTION_NONE;
9460 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
9461 p_ptr->redraw |= (PR_EXTRA);
9469 if (name) return _("呪力吸収", "Drain curse power");
9470 if (desc) return _("呪われた武器の呪いを吸収して魔力を回復する。", "Drains curse on your weapon and heals SP a little.");
9475 u32b f[TR_FLAG_SIZE];
9478 item_tester_hook = item_tester_hook_cursed;
9479 q = _("どの装備品から吸収しますか?", "Which cursed equipment do you drain mana from?");
9480 s = _("呪われたアイテムを装備していない。", "You have no cursed equipment.");
9482 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
9484 o_ptr = &inventory[item];
9485 object_flags(o_ptr, f);
9487 p_ptr->csp += (p_ptr->lev / 5) + randint1(p_ptr->lev / 5);
9488 if (have_flag(f, TR_TY_CURSE) || (o_ptr->curse_flags & TRC_TY_CURSE)) p_ptr->csp += randint1(5);
9489 if (p_ptr->csp > p_ptr->msp) p_ptr->csp = p_ptr->msp;
9491 if (o_ptr->curse_flags & TRC_PERMA_CURSE)
9495 else if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
9499 msg_print(_("呪いを全て吸い取った。", "Heavy curse vanished away."));
9500 o_ptr->curse_flags = 0L;
9503 else if ((o_ptr->curse_flags & (TRC_CURSED)) && one_in_(3))
9505 msg_print(_("呪いを全て吸い取った。", "Curse vanished away."));
9506 o_ptr->curse_flags = 0L;
9514 if (name) return _("吸血の刃", "Swords to vampires");
9515 if (desc) return _("吸血属性で攻撃する。", "Gives vampiric ability to your weapon.");
9519 msg_print("あなたの武器が血を欲している。");
9521 if (!empty_hands(FALSE))
9522 msg_print("Your weapons want more blood now.");
9524 msg_print("Your weapon wants more blood now.");
9530 msg_print("武器の渇望が消え去った。");
9532 msg_format("Thirsty of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
9538 if (name) return _("朦朧の言葉", "Word of stun");
9539 if (desc) return _("視界内のモンスターを朦朧とさせる。", "Stuns all monsters in your sight.");
9541 if (info) return info_power(power);
9544 stun_monsters(power);
9549 if (name) return _("影移動", "Moving into shadow");
9550 if (desc) return _("モンスターの隣のマスに瞬間移動する。", "Teleports you close to a monster.");
9557 for (i = 0; i < 3; i++)
9559 if (!tgt_pt(&x, &y)) return FALSE;
9563 for (dir = 0; dir < 8; dir++)
9565 int dy = y + ddy_ddd[dir];
9566 int dx = x + ddx_ddd[dir];
9567 if (dir == 5) continue;
9568 if(cave[dy][dx].m_idx) flag = TRUE;
9571 if (!cave_empty_bold(y, x) || (cave[y][x].info & CAVE_ICKY) ||
9572 (distance(y, x, p_ptr->y, p_ptr->x) > plev + 2))
9574 msg_print(_("そこには移動できない。", "Can not teleport to there."));
9580 if (flag && randint0(plev * plev / 2))
9582 teleport_player_to(y, x, 0L);
9586 msg_print(_("おっと!", "Oops!"));
9587 teleport_player(30, 0L);
9595 if (name) return _("反魔法結界", "Anti magic barrier");
9596 if (desc) return _("視界内のモンスターの魔法を阻害するバリアを張る。", "Obstructs all magic spell of monsters in your sight.");
9597 power = plev * 3 / 2;
9598 if (info) return info_power(power);
9601 msg_print(_("魔法を防ぐ呪いをかけた。", "You feel anyone can not cast spells except you."));
9606 if (name) return _("復讐の宣告", "Revenge sentence");
9607 if (desc) return _("数ターン後にそれまで受けたダメージに応じた威力の地獄の劫火の弾を放つ。",
9608 "Fires a ball of hell fire to try revenging after few turns.");
9609 power = HEX_REVENGE_POWER(p_ptr);
9610 if (info) return info_damage(0, 0, power);
9614 int a = 3 - (p_ptr->pspeed - 100) / 10;
9615 r = 1 + randint1(2) + MAX(0, MIN(3, a));
9617 if (HEX_REVENGE_TURN(p_ptr) > 0)
9619 msg_print(_("すでに復讐は宣告済みだ。", "You already pronounced your revenge."));
9623 HEX_REVENGE_TYPE(p_ptr) = 2;
9624 HEX_REVENGE_TURN(p_ptr) = r;
9625 msg_format(_("あなたは復讐を宣告した。あと %d ターン。", "You pronounce your revenge. %d turns left."), r);
9630 HEX_REVENGE_TURN(p_ptr)--;
9632 if (HEX_REVENGE_TURN(p_ptr) <= 0)
9642 msg_print(_("復讐の時だ!", "Time to revenge!"));
9644 while (!get_aim_dir(&dir));
9646 fire_ball(GF_HELL_FIRE, dir, power, 1);
9650 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
9655 msg_print(_("復讐する気が失せた。", "You are not a mood to revenge."));
9657 HEX_REVENGE_POWER(p_ptr) = 0;
9664 if ((cast) && (add))
9667 CASTING_HEX_FLAGS(p_ptr) |= 1L << (spell);
9668 CASTING_HEX_NUM(p_ptr)++;
9670 if (p_ptr->action != ACTION_SPELL) set_action(ACTION_SPELL);
9676 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
9677 p_ptr->redraw |= (PR_EXTRA | PR_HP | PR_MANA);
9685 * @brief 魔法処理のメインルーチン
9686 * @param realm 魔法領域のID
9687 * @param spell 各領域の魔法ID
9689 * @return 各領域魔法に各種テキストを求めた場合は文字列参照ポインタ、そうでない場合はNULLポインタを返す。
9691 cptr do_spell(REALM_IDX realm, SPELL_IDX spell, BIT_FLAGS mode)
9695 case REALM_LIFE: return do_life_spell(spell, mode);
9696 case REALM_SORCERY: return do_sorcery_spell(spell, mode);
9697 case REALM_NATURE: return do_nature_spell(spell, mode);
9698 case REALM_CHAOS: return do_chaos_spell(spell, mode);
9699 case REALM_DEATH: return do_death_spell(spell, mode);
9700 case REALM_TRUMP: return do_trump_spell(spell, mode);
9701 case REALM_ARCANE: return do_arcane_spell(spell, mode);
9702 case REALM_CRAFT: return do_craft_spell(spell, mode);
9703 case REALM_DAEMON: return do_daemon_spell(spell, mode);
9704 case REALM_CRUSADE: return do_crusade_spell(spell, mode);
9705 case REALM_MUSIC: return do_music_spell(spell, mode);
9706 case REALM_HISSATSU: return do_hissatsu_spell(spell, mode);
9707 case REALM_HEX: return do_hex_spell(spell, mode);