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(int range)
67 return format(_("範囲:%d", "range %d"), range);
71 * @brief 魔法による回復量を出力する / Generate heal info string such as "heal 2d8"
75 * @return フォーマットに従い整形された文字列
77 static cptr info_heal(int dice, int sides, int base)
79 return info_string_dice(_("回復:", "heal "), dice, sides, base);
83 * @brief 魔法効果発動までの遅延ターンを出力する / Generate delay info string such as "delay 15+1d15"
86 * @return フォーマットに従い整形された文字列
88 static cptr info_delay(int base, int sides)
90 return format(_("遅延:%d+1d%d", "delay %d+1d%d"), base, sides);
95 * @brief 魔法によるダメージを出力する(固定値&複数回処理) / Generate multiple-damage info string such as "dam 25 each"
97 * @return フォーマットに従い整形された文字列
99 static cptr info_multi_damage(int dam)
101 return format(_("損傷:各%d", "dam %d each"), dam);
106 * @brief 魔法によるダメージを出力する(ダイスのみ&複数回処理) / Generate multiple-damage-dice info string such as "dam 5d2 each"
109 * @return フォーマットに従い整形された文字列
111 static cptr info_multi_damage_dice(int dice, int sides)
113 return format(_("損傷:各%dd%d", "dam %dd%d each"), dice, sides);
117 * @brief 魔法による一般的な効力値を出力する(固定値) / Generate power info string such as "power 100"
119 * @return フォーマットに従い整形された文字列
121 static cptr info_power(int power)
123 return format(_("効力:%d", "power %d"), power);
128 * @brief 魔法による一般的な効力値を出力する(ダイス値) / Generate power info string such as "power 100"
131 * @return フォーマットに従い整形された文字列
134 * Generate power info string such as "power 1d100"
136 static cptr info_power_dice(int dice, int sides)
138 return format(_("効力:%dd%d", "power %dd%d"), dice, sides);
143 * @brief 魔法の効果半径を出力する / Generate radius info string such as "rad 100"
145 * @return フォーマットに従い整形された文字列
147 static cptr info_radius(int rad)
149 return format(_("半径:%d", "rad %d"), rad);
154 * @brief 魔法効果の限界重量を出力する / Generate weight info string such as "max wgt 15"
156 * @return フォーマットに従い整形された文字列
158 static cptr info_weight(int weight)
161 return format("最大重量:%d.%dkg", lbtokg1(weight), lbtokg2(weight));
163 return format("max wgt %d", weight/10);
169 * @brief 一部ボルト魔法のビーム化確率を算出する / Prepare standard probability to become beam for fire_bolt_or_beam()
172 * ハードコーティングによる実装が行われている。
173 * メイジは(レベル)%、ハイメイジ、スペルマスターは(レベル)%、それ以外の職業は(レベル/2)%
175 static int beam_chance(void)
177 if (p_ptr->pclass == CLASS_MAGE)
179 if (p_ptr->pclass == CLASS_HIGH_MAGE || p_ptr->pclass == CLASS_SORCERER)
180 return p_ptr->lev + 10;
182 return p_ptr->lev / 2;
186 * @brief トランプ魔法独自の召喚処理を行う / Handle summoning and failure of trump spells
187 * @param num summon_specific()関数を呼び出す回数
188 * @param pet ペット化として召喚されるか否か
193 * @param mode モンスター生成条件フラグ
194 * @return モンスターが(敵対も含めて)召還されたならばTRUEを返す。
196 static bool trump_summoning(int num, bool pet, int y, int x, int lev, int type, u32b mode)
198 int plev = p_ptr->lev;
202 bool success = FALSE;
205 if (!lev) lev = plev * 2 / 3 + randint1(plev / 2);
210 mode |= PM_FORCE_PET;
212 /* Only sometimes allow unique monster */
213 if (mode & PM_ALLOW_UNIQUE)
216 if (randint1(50 + plev) >= plev / 10)
217 mode &= ~PM_ALLOW_UNIQUE;
220 /* Player is who summons */
225 /* Prevent taming, allow unique monster */
228 /* Behave as if they appear by themselfs */
232 for (i = 0; i < num; i++)
234 if (summon_specific(who, y, x, lev, type, mode))
240 msg_print(_("誰もあなたのカードの呼び声に答えない。", "Nobody answers to your Trump call."));
248 * @brief 「ワンダー」のランダムな効果を決定して処理する。
252 * This spell should become more useful (more controlled) as the\n
253 * player gains experience levels. Thus, add 1/5 of the player's\n
254 * level to the die roll. This eliminates the worst effects later on,\n
255 * while keeping the results quite random. It also allows some potent\n
256 * effects only at high level.
258 static void cast_wonder(int dir)
260 int plev = p_ptr->lev;
261 int die = randint1(100) + plev / 5;
262 int vir = virtue_number(V_CHANCE);
266 if (p_ptr->virtues[vir - 1] > 0)
268 while (randint1(400) < p_ptr->virtues[vir - 1]) die++;
272 while (randint1(400) < (0-p_ptr->virtues[vir - 1])) die--;
277 chg_virtue(V_CHANCE, 1);
281 msg_print(_("あなたは力がみなぎるのを感じた!", "You feel a surge of power!"));
284 if (die < 8) clone_monster(dir);
285 else if (die < 14) speed_monster(dir, plev);
286 else if (die < 26) heal_monster(dir, damroll(4, 6));
287 else if (die < 31) poly_monster(dir, plev);
289 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir,
290 damroll(3 + ((plev - 1) / 5), 4));
291 else if (die < 41) confuse_monster(dir, plev);
292 else if (die < 46) fire_ball(GF_POIS, dir, 20 + (plev / 2), 3);
293 else if (die < 51) (void)lite_line(dir, damroll(6, 8));
295 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir,
296 damroll(3 + ((plev - 5) / 4), 8));
298 fire_bolt_or_beam(beam_chance() - 10, GF_COLD, dir,
299 damroll(5 + ((plev - 5) / 4), 8));
301 fire_bolt_or_beam(beam_chance(), GF_ACID, dir,
302 damroll(6 + ((plev - 5) / 4), 8));
304 fire_bolt_or_beam(beam_chance(), GF_FIRE, dir,
305 damroll(8 + ((plev - 5) / 4), 8));
306 else if (die < 76) drain_life(dir, 75);
307 else if (die < 81) fire_ball(GF_ELEC, dir, 30 + plev / 2, 2);
308 else if (die < 86) fire_ball(GF_ACID, dir, 40 + plev, 2);
309 else if (die < 91) fire_ball(GF_ICE, dir, 70 + plev, 3);
310 else if (die < 96) fire_ball(GF_FIRE, dir, 80 + plev, 3);
311 else if (die < 101) drain_life(dir, 100 + plev);
314 earthquake(py, px, 12);
318 (void)destroy_area(py, px, 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, py, px, dun_level, SUMMON_UNDEAD, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
374 chg_virtue(V_UNLIFE, 1);
378 msg_print(_("名状し難い邪悪な存在があなたの心を通り過ぎて行った...", "An unnamable evil brushes against your mind..."));
380 set_afraid(p_ptr->afraid + randint1(4) + 4);
384 msg_print(_("あなたの頭に大量の幽霊たちの騒々しい声が押し寄せてきた...",
385 "Your head is invaded by a horde of gibbering spectral voices..."));
387 set_confused(p_ptr->confused + randint1(4) + 4);
391 poly_monster(dir, plev);
395 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir,
396 damroll(3 + ((plev - 1) / 5), 4));
400 confuse_monster (dir, plev);
404 fire_ball(GF_POIS, dir, 20 + (plev / 2), 3);
408 (void)lite_line(dir, damroll(6, 8));
412 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir,
413 damroll(3+((plev-5)/4),8));
417 fire_bolt_or_beam(beam_chance() - 10, GF_COLD, dir,
418 damroll(5+((plev-5)/4),8));
422 fire_bolt_or_beam(beam_chance(), GF_ACID, dir,
423 damroll(6+((plev-5)/4),8));
427 fire_bolt_or_beam(beam_chance(), GF_FIRE, dir,
428 damroll(8+((plev-5)/4),8));
436 fire_ball(GF_ELEC, dir, 30 + plev / 2, 2);
440 fire_ball(GF_ACID, dir, 40 + plev, 2);
444 fire_ball(GF_ICE, dir, 70 + plev, 3);
448 fire_ball(GF_FIRE, dir, 80 + plev, 3);
452 drain_life(dir, 100 + plev);
456 earthquake(py, px, 12);
460 (void)destroy_area(py, px, 13 + randint0(5), FALSE);
464 symbol_genocide(plev+50, TRUE);
468 dispel_monsters(120);
472 dispel_monsters(150);
474 sleep_monsters(plev);
480 msg_print(_("陰欝な声がクスクス笑う。「もうすぐおまえは我々の仲間になるだろう。弱き者よ。」",
481 "Sepulchral voices chuckle. 'Soon you will join us, mortal.'"));
486 * @brief カオス的効果あるいは及びシャッフルの「運命の輪」効果を引数基準に処理する。
487 * @param spell 基準となる引数ID
490 static void wild_magic(int spell)
493 int type = SUMMON_MOLD + randint0(6);
495 if (type < SUMMON_MOLD) type = SUMMON_MOLD;
496 else if (type > SUMMON_MIMIC) type = SUMMON_MIMIC;
498 switch (randint1(spell) + randint1(8) + 1)
503 teleport_player(10, TELEPORT_PASSIVE);
508 teleport_player(100, TELEPORT_PASSIVE);
512 teleport_player(200, TELEPORT_PASSIVE);
522 lite_area(damroll(2, 3), 2);
525 destroy_doors_touch();
530 sleep_monsters_touch();
534 trap_creation(py, px);
543 aggravate_monsters(0);
546 earthquake(py, px, 5);
550 (void)gain_random_mutation(0);
560 fire_ball(GF_CHAOS, 0, spell + 5, 1 + (spell / 10));
567 while (counter++ < 8)
569 (void)summon_specific(0, py, px, (dun_level * 3) / 2, type, (PM_ALLOW_GROUP | PM_NO_PET));
574 activate_hi_summon(py, px, FALSE);
577 (void)summon_cyber(-1, py, px);
582 (void)activate_ty_curse(FALSE, &count);
589 * @brief トランプ領域の「シャッフル」の効果をランダムに決めて処理する。
592 static void cast_shuffle(void)
594 int plev = p_ptr->lev;
597 int vir = virtue_number(V_CHANCE);
600 /* Card sharks and high mages get a level bonus */
601 if ((p_ptr->pclass == CLASS_ROGUE) ||
602 (p_ptr->pclass == CLASS_HIGH_MAGE) ||
603 (p_ptr->pclass == CLASS_SORCERER))
604 die = (randint1(110)) + plev / 5;
611 if (p_ptr->virtues[vir - 1] > 0)
613 while (randint1(400) < p_ptr->virtues[vir - 1]) die++;
617 while (randint1(400) < (0-p_ptr->virtues[vir - 1])) die--;
621 msg_print(_("あなたはカードを切って一枚引いた...", "You shuffle the deck and draw a card..."));
624 chg_virtue(V_CHANCE, 1);
628 msg_print(_("なんてこった!《死》だ!", "Oh no! It's Death!"));
630 for (i = 0; i < randint1(3); i++)
631 activate_hi_summon(py, px, FALSE);
635 msg_print(_("なんてこった!《悪魔》だ!", "Oh no! It's the Devil!"));
636 summon_specific(0, py, px, dun_level, SUMMON_DEMON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
641 msg_print(_("なんてこった!《吊られた男》だ!", "Oh no! It's the Hanged Man."));
642 activate_ty_curse(FALSE, &count);
646 msg_print(_("《不調和の剣》だ。", "It's the swords of discord."));
647 aggravate_monsters(0);
651 msg_print(_("《愚者》だ。", "It's the Fool."));
657 msg_print(_("奇妙なモンスターの絵だ。", "It's the picture of a strange monster."));
658 trump_summoning(1, FALSE, py, px, (dun_level * 3 / 2), (32 + randint1(6)), PM_ALLOW_GROUP | PM_ALLOW_UNIQUE);
662 msg_print(_("《月》だ。", "It's the Moon."));
667 msg_print(_("《運命の輪》だ。", "It's the Wheel of Fortune."));
668 wild_magic(randint0(32));
672 msg_print(_("テレポート・カードだ。", "It's a teleport trump card."));
673 teleport_player(10, TELEPORT_PASSIVE);
677 msg_print(_("《正義》だ。", "It's Justice."));
678 set_blessed(p_ptr->lev, FALSE);
682 msg_print(_("テレポート・カードだ。", "It's a teleport trump card."));
683 teleport_player(100, TELEPORT_PASSIVE);
687 msg_print(_("テレポート・カードだ。", "It's a teleport trump card."));
688 teleport_player(200, TELEPORT_PASSIVE);
692 msg_print(_("《塔》だ。", "It's the Tower."));
697 msg_print(_("《節制》だ。", "It's Temperance."));
698 sleep_monsters_touch();
702 msg_print(_("《塔》だ。", "It's the Tower."));
704 earthquake(py, px, 5);
708 msg_print(_("友好的なモンスターの絵だ。", "It's the picture of a friendly monster."));
709 trump_summoning(1, TRUE, py, px, (dun_level * 3 / 2), SUMMON_MOLD, 0L);
713 msg_print(_("友好的なモンスターの絵だ。", "It's the picture of a friendly monster."));
714 trump_summoning(1, TRUE, py, px, (dun_level * 3 / 2), SUMMON_BAT, 0L);
718 msg_print(_("友好的なモンスターの絵だ。", "It's the picture of a friendly monster."));
719 trump_summoning(1, TRUE, py, px, (dun_level * 3 / 2), SUMMON_VORTEX, 0L);
723 msg_print(_("友好的なモンスターの絵だ。", "It's the picture of a friendly monster."));
724 trump_summoning(1, TRUE, py, px, (dun_level * 3 / 2), SUMMON_COIN_MIMIC, 0L);
728 msg_print(_("《恋人》だ。", "It's the Lovers."));
730 if (get_aim_dir(&dir))
731 charm_monster(dir, MIN(p_ptr->lev, 20));
735 msg_print(_("《隠者》だ。", "It's the Hermit."));
740 msg_print(_("《審判》だ。", "It's the Judgement."));
741 do_cmd_rerate(FALSE);
742 if (p_ptr->muta1 || p_ptr->muta2 || p_ptr->muta3)
744 msg_print(_("全ての突然変異が治った。", "You are cured of all mutations."));
745 p_ptr->muta1 = p_ptr->muta2 = p_ptr->muta3 = 0;
746 p_ptr->update |= PU_BONUS;
752 msg_print(_("《太陽》だ。", "It's the Sun."));
753 chg_virtue(V_KNOWLEDGE, 1);
754 chg_virtue(V_ENLIGHTEN, 1);
759 msg_print(_("《世界》だ。", "It's the World."));
760 if (p_ptr->exp < PY_MAX_EXP)
762 s32b ee = (p_ptr->exp / 25) + 1;
763 if (ee > 5000) ee = 5000;
764 msg_print(_("更に経験を積んだような気がする。", "You feel more experienced."));
771 * @brief カオス魔法「流星群」の処理としてプレイヤーを中心に隕石落下処理を10+1d10回繰り返す。
772 * / Drop 10+1d10 meteor ball at random places near the player
777 static void cast_meteor(int dam, int rad)
780 int b = 10 + randint1(10);
782 for (i = 0; i < b; i++)
787 for (count = 0; count <= 20; count++)
791 x = px - 8 + randint0(17);
792 y = py - 8 + randint0(17);
794 dx = (px > x) ? (px - x) : (x - px);
795 dy = (py > y) ? (py - y) : (y - py);
797 /* Approximate distance */
798 d = (dy > dx) ? (dy + (dx >> 1)) : (dx + (dy >> 1));
800 if (d >= 9) continue;
802 if (!in_bounds(y, x) || !projectable(py, px, y, x)
803 || !cave_have_flag_bold(y, x, FF_PROJECT)) continue;
809 if (count > 20) continue;
811 project(0, rad, y, x, dam, GF_METEOR, PROJECT_KILL | PROJECT_JUMP | PROJECT_ITEM, -1);
817 * @brief 破邪魔法「神の怒り」の処理としてターゲットを指定した後分解のボールを最大20回発生させる。
820 * @return ターゲットを指定し、実行したならばTRUEを返す。
822 static bool cast_wrath_of_the_god(int dam, int rad)
827 int b = 10 + randint1(10);
829 if (!get_aim_dir(&dir)) return FALSE;
831 /* Use the given direction */
832 tx = px + 99 * ddx[dir];
833 ty = py + 99 * ddy[dir];
835 /* Hack -- Use an actual "target" */
836 if ((dir == 5) && target_okay())
847 /* Hack -- Stop at the target */
848 if ((y == ty) && (x == tx)) break;
852 mmove2(&ny, &nx, py, px, ty, tx);
854 /* Stop at maximum range */
855 if (MAX_RANGE <= distance(py, px, ny, nx)) break;
857 /* Stopped by walls/doors */
858 if (!cave_have_flag_bold(ny, nx, FF_PROJECT)) break;
860 /* Stopped by monsters */
861 if ((dir != 5) && cave[ny][nx].m_idx != 0) break;
863 /* Save the new location */
870 for (i = 0; i < b; i++)
872 int count = 20, d = 0;
878 x = tx - 5 + randint0(11);
879 y = ty - 5 + randint0(11);
881 dx = (tx > x) ? (tx - x) : (x - tx);
882 dy = (ty > y) ? (ty - y) : (y - ty);
884 /* Approximate distance */
885 d = (dy > dx) ? (dy + (dx >> 1)) : (dx + (dy >> 1));
886 /* Within the radius */
890 if (count < 0) continue;
892 /* Cannot penetrate perm walls */
893 if (!in_bounds(y,x) ||
894 cave_stop_disintegration(y,x) ||
895 !in_disintegration_range(ty, tx, y, x))
898 project(0, rad, y, x, dam, GF_DISINTEGRATE, PROJECT_JUMP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL, -1);
905 * @brief 悪魔領域のグレーターデーモン召喚に利用可能な死体かどうかを返す。 / An "item_tester_hook" for offer
906 * @param o_ptr オブジェクト構造体の参照ポインタ
907 * @return 生贄に使用可能な死体ならばTRUEを返す。
909 static bool item_tester_offer(object_type *o_ptr)
911 /* Flasks of oil are okay */
912 if (o_ptr->tval != TV_CORPSE) return (FALSE);
914 if (o_ptr->sval != SV_CORPSE) return (FALSE);
916 if (my_strchr("pht", r_info[o_ptr->pval].d_char)) return (TRUE);
918 /* Assume not okay */
923 * @brief 悪魔領域のグレーターデーモン召喚を処理する / Daemon spell Summon Greater Demon
924 * @return 処理を実行したならばTRUEを返す。
926 static bool cast_summon_greater_demon(void)
928 int plev = p_ptr->lev;
934 item_tester_hook = item_tester_offer;
935 q = _("どの死体を捧げますか? ", "Sacrifice which corpse? ");
936 s = _("捧げられる死体を持っていない。", "You have nothing to scrifice.");
937 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return FALSE;
939 /* Get the item (in the pack) */
942 o_ptr = &inventory[item];
945 /* Get the item (on the floor) */
948 o_ptr = &o_list[0 - item];
951 summon_lev = plev * 2 / 3 + r_info[o_ptr->pval].level;
953 if (summon_specific(-1, py, px, summon_lev, SUMMON_HI_DEMON, (PM_ALLOW_GROUP | PM_FORCE_PET)))
955 msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));
956 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
958 /* Decrease the item (from the pack) */
961 inven_item_increase(item, -1);
962 inven_item_describe(item);
963 inven_item_optimize(item);
966 /* Decrease the item (from the floor) */
969 floor_item_increase(0 - item, -1);
970 floor_item_describe(0 - item);
971 floor_item_optimize(0 - item);
976 msg_print(_("悪魔は現れなかった。", "No Greater Demon arrive."));
983 * @brief 歌の開始を処理する / Start singing if the player is a Bard
984 * @param spell 領域魔法としてのID
985 * @param song 魔法効果のID
988 static void start_singing(int spell, int song)
990 /* Remember the song index */
991 p_ptr->magic_num1[0] = song;
993 /* Remember the index of the spell which activated the song */
994 p_ptr->magic_num2[0] = spell;
997 /* Now the player is singing */
998 set_action(ACTION_SING);
1001 /* Recalculate bonuses */
1002 p_ptr->update |= (PU_BONUS);
1004 /* Redraw status bar */
1005 p_ptr->redraw |= (PR_STATUS);
1009 * @brief 歌の停止を処理する / Stop singing if the player is a Bard
1012 void stop_singing(void)
1014 if (p_ptr->pclass != CLASS_BARD) return;
1016 /* Are there interupted song? */
1017 if (p_ptr->magic_num1[1])
1019 /* Forget interupted song */
1020 p_ptr->magic_num1[1] = 0;
1024 /* The player is singing? */
1025 if (!p_ptr->magic_num1[0]) return;
1027 /* Hack -- if called from set_action(), avoid recursive loop */
1028 if (p_ptr->action == ACTION_SING) set_action(ACTION_NONE);
1030 /* Message text of each song or etc. */
1031 do_spell(REALM_MUSIC, p_ptr->magic_num2[0], SPELL_STOP);
1033 p_ptr->magic_num1[0] = MUSIC_NONE;
1034 p_ptr->magic_num2[0] = 0;
1036 /* Recalculate bonuses */
1037 p_ptr->update |= (PU_BONUS);
1039 /* Redraw status bar */
1040 p_ptr->redraw |= (PR_STATUS);
1045 * @brief 生命領域魔法の各処理を行う
1047 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
1048 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
1050 static cptr do_life_spell(int spell, int mode)
1052 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
1053 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
1054 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
1055 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
1058 int plev = p_ptr->lev;
1063 if (name) return _("軽傷の治癒", "Cure Light Wounds");
1064 if (desc) return _("怪我と体力を少し回復させる。", "Heals cut and HP a little.");
1069 if (info) return info_heal(dice, sides, 0);
1073 hp_player(damroll(dice, sides));
1074 set_cut(p_ptr->cut - 10);
1080 if (name) return _("祝福", "Bless");
1081 if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
1085 if (info) return info_duration(base, base);
1089 set_blessed(randint1(base) + base, FALSE);
1095 if (name) return _("軽傷", "Cause Light Wounds");
1096 if (desc) return _("1体のモンスターに小ダメージを与える。抵抗されると無効。", "Wounds a monster a little unless resisted.");
1098 int dice = 3 + (plev - 1) / 5;
1101 if (info) return info_damage(dice, sides, 0);
1105 if (!get_aim_dir(&dir)) return NULL;
1106 fire_ball_hide(GF_WOUNDS, dir, damroll(dice, sides), 0);
1112 if (name) return _("光の召喚", "Call Light");
1113 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
1116 int sides = plev / 2;
1117 int rad = plev / 10 + 1;
1119 if (info) return info_damage(dice, sides, 0);
1123 lite_area(damroll(dice, sides), rad);
1129 if (name) return _("罠 & 隠し扉感知", "Detect Doors & Traps");
1130 if (desc) return _("近くの全ての罠と扉と階段を感知する。", "Detects traps, doors, and stairs in your vicinity.");
1132 int rad = DETECT_RAD_DEFAULT;
1134 if (info) return info_radius(rad);
1138 detect_traps(rad, TRUE);
1146 if (name) return _("重傷の治癒", "Cure Medium Wounds");
1147 if (desc) return _("怪我と体力を中程度回復させる。", "Heals cut and HP more.");
1152 if (info) return info_heal(dice, sides, 0);
1156 hp_player(damroll(dice, sides));
1157 set_cut((p_ptr->cut / 2) - 20);
1163 if (name) return _("解毒", "Cure Poison");
1164 if (desc) return _("体内の毒を取り除く。", "Cure poison status.");
1174 if (name) return _("空腹充足", "Satisfy Hunger");
1175 if (desc) return _("満腹にする。", "Satisfies hunger.");
1179 set_food(PY_FOOD_MAX - 1);
1185 if (name) return _("解呪", "Remove Curse");
1186 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
1192 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
1199 if (name) return _("重傷", "Cause Medium Wounds");
1200 if (desc) return _("1体のモンスターに中ダメージを与える。抵抗されると無効。", "Wounds a monster unless resisted.");
1202 int sides = 8 + (plev - 5) / 4;
1205 if (info) return info_damage(dice, sides, 0);
1209 if (!get_aim_dir(&dir)) return NULL;
1210 fire_ball_hide(GF_WOUNDS, dir, damroll(sides, dice), 0);
1216 if (name) return _("致命傷の治癒", "Cure Critical Wounds");
1217 if (desc) return _("体力を大幅に回復させ、負傷と朦朧状態も全快する。", "Heals cut, stun and HP greatly.");
1222 if (info) return info_heal(dice, sides, 0);
1226 hp_player(damroll(dice, sides));
1234 if (name) return _("耐熱耐寒", "Resist Heat and Cold");
1235 if (desc) return _("一定時間、火炎と冷気に対する耐性を得る。装備による耐性に累積する。",
1236 "Gives resistance to fire and cold. These resistances can be added to which from equipment for more powerful resistances.");
1241 if (info) return info_duration(base, base);
1245 set_oppose_cold(randint1(base) + base, FALSE);
1246 set_oppose_fire(randint1(base) + base, FALSE);
1252 if (name) return _("周辺感知", "Sense Surroundings");
1253 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
1256 int rad = DETECT_RAD_MAP;
1258 if (info) return info_radius(rad);
1268 if (name) return _("パニック・アンデッド", "Turn Undead");
1269 if (desc) return _("視界内のアンデッドを恐怖させる。抵抗されると無効。", "Attempts to scare undead monsters in sight.");
1280 if (name) return _("体力回復", "Healing");
1281 if (desc) return _("極めて強力な回復呪文で、負傷と朦朧状態も全快する。", "Much powerful healing magic, and heals cut and stun completely.");
1286 if (info) return info_heal(0, 0, heal);
1298 if (name) return _("結界の紋章", "Glyph of Warding");
1299 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。",
1300 "Sets a glyph on the floor beneath you. Monsters cannot attack you if you are on a glyph, but can try to break glyph.");
1311 if (name) return _("*解呪*", "Dispel Curse");
1312 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
1317 if (remove_all_curse())
1319 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
1326 if (name) return _("鑑識", "Perception");
1327 if (desc) return _("アイテムを識別する。", "Identifies an item.");
1332 if (!ident_spell(FALSE)) return NULL;
1338 if (name) return _("アンデッド退散", "Dispel Undead");
1339 if (desc) return _("視界内の全てのアンデッドにダメージを与える。", "Damages all undead monsters in sight.");
1343 int sides = plev * 5;
1345 if (info) return info_damage(dice, sides, 0);
1349 dispel_undead(damroll(dice, sides));
1355 if (name) return _("凪の刻", "Day of the Dove");
1356 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
1359 int power = plev * 2;
1361 if (info) return info_power(power);
1365 charm_monsters(power);
1371 if (name) return _("致命傷", "Cause Critical Wounds");
1372 if (desc) return _("1体のモンスターに大ダメージを与える。抵抗されると無効。", "Wounds a monster critically unless resisted.");
1375 int dice = 5 + (plev - 5) / 3;
1378 if (info) return info_damage(dice, sides, 0);
1382 if (!get_aim_dir(&dir)) return NULL;
1383 fire_ball_hide(GF_WOUNDS, dir, damroll(dice, sides), 0);
1389 if (name) return _("帰還の詔", "Word of Recall");
1390 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。", "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
1396 if (info) return info_delay(base, sides);
1400 if (!word_of_recall()) return NULL;
1406 if (name) return _("真実の祭壇", "Alter Reality");
1407 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
1413 if (info) return info_delay(base, sides);
1423 if (name) return _("真・結界", "Warding True");
1424 if (desc) return _("自分のいる床と周囲8マスの床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。", "Creates glyphs in all adjacent squares and under you.");
1429 if (info) return info_radius(rad);
1440 if (name) return _("不毛化", "Sterilization");
1441 if (desc) return _("この階の増殖するモンスターが増殖できなくなる。", "Prevents any breeders on current level from breeding.");
1446 num_repro += MAX_REPRO;
1452 if (name) return _("全感知", "Detection");
1453 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。", "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
1456 int rad = DETECT_RAD_DEFAULT;
1458 if (info) return info_radius(rad);
1468 if (name) return _("アンデッド消滅", "Annihilate Undead");
1469 if (desc) return _("自分の周囲にいるアンデッドを現在の階から消し去る。抵抗されると無効。",
1470 "Eliminates all nearby undead monsters, exhausting you. Powerful or unique monsters may be able to resist.");
1473 int power = plev + 50;
1475 if (info) return info_power(power);
1479 mass_genocide_undead(power, TRUE);
1485 if (name) return _("千里眼", "Clairvoyance");
1486 if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。", "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");
1497 if (name) return _("全復活", "Restoration");
1498 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
1515 if (name) return _("*体力回復*", "Healing True");
1516 if (desc) return _("最強の治癒の魔法で、負傷と朦朧状態も全快する。", "The greatest healing magic. Heals all HP, cut and stun.");
1521 if (info) return info_heal(0, 0, heal);
1533 if (name) return _("聖なるビジョン", "Holy Vision");
1534 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
1539 if (!identify_fully(FALSE)) return NULL;
1545 if (name) return _("究極の耐性", "Ultimate Resistance");
1546 if (desc) return _("一定時間、あらゆる耐性を付け、ACと魔法防御能力を上昇させる。", "Gives ultimate resistance, bonus to AC and speed.");
1549 int base = plev / 2;
1551 if (info) return info_duration(base, base);
1555 int v = randint1(base) + base;
1557 set_oppose_acid(v, FALSE);
1558 set_oppose_elec(v, FALSE);
1559 set_oppose_fire(v, FALSE);
1560 set_oppose_cold(v, FALSE);
1561 set_oppose_pois(v, FALSE);
1562 set_ultimate_res(v, FALSE);
1572 * @brief 仙術領域魔法の各処理を行う
1574 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
1575 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
1577 static cptr do_sorcery_spell(int spell, int mode)
1579 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
1580 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
1581 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
1582 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
1585 int plev = p_ptr->lev;
1590 if (name) return _("モンスター感知", "Detect Monsters");
1591 if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
1594 int rad = DETECT_RAD_DEFAULT;
1596 if (info) return info_radius(rad);
1600 detect_monsters_normal(rad);
1606 if (name) return _("ショート・テレポート", "Phase Door");
1607 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");
1612 if (info) return info_range(range);
1616 teleport_player(range, 0L);
1622 if (name) return _("罠と扉感知", "Detect Doors and Traps");
1623 if (desc) return _("近くの全ての扉と罠を感知する。", "Detects traps, doors, and stairs in your vicinity.");
1626 int rad = DETECT_RAD_DEFAULT;
1628 if (info) return info_radius(rad);
1632 detect_traps(rad, TRUE);
1640 if (name) return _("ライト・エリア", "Light Area");
1641 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
1645 int sides = plev / 2;
1646 int rad = plev / 10 + 1;
1648 if (info) return info_damage(dice, sides, 0);
1652 lite_area(damroll(dice, sides), rad);
1658 if (name) return _("パニック・モンスター", "Confuse Monster");
1659 if (desc) return _("モンスター1体を混乱させる。抵抗されると無効。", "Attempts to confuse a monster.");
1662 int power = (plev * 3) / 2;
1664 if (info) return info_power(power);
1668 if (!get_aim_dir(&dir)) return NULL;
1670 confuse_monster(dir, power);
1676 if (name) return _("テレポート", "Teleport");
1677 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
1680 int range = plev * 5;
1682 if (info) return info_range(range);
1686 teleport_player(range, 0L);
1692 if (name) return _("スリープ・モンスター", "Sleep Monster");
1693 if (desc) return _("モンスター1体を眠らせる。抵抗されると無効。", "Attempts to sleep a monster.");
1698 if (info) return info_power(power);
1702 if (!get_aim_dir(&dir)) return NULL;
1704 sleep_monster(dir, plev);
1710 if (name) return _("魔力充填", "Recharging");
1711 if (desc) return _("杖/魔法棒の充填回数を増やすか、充填中のロッドの充填時間を減らす。", "Recharges staffs, wands or rods.");
1714 int power = plev * 4;
1716 if (info) return info_power(power);
1720 if (!recharge(power)) return NULL;
1726 if (name) return _("魔法の地図", "Magic Mapping");
1727 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
1730 int rad = DETECT_RAD_MAP;
1732 if (info) return info_radius(rad);
1742 if (name) return _("鑑定", "Identify");
1743 if (desc) return _("アイテムを識別する。", "Identifies an item.");
1748 if (!ident_spell(FALSE)) return NULL;
1754 if (name) return _("スロウ・モンスター", "Slow Monster");
1755 if (desc) return _("モンスター1体を減速さる。抵抗されると無効。", "Attempts to slow a monster.");
1760 if (info) return info_power(power);
1764 if (!get_aim_dir(&dir)) return NULL;
1766 slow_monster(dir, plev);
1772 if (name) return _("周辺スリープ", "Mass Sleep");
1773 if (desc) return _("視界内の全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep all monsters in sight.");
1778 if (info) return info_power(power);
1782 sleep_monsters(plev);
1788 if (name) return _("テレポート・モンスター", "Teleport Away");
1789 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
1794 if (info) return info_power(power);
1798 if (!get_aim_dir(&dir)) return NULL;
1800 fire_beam(GF_AWAY_ALL, dir, power);
1806 if (name) return _("スピード", "Haste Self");
1807 if (desc) return _("一定時間、加速する。", "Hastes you for a while.");
1811 int sides = 20 + plev;
1813 if (info) return info_duration(base, sides);
1817 set_fast(randint1(sides) + base, FALSE);
1823 if (name) return _("真・感知", "Detection True");
1824 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
1825 "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
1828 int rad = DETECT_RAD_DEFAULT;
1830 if (info) return info_radius(rad);
1840 if (name) return _("真・鑑定", "Identify True");
1841 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
1846 if (!identify_fully(FALSE)) return NULL;
1852 if (name) return _("物体と財宝感知", "Detect items and Treasure");
1853 if (desc) return _("近くの全てのアイテムと財宝を感知する。", "Detects all treasures and items in your vicinity.");
1856 int rad = DETECT_RAD_DEFAULT;
1858 if (info) return info_radius(rad);
1862 detect_objects_normal(rad);
1863 detect_treasure(rad);
1864 detect_objects_gold(rad);
1870 if (name) return _("チャーム・モンスター", "Charm Monster");
1871 if (desc) return _("モンスター1体を魅了する。抵抗されると無効。", "Attempts to charm a monster.");
1876 if (info) return info_power(power);
1880 if (!get_aim_dir(&dir)) return NULL;
1882 charm_monster(dir, power);
1888 if (name) return _("精神感知", "Sense Minds");
1889 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
1895 if (info) return info_duration(base, sides);
1899 set_tim_esp(randint1(sides) + base, FALSE);
1905 if (name) return _("街移動", "Teleport to town");
1906 if (desc) return _("街へ移動する。地上にいるときしか使えない。", "Teleport to a town which you choose in a moment. Can only be used outdoors.");
1911 if (!tele_town()) return NULL;
1917 if (name) return _("自己分析", "Self Knowledge");
1918 if (desc) return _("現在の自分の状態を完全に知る。",
1919 "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");
1930 if (name) return _("テレポート・レベル", "Teleport Level");
1931 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");
1936 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
1943 if (name) return _("帰還の呪文", "Word of Recall");
1944 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
1945 "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
1951 if (info) return info_delay(base, sides);
1955 if (!word_of_recall()) return NULL;
1961 if (name) return _("次元の扉", "Dimension Door");
1962 if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleport to given location.");
1965 int range = plev / 2 + 10;
1967 if (info) return info_range(range);
1971 msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));
1972 if (!dimension_door()) return NULL;
1978 if (name) return _("調査", "Probing");
1979 if (desc) return _("モンスターの属性、残り体力、最大体力、スピード、正体を知る。",
1980 "Proves all monsters' alignment, HP, speed and their true character.");
1991 if (name) return _("爆発のルーン", "Explosive Rune");
1992 if (desc) return _("自分のいる床の上に、モンスターが通ると爆発してダメージを与えるルーンを描く。",
1993 "Sets a glyph under you. The glyph will explode when a monster moves on it.");
2000 if (info) return info_damage(dice, sides, base);
2010 if (name) return _("念動力", "Telekinesis");
2011 if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");
2014 int weight = plev * 15;
2016 if (info) return info_weight(weight);
2020 if (!get_aim_dir(&dir)) return NULL;
2022 fetch(dir, weight, FALSE);
2028 if (name) return _("千里眼", "Clairvoyance");
2029 if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。さらに、一定時間テレパシー能力を得る。",
2030 "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");
2036 if (info) return info_duration(base, sides);
2040 chg_virtue(V_KNOWLEDGE, 1);
2041 chg_virtue(V_ENLIGHTEN, 1);
2045 if (!p_ptr->telepathy)
2047 set_tim_esp(randint1(sides) + base, FALSE);
2054 if (name) return _("魅了の視線", "Charm monsters");
2055 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
2058 int power = plev * 2;
2060 if (info) return info_power(power);
2064 charm_monsters(power);
2070 if (name) return _("錬金術", "Alchemy");
2071 if (desc) return _("アイテム1つをお金に変える。", "Turns an item into 1/3 of its value in gold.");
2076 if (!alchemy()) return NULL;
2082 if (name) return _("怪物追放", "Banishment");
2083 if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");
2086 int power = plev * 4;
2088 if (info) return info_power(power);
2092 banish_monsters(power);
2098 if (name) return _("無傷の球", "Globe of Invulnerability");
2099 if (desc) return _("一定時間、ダメージを受けなくなるバリアを張る。切れた瞬間に少しターンを消費するので注意。",
2100 "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks or duration time is exceeded.");
2105 if (info) return info_duration(base, base);
2109 set_invuln(randint1(base) + base, FALSE);
2120 * @brief 自然領域魔法の各処理を行う
2122 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
2123 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
2125 static cptr do_nature_spell(int spell, int mode)
2127 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
2128 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
2129 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
2130 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
2132 static const char s_dam[] = _("損傷:", "dam ");
2133 static const char s_rng[] = _("射程", "rng ");
2136 int plev = p_ptr->lev;
2141 if (name) return _("モンスター感知", "Detect Creatures");
2142 if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
2145 int rad = DETECT_RAD_DEFAULT;
2147 if (info) return info_radius(rad);
2151 detect_monsters_normal(rad);
2157 if (name) return _("稲妻", "Lightning");
2158 if (desc) return _("電撃の短いビームを放つ。", "Fires a short beam of lightning.");
2161 int dice = 3 + (plev - 1) / 5;
2163 int range = plev / 6 + 2;
2165 if (info) return format("%s%dd%d %s%d", s_dam, dice, sides, s_rng, range);
2169 project_length = range;
2171 if (!get_aim_dir(&dir)) return NULL;
2173 fire_beam(GF_ELEC, dir, damroll(dice, sides));
2179 if (name) return _("罠と扉感知", "Detect Doors and Traps");
2180 if (desc) return _("近くの全ての罠と扉を感知する。", "Detects traps, doors, and stairs in your vicinity.");
2183 int rad = DETECT_RAD_DEFAULT;
2185 if (info) return info_radius(rad);
2189 detect_traps(rad, TRUE);
2197 if (name) return _("食糧生成", "Produce Food");
2198 if (desc) return _("食料を一つ作り出す。", "Produces a Ration of Food.");
2203 object_type forge, *q_ptr = &forge;
2204 msg_print(_("食料を生成した。", "A food ration is produced."));
2206 /* Create the food ration */
2207 object_prep(q_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION));
2209 /* Drop the object from heaven */
2210 drop_near(q_ptr, -1, py, px);
2216 if (name) return _("日の光", "Daylight");
2217 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
2221 int sides = plev / 2;
2222 int rad = (plev / 10) + 1;
2224 if (info) return info_damage(dice, sides, 0);
2228 lite_area(damroll(dice, sides), rad);
2230 if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)
2232 msg_print(_("日の光があなたの肉体を焦がした!", "The daylight scorches your flesh!"));
2233 take_hit(DAMAGE_NOESCAPE, damroll(2, 2), _("日の光", "daylight"), -1);
2240 if (name) return _("動物習し", "Animal Taming");
2241 if (desc) return _("動物1体を魅了する。抵抗されると無効。", "Attempts to charm an animal.");
2246 if (info) return info_power(power);
2250 if (!get_aim_dir(&dir)) return NULL;
2252 charm_animal(dir, power);
2258 if (name) return _("環境への耐性", "Resist Environment");
2259 if (desc) return _("一定時間、冷気、炎、電撃に対する耐性を得る。装備による耐性に累積する。",
2260 "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");
2265 if (info) return info_duration(base, base);
2269 set_oppose_cold(randint1(base) + base, FALSE);
2270 set_oppose_fire(randint1(base) + base, FALSE);
2271 set_oppose_elec(randint1(base) + base, FALSE);
2277 if (name) return _("傷と毒治療", "Cure Wounds & Poison");
2278 if (desc) return _("怪我を全快させ、毒を体から完全に取り除き、体力を少し回復させる。", "Heals all cut and poison status. Heals HP a little.");
2284 if (info) return info_heal(dice, sides, 0);
2288 hp_player(damroll(dice, sides));
2296 if (name) return _("岩石溶解", "Stone to Mud");
2297 if (desc) return _("壁を溶かして床にする。", "Turns one rock square to mud.");
2304 if (info) return info_damage(dice, sides, base);
2308 if (!get_aim_dir(&dir)) return NULL;
2310 wall_to_mud(dir, 20 + randint1(30));
2316 if (name) return _("アイス・ボルト", "Frost Bolt");
2317 if (desc) return _("冷気のボルトもしくはビームを放つ。", "Fires a bolt or beam of cold.");
2320 int dice = 3 + (plev - 5) / 4;
2323 if (info) return info_damage(dice, sides, 0);
2327 if (!get_aim_dir(&dir)) return NULL;
2328 fire_bolt_or_beam(beam_chance() - 10, GF_COLD, dir, damroll(dice, sides));
2334 if (name) return _("自然の覚醒", "Nature Awareness");
2335 if (desc) return _("周辺の地形を感知し、近くの罠、扉、階段、全てのモンスターを感知する。",
2336 "Maps nearby area. Detects all monsters, traps, doors and stairs.");
2339 int rad1 = DETECT_RAD_MAP;
2340 int rad2 = DETECT_RAD_DEFAULT;
2342 if (info) return info_radius(MAX(rad1, rad2));
2347 detect_traps(rad2, TRUE);
2349 detect_stairs(rad2);
2350 detect_monsters_normal(rad2);
2356 if (name) return _("ファイア・ボルト", "Fire Bolt");
2357 if (desc) return _("火炎のボルトもしくはビームを放つ。", "Fires a bolt or beam of fire.");
2360 int dice = 5 + (plev - 5) / 4;
2363 if (info) return info_damage(dice, sides, 0);
2367 if (!get_aim_dir(&dir)) return NULL;
2368 fire_bolt_or_beam(beam_chance() - 10, GF_FIRE, dir, damroll(dice, sides));
2374 if (name) return _("太陽光線", "Ray of Sunlight");
2375 if (desc) return _("光線を放つ。光りを嫌うモンスターに効果がある。", "Fires a beam of light which damages to light-sensitive monsters.");
2381 if (info) return info_damage(dice, sides, 0);
2385 if (!get_aim_dir(&dir)) return NULL;
2386 msg_print(_("太陽光線が現れた。", "A line of sunlight appears."));
2387 lite_line(dir, damroll(6, 8));
2393 if (name) return _("足かせ", "Entangle");
2394 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
2399 if (info) return info_power(power);
2403 slow_monsters(plev);
2409 if (name) return _("動物召喚", "Summon Animal");
2410 if (desc) return _("動物を1体召喚する。", "Summons an animal.");
2415 if (!(summon_specific(-1, py, px, plev, SUMMON_ANIMAL_RANGER, (PM_ALLOW_GROUP | PM_FORCE_PET))))
2417 msg_print(_("動物は現れなかった。", "No animals arrive."));
2425 if (name) return _("薬草治療", "Herbal Healing");
2426 if (desc) return _("体力を大幅に回復させ、負傷、朦朧状態、毒から全快する。", "Heals HP greatly. And heals cut, stun and poison completely.");
2431 if (info) return info_heal(0, 0, heal);
2444 if (name) return _("階段生成", "Stair Building");
2445 if (desc) return _("自分のいる位置に階段を作る。", "Creates a stair which goes down or up.");
2456 if (name) return _("肌石化", "Stone Skin");
2457 if (desc) return _("一定時間、ACを上昇させる。", "Gives bonus to AC for a while.");
2463 if (info) return info_duration(base, sides);
2467 set_shield(randint1(sides) + base, FALSE);
2473 if (name) return _("真・耐性", "Resistance True");
2474 if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
2475 "Gives resistance to fire, cold, electricity, acid and poison for a while. These resistances can be added to which from equipment for more powerful resistances.");
2480 if (info) return info_duration(base, base);
2484 set_oppose_acid(randint1(base) + base, FALSE);
2485 set_oppose_elec(randint1(base) + base, FALSE);
2486 set_oppose_fire(randint1(base) + base, FALSE);
2487 set_oppose_cold(randint1(base) + base, FALSE);
2488 set_oppose_pois(randint1(base) + base, FALSE);
2494 if (name) return _("森林創造", "Forest Creation");
2495 if (desc) return _("周囲に木を作り出す。", "Creates trees in all adjacent squares.");
2506 if (name) return _("動物友和", "Animal Friendship");
2507 if (desc) return _("視界内の全ての動物を魅了する。抵抗されると無効。", "Attempts to charm all animals in sight.");
2510 int power = plev * 2;
2512 if (info) return info_power(power);
2516 charm_animals(power);
2522 if (name) return _("試金石", "Stone Tell");
2523 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
2528 if (!identify_fully(FALSE)) return NULL;
2534 if (name) return _("石の壁", "Wall of Stone");
2535 if (desc) return _("自分の周囲に花崗岩の壁を作る。", "Creates granite walls in all adjacent squares.");
2546 if (name) return _("腐食防止", "Protect from Corrosion");
2547 if (desc) return _("アイテムを酸で傷つかないよう加工する。", "Makes an equipment acid-proof.");
2552 if (!rustproof()) return NULL;
2558 if (name) return _("地震", "Earthquake");
2559 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
2560 "Shakes dungeon structure, and results in random swapping of floors and walls.");
2565 if (info) return info_radius(rad);
2569 earthquake(py, px, rad);
2575 if (name) return _("カマイタチ", "Cyclone");
2576 if (desc) return _("全方向に向かって攻撃する。", "Attacks all adjacent monsters.");
2583 monster_type *m_ptr;
2585 for (dir = 0; dir < 8; dir++)
2587 y = py + ddy_ddd[dir];
2588 x = px + ddx_ddd[dir];
2589 c_ptr = &cave[y][x];
2591 /* Get the monster */
2592 m_ptr = &m_list[c_ptr->m_idx];
2594 /* Hack -- attack monsters */
2595 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
2603 if (name) return _("ブリザード", "Blizzard");
2604 if (desc) return _("巨大な冷気の球を放つ。", "Fires a huge ball of cold.");
2607 int dam = 70 + plev * 3 / 2;
2608 int rad = plev / 12 + 1;
2610 if (info) return info_damage(0, 0, dam);
2614 if (!get_aim_dir(&dir)) return NULL;
2616 fire_ball(GF_COLD, dir, dam, rad);
2622 if (name) return _("稲妻嵐", "Lightning Storm");
2623 if (desc) return _("巨大な電撃の球を放つ。", "Fires a huge electric ball.");
2626 int dam = 90 + plev * 3 / 2;
2627 int rad = plev / 12 + 1;
2629 if (info) return info_damage(0, 0, dam);
2633 if (!get_aim_dir(&dir)) return NULL;
2634 fire_ball(GF_ELEC, dir, dam, rad);
2641 if (name) return _("渦潮", "Whirlpool");
2642 if (desc) return _("巨大な水の球を放つ。", "Fires a huge ball of water.");
2645 int dam = 100 + plev * 3 / 2;
2646 int rad = plev / 12 + 1;
2648 if (info) return info_damage(0, 0, dam);
2652 if (!get_aim_dir(&dir)) return NULL;
2653 fire_ball(GF_WATER, dir, dam, rad);
2659 if (name) return _("陽光召喚", "Call Sunlight");
2660 if (desc) return _("自分を中心とした光の球を発生させる。さらに、その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。",
2661 "Generates ball of light centered on you. Maps and lights whole dungeon level. Knows all objects location.");
2667 if (info) return info_damage(0, 0, dam/2);
2671 fire_ball(GF_LITE, 0, dam, rad);
2672 chg_virtue(V_KNOWLEDGE, 1);
2673 chg_virtue(V_ENLIGHTEN, 1);
2676 if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)
2678 msg_print(_("日光があなたの肉体を焦がした!", "The sunlight scorches your flesh!"));
2679 take_hit(DAMAGE_NOESCAPE, 50, _("日光", "sunlight"), -1);
2686 if (name) return _("精霊の刃", "Elemental Branding");
2687 if (desc) return _("武器に炎か冷気の属性をつける。", "Makes current weapon fire or frost branded.");
2692 brand_weapon(randint0(2));
2698 if (name) return _("自然の脅威", "Nature's Wrath");
2699 if (desc) return _("近くの全てのモンスターにダメージを与え、地震を起こし、自分を中心とした分解の球を発生させる。",
2700 "Damages all monsters in sight. Makes quake. Generates disintegration ball centered on you.");
2703 int d_dam = 4 * plev;
2704 int b_dam = (100 + plev) * 2;
2705 int b_rad = 1 + plev / 12;
2706 int q_rad = 20 + plev / 2;
2708 if (info) return format("%s%d+%d", s_dam, d_dam, b_dam/2);
2712 dispel_monsters(d_dam);
2713 earthquake(py, px, q_rad);
2714 project(0, b_rad, py, px, b_dam, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM, -1);
2725 * @brief カオス領域魔法の各処理を行う
2727 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
2728 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
2730 static cptr do_chaos_spell(int spell, int mode)
2732 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
2733 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
2734 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
2735 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
2737 static const char s_dam[] = _("損傷:", "dam ");
2738 static const char s_random[] = _("ランダム", "random");
2741 int plev = p_ptr->lev;
2746 if (name) return _("マジック・ミサイル", "Magic Missile");
2747 if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");
2750 int dice = 3 + ((plev - 1) / 5);
2753 if (info) return info_damage(dice, sides, 0);
2757 if (!get_aim_dir(&dir)) return NULL;
2759 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));
2765 if (name) return _("トラップ/ドア破壊", "Trap / Door Destruction");
2766 if (desc) return _("隣接する罠と扉を破壊する。", "Destroys all traps in adjacent squares.");
2771 if (info) return info_radius(rad);
2775 destroy_doors_touch();
2781 if (name) return _("閃光", "Flash of Light");
2782 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
2786 int sides = plev / 2;
2787 int rad = (plev / 10) + 1;
2789 if (info) return info_damage(dice, sides, 0);
2793 lite_area(damroll(dice, sides), rad);
2799 if (name) return _("混乱の手", "Touch of Confusion");
2800 if (desc) return _("相手を混乱させる攻撃をできるようにする。", "Attempts to confuse the next monster that you hit.");
2805 if (!(p_ptr->special_attack & ATTACK_CONFUSE))
2807 msg_print(_("あなたの手は光り始めた。", "Your hands start glowing."));
2808 p_ptr->special_attack |= ATTACK_CONFUSE;
2809 p_ptr->redraw |= (PR_STATUS);
2816 if (name) return _("魔力炸裂", "Mana Burst");
2817 if (desc) return _("魔法の球を放つ。", "Fires a ball of magic.");
2822 int rad = (plev < 30) ? 2 : 3;
2825 if (p_ptr->pclass == CLASS_MAGE ||
2826 p_ptr->pclass == CLASS_HIGH_MAGE ||
2827 p_ptr->pclass == CLASS_SORCERER)
2828 base = plev + plev / 2;
2830 base = plev + plev / 4;
2833 if (info) return info_damage(dice, sides, base);
2837 if (!get_aim_dir(&dir)) return NULL;
2839 fire_ball(GF_MISSILE, dir, damroll(dice, sides) + base, rad);
2842 * Shouldn't actually use GF_MANA, as
2843 * it will destroy all items on the
2851 if (name) return _("ファイア・ボルト", "Fire Bolt");
2852 if (desc) return _("炎のボルトもしくはビームを放つ。", "Fires a bolt or beam of fire.");
2855 int dice = 8 + (plev - 5) / 4;
2858 if (info) return info_damage(dice, sides, 0);
2862 if (!get_aim_dir(&dir)) return NULL;
2864 fire_bolt_or_beam(beam_chance(), GF_FIRE, dir, damroll(dice, sides));
2870 if (name) return _("力の拳", "Fist of Force");
2871 if (desc) return _("ごく小さな分解の球を放つ。", "Fires a tiny ball of disintegration.");
2874 int dice = 8 + ((plev - 5) / 4);
2877 if (info) return info_damage(dice, sides, 0);
2881 if (!get_aim_dir(&dir)) return NULL;
2883 fire_ball(GF_DISINTEGRATE, dir,
2884 damroll(dice, sides), 0);
2890 if (name) return _("テレポート", "Teleport Self");
2891 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
2894 int range = plev * 5;
2896 if (info) return info_range(range);
2900 teleport_player(range, 0L);
2906 if (name) return _("ワンダー", "Wonder");
2907 if (desc) return _("モンスターにランダムな効果を与える。", "Fires something with random effects.");
2910 if (info) return s_random;
2915 if (!get_aim_dir(&dir)) return NULL;
2923 if (name) return _("カオス・ボルト", "Chaos Bolt");
2924 if (desc) return _("カオスのボルトもしくはビームを放つ。", "Fires a bolt or ball of chaos.");
2927 int dice = 10 + (plev - 5) / 4;
2930 if (info) return info_damage(dice, sides, 0);
2934 if (!get_aim_dir(&dir)) return NULL;
2936 fire_bolt_or_beam(beam_chance(), GF_CHAOS, dir, damroll(dice, sides));
2942 if (name) return _("ソニック・ブーム", "Sonic Boom");
2943 if (desc) return _("自分を中心とした轟音の球を発生させる。", "Generates a ball of sound centered on you.");
2946 int dam = 60 + plev;
2947 int rad = plev / 10 + 2;
2949 if (info) return info_damage(0, 0, dam/2);
2953 msg_print(_("ドーン!部屋が揺れた!", "BOOM! Shake the room!"));
2954 project(0, rad, py, px, dam, GF_SOUND, PROJECT_KILL | PROJECT_ITEM, -1);
2960 if (name) return _("破滅の矢", "Doom Bolt");
2961 if (desc) return _("純粋な魔力のビームを放つ。", "Fires a beam of pure mana.");
2964 int dice = 11 + (plev - 5) / 4;
2967 if (info) return info_damage(dice, sides, 0);
2971 if (!get_aim_dir(&dir)) return NULL;
2973 fire_beam(GF_MANA, dir, damroll(dice, sides));
2979 if (name) return _("ファイア・ボール", "Fire Ball");
2980 if (desc) return _("炎の球を放つ。", "Fires a ball of fire.");
2983 int dam = plev + 55;
2986 if (info) return info_damage(0, 0, dam);
2990 if (!get_aim_dir(&dir)) return NULL;
2992 fire_ball(GF_FIRE, dir, dam, rad);
2998 if (name) return _("テレポート・アウェイ", "Teleport Other");
2999 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
3004 if (info) return info_power(power);
3008 if (!get_aim_dir(&dir)) return NULL;
3010 fire_beam(GF_AWAY_ALL, dir, power);
3016 if (name) return _("破壊の言葉", "Word of Destruction");
3017 if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroy everything in nearby area.");
3025 destroy_area(py, px, base + randint1(sides), FALSE);
3031 if (name) return _("ログルス発動", "Invoke Logrus");
3032 if (desc) return _("巨大なカオスの球を放つ。", "Fires a huge ball of chaos.");
3035 int dam = plev * 2 + 99;
3038 if (info) return info_damage(0, 0, dam);
3042 if (!get_aim_dir(&dir)) return NULL;
3044 fire_ball(GF_CHAOS, dir, dam, rad);
3050 if (name) return _("他者変容", "Polymorph Other");
3051 if (desc) return _("モンスター1体を変身させる。抵抗されると無効。", "Attempts to polymorph a monster.");
3056 if (info) return info_power(power);
3060 if (!get_aim_dir(&dir)) return NULL;
3062 poly_monster(dir, plev);
3068 if (name) return _("連鎖稲妻", "Chain Lightning");
3069 if (desc) return _("全方向に対して電撃のビームを放つ。", "Fires lightning beams in all directions.");
3072 int dice = 5 + plev / 10;
3075 if (info) return info_damage(dice, sides, 0);
3079 for (dir = 0; dir <= 9; dir++)
3080 fire_beam(GF_ELEC, dir, damroll(dice, sides));
3086 if (name) return _("魔力封入", "Arcane Binding");
3087 if (desc) return _("杖/魔法棒の充填回数を増やすか、充填中のロッドの充填時間を減らす。", "Recharges staffs, wands or rods.");
3092 if (info) return info_power(power);
3096 if (!recharge(power)) return NULL;
3102 if (name) return _("原子分解", "Disintegrate");
3103 if (desc) return _("巨大な分解の球を放つ。", "Fires a huge ball of disintegration.");
3106 int dam = plev + 70;
3107 int rad = 3 + plev / 40;
3109 if (info) return info_damage(0, 0, dam);
3113 if (!get_aim_dir(&dir)) return NULL;
3115 fire_ball(GF_DISINTEGRATE, dir, dam, rad);
3121 if (name) return _("現実変容", "Alter Reality");
3122 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
3128 if (info) return info_delay(base, sides);
3138 if (name) return _("マジック・ロケット", "Magic Rocket");
3139 if (desc) return _("ロケットを発射する。", "Fires a magic rocket.");
3142 int dam = 120 + plev * 2;
3145 if (info) return info_damage(0, 0, dam);
3149 if (!get_aim_dir(&dir)) return NULL;
3151 msg_print(_("ロケット発射!", "You launch a rocket!"));
3152 fire_rocket(GF_ROCKET, dir, dam, rad);
3158 if (name) return _("混沌の刃", "Chaos Branding");
3159 if (desc) return _("武器にカオスの属性をつける。", "Makes current weapon a Chaotic weapon.");
3170 if (name) return _("悪魔召喚", "Summon Demon");
3171 if (desc) return _("悪魔を1体召喚する。", "Summons a demon.");
3177 bool pet = !one_in_(3);
3179 if (pet) mode |= PM_FORCE_PET;
3180 else mode |= PM_NO_PET;
3181 if (!(pet && (plev < 50))) mode |= PM_ALLOW_GROUP;
3183 if (summon_specific((pet ? -1 : 0), py, px, (plev * 3) / 2, SUMMON_DEMON, mode))
3185 msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));
3188 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
3192 msg_print(_("「卑しき者よ、我は汝の下僕にあらず! お前の魂を頂くぞ!」",
3193 "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));
3201 if (name) return _("重力光線", "Beam of Gravity");
3202 if (desc) return _("重力のビームを放つ。", "Fires a beam of gravity.");
3205 int dice = 9 + (plev - 5) / 4;
3208 if (info) return info_damage(dice, sides, 0);
3212 if (!get_aim_dir(&dir)) return NULL;
3214 fire_beam(GF_GRAVITY, dir, damroll(dice, sides));
3220 if (name) return _("流星群", "Meteor Swarm");
3221 if (desc) return _("自分の周辺に隕石を落とす。", "Makes meteor balls fall down to nearby random locations.");
3227 if (info) return info_multi_damage(dam);
3231 cast_meteor(dam, rad);
3237 if (name) return _("焔の一撃", "Flame Strike");
3238 if (desc) return _("自分を中心とした超巨大な炎の球を発生させる。", "Generate a huge ball of fire centered on you.");
3241 int dam = 300 + 3 * plev;
3244 if (info) return info_damage(0, 0, dam/2);
3248 fire_ball(GF_FIRE, 0, dam, rad);
3254 if (name) return _("混沌召来", "Call Chaos");
3255 if (desc) return _("ランダムな属性の球やビームを発生させる。", "Generate random kind of balls or beams.");
3258 if (info) return format("%s150 / 250", s_dam);
3268 if (name) return _("自己変容", "Polymorph Self");
3269 if (desc) return _("自分を変身させようとする。", "Polymorphs yourself.");
3274 if (!get_check(_("変身します。よろしいですか?", "You will polymorph yourself. Are you sure? "))) return NULL;
3281 if (name) return _("魔力の嵐", "Mana Storm");
3282 if (desc) return _("非常に強力で巨大な純粋な魔力の球を放つ。", "Fires an extremely powerful huge ball of pure mana.");
3285 int dam = 300 + plev * 4;
3288 if (info) return info_damage(0, 0, dam);
3292 if (!get_aim_dir(&dir)) return NULL;
3294 fire_ball(GF_MANA, dir, dam, rad);
3300 if (name) return _("ログルスのブレス", "Breathe Logrus");
3301 if (desc) return _("非常に強力なカオスの球を放つ。", "Fires an extremely powerful ball of chaos.");
3304 int dam = p_ptr->chp;
3307 if (info) return info_damage(0, 0, dam);
3311 if (!get_aim_dir(&dir)) return NULL;
3313 fire_ball(GF_CHAOS, dir, dam, rad);
3319 if (name) return _("虚無召来", "Call the Void");
3320 if (desc) return _("自分に周囲に向かって、ロケット、純粋な魔力の球、放射性廃棄物の球を放つ。ただし、壁に隣接して使用すると広範囲を破壊する。",
3321 "Fires rockets, mana balls and nuclear waste balls in all directions each unless you are not adjacent to any walls. Otherwise *destroys* huge area.");
3324 if (info) return format("%s3 * 175", s_dam);
3338 * @brief 暗黒領域魔法の各処理を行う
3340 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
3341 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
3343 static cptr do_death_spell(int spell, int mode)
3345 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
3346 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
3347 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
3348 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
3350 static const char s_dam[] = _("損傷:", "dam ");
3351 static const char s_random[] = _("ランダム", "random");
3354 int plev = p_ptr->lev;
3359 if (name) return _("無生命感知", "Detect Unlife");
3360 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
3363 int rad = DETECT_RAD_DEFAULT;
3365 if (info) return info_radius(rad);
3369 detect_monsters_nonliving(rad);
3375 if (name) return _("呪殺弾", "Malediction");
3376 if (desc) return _("ごく小さな邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",
3377 "Fires a tiny ball of evil power which hurts good monsters greatly.");
3380 int dice = 3 + (plev - 1) / 5;
3384 if (info) return info_damage(dice, sides, 0);
3388 if (!get_aim_dir(&dir)) return NULL;
3391 * A radius-0 ball may (1) be aimed at
3392 * objects etc., and will affect them;
3393 * (2) may be aimed at ANY visible
3394 * monster, unlike a 'bolt' which must
3395 * travel to the monster.
3398 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides), rad);
3402 /* Special effect first */
3403 int effect = randint1(1000);
3406 fire_ball_hide(GF_DEATH_RAY, dir, plev * 200, 0);
3407 else if (effect < 500)
3408 fire_ball_hide(GF_TURN_ALL, dir, plev, 0);
3409 else if (effect < 800)
3410 fire_ball_hide(GF_OLD_CONF, dir, plev, 0);
3412 fire_ball_hide(GF_STUN, dir, plev, 0);
3419 if (name) return _("邪悪感知", "Detect Evil");
3420 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
3423 int rad = DETECT_RAD_DEFAULT;
3425 if (info) return info_radius(rad);
3429 detect_monsters_evil(rad);
3435 if (name) return _("悪臭雲", "Stinking Cloud");
3436 if (desc) return _("毒の球を放つ。", "Fires a ball of poison.");
3439 int dam = 10 + plev / 2;
3442 if (info) return info_damage(0, 0, dam);
3446 if (!get_aim_dir(&dir)) return NULL;
3448 fire_ball(GF_POIS, dir, dam, rad);
3454 if (name) return _("黒い眠り", "Black Sleep");
3455 if (desc) return _("1体のモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep a monster.");
3460 if (info) return info_power(power);
3464 if (!get_aim_dir(&dir)) return NULL;
3466 sleep_monster(dir, plev);
3472 if (name) return _("耐毒", "Resist Poison");
3473 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",
3474 "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");
3479 if (info) return info_duration(base, base);
3483 set_oppose_pois(randint1(base) + base, FALSE);
3489 if (name) return _("恐慌", "Horrify");
3490 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
3495 if (info) return info_power(power);
3499 if (!get_aim_dir(&dir)) return NULL;
3501 fear_monster(dir, power);
3502 stun_monster(dir, power);
3508 if (name) return _("アンデッド従属", "Enslave Undead");
3509 if (desc) return _("アンデッド1体を魅了する。抵抗されると無効。", "Attempts to charm an undead monster.");
3514 if (info) return info_power(power);
3518 if (!get_aim_dir(&dir)) return NULL;
3520 control_one_undead(dir, power);
3526 if (name) return _("エントロピーの球", "Orb of Entropy");
3527 if (desc) return _("生命のある者に効果のある球を放つ。", "Fires a ball which damages living monsters.");
3532 int rad = (plev < 30) ? 2 : 3;
3535 if (p_ptr->pclass == CLASS_MAGE ||
3536 p_ptr->pclass == CLASS_HIGH_MAGE ||
3537 p_ptr->pclass == CLASS_SORCERER)
3538 base = plev + plev / 2;
3540 base = plev + plev / 4;
3543 if (info) return info_damage(dice, sides, base);
3547 if (!get_aim_dir(&dir)) return NULL;
3549 fire_ball(GF_OLD_DRAIN, dir, damroll(dice, dice) + base, rad);
3555 if (name) return _("地獄の矢", "Nether Bolt");
3556 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
3559 int dice = 8 + (plev - 5) / 4;
3562 if (info) return info_damage(dice, sides, 0);
3566 if (!get_aim_dir(&dir)) return NULL;
3568 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
3574 if (name) return _("殺戮雲", "Cloud kill");
3575 if (desc) return _("自分を中心とした毒の球を発生させる。", "Generate a ball of poison centered on you.");
3578 int dam = (30 + plev) * 2;
3579 int rad = plev / 10 + 2;
3581 if (info) return info_damage(0, 0, dam/2);
3585 project(0, rad, py, px, dam, GF_POIS, PROJECT_KILL | PROJECT_ITEM, -1);
3591 if (name) return _("モンスター消滅", "Genocide One");
3592 if (desc) return _("モンスター1体を消し去る。経験値やアイテムは手に入らない。抵抗されると無効。", "Attempts to vanish a monster.");
3595 int power = plev + 50;
3597 if (info) return info_power(power);
3601 if (!get_aim_dir(&dir)) return NULL;
3603 fire_ball_hide(GF_GENOCIDE, dir, power, 0);
3609 if (name) return _("毒の刃", "Poison Branding");
3610 if (desc) return _("武器に毒の属性をつける。", "Makes current weapon poison branded.");
3621 if (name) return _("吸血ドレイン", "Vampiric Drain");
3622 if (desc) return _("モンスター1体から生命力を吸いとる。吸いとった生命力によって満腹度が上がる。",
3623 "Absorbs some HP from a monster and gives them to you. You will also gain nutritional sustenance from this.");
3627 int sides = plev * 2;
3628 int base = plev * 2;
3630 if (info) return info_damage(dice, sides, base);
3634 int dam = base + damroll(dice, sides);
3636 if (!get_aim_dir(&dir)) return NULL;
3638 if (drain_life(dir, dam))
3640 chg_virtue(V_SACRIFICE, -1);
3641 chg_virtue(V_VITALITY, -1);
3646 * Gain nutritional sustenance:
3649 * A Food ration gives 5000
3650 * food points (by contrast)
3651 * Don't ever get more than
3652 * "Full" this way But if we
3653 * ARE Gorged, it won't cure
3656 dam = p_ptr->food + MIN(5000, 100 * dam);
3658 /* Not gorged already */
3659 if (p_ptr->food < PY_FOOD_MAX)
3660 set_food(dam >= PY_FOOD_MAX ? PY_FOOD_MAX - 1 : dam);
3667 if (name) return _("反魂の術", "Animate dead");
3668 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
3673 animate_dead(0, py, px);
3679 if (name) return _("抹殺", "Genocide");
3680 if (desc) return _("指定した文字のモンスターを現在の階から消し去る。抵抗されると無効。",
3681 "Eliminates an entire class of monster, exhausting you. Powerful or unique monsters may resist.");
3684 int power = plev+50;
3686 if (info) return info_power(power);
3690 symbol_genocide(power, TRUE);
3696 if (name) return _("狂戦士化", "Berserk");
3697 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");
3702 if (info) return info_duration(base, base);
3706 set_shero(randint1(base) + base, FALSE);
3714 if (name) return _("悪霊召喚", "Invoke Spirits");
3715 if (desc) return _("ランダムで様々な効果が起こる。", "Causes random effects.");
3718 if (info) return s_random;
3722 if (!get_aim_dir(&dir)) return NULL;
3724 cast_invoke_spirits(dir);
3730 if (name) return _("暗黒の矢", "Dark Bolt");
3731 if (desc) return _("暗黒のボルトもしくはビームを放つ。", "Fires a bolt or beam of darkness.");
3734 int dice = 4 + (plev - 5) / 4;
3737 if (info) return info_damage(dice, sides, 0);
3741 if (!get_aim_dir(&dir)) return NULL;
3743 fire_bolt_or_beam(beam_chance(), GF_DARK, dir, damroll(dice, sides));
3749 if (name) return _("狂乱戦士", "Battle Frenzy");
3750 if (desc) return _("狂戦士化し、恐怖を除去し、加速する。",
3751 "Gives another bonus to hit and HP, immunity to fear for a while. Hastes you. But decreases AC.");
3755 int sp_base = plev / 2;
3756 int sp_sides = 20 + plev / 2;
3758 if (info) return info_duration(b_base, b_base);
3762 set_shero(randint1(25) + 25, FALSE);
3765 set_fast(randint1(sp_sides) + sp_base, FALSE);
3771 if (name) return _("吸血の刃", "Vampiric Branding");
3772 if (desc) return _("武器に吸血の属性をつける。", "Makes current weapon Vampiric.");
3783 if (name) return _("真・吸血", "Vampirism True");
3784 if (desc) return _("モンスター1体から生命力を吸いとる。吸いとった生命力によって体力が回復する。",
3785 "Fires 3 bolts. Each of the bolts absorbs some HP from a monster and gives them to you.");
3790 if (info) return format("%s3*%d", s_dam, dam);
3796 if (!get_aim_dir(&dir)) return NULL;
3798 chg_virtue(V_SACRIFICE, -1);
3799 chg_virtue(V_VITALITY, -1);
3801 for (i = 0; i < 3; i++)
3803 if (drain_life(dir, dam))
3811 if (name) return _("死の言魂", "Nether Wave");
3812 if (desc) return _("視界内の生命のあるモンスターにダメージを与える。", "Damages all living monsters in sight.");
3815 int sides = plev * 3;
3817 if (info) return info_damage(1, sides, 0);
3821 dispel_living(randint1(sides));
3827 if (name) return _("暗黒の嵐", "Darkness Storm");
3828 if (desc) return _("巨大な暗黒の球を放つ。", "Fires a huge ball of darkness.");
3831 int dam = 100 + plev * 2;
3834 if (info) return info_damage(0, 0, dam);
3838 if (!get_aim_dir(&dir)) return NULL;
3840 fire_ball(GF_DARK, dir, dam, rad);
3846 if (name) return _("死の光線", "Death Ray");
3847 if (desc) return _("死の光線を放つ。", "Fires a beam of death.");
3852 if (!get_aim_dir(&dir)) return NULL;
3854 death_ray(dir, plev);
3860 if (name) return _("死者召喚", "Raise the Dead");
3861 if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");
3867 bool pet = one_in_(3);
3870 type = (plev > 47 ? SUMMON_HI_UNDEAD : SUMMON_UNDEAD);
3872 if (!pet || (pet && (plev > 24) && one_in_(3)))
3873 mode |= PM_ALLOW_GROUP;
3875 if (pet) mode |= PM_FORCE_PET;
3876 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
3878 if (summon_specific((pet ? -1 : 0), py, px, (plev * 3) / 2, type, mode))
3880 msg_print(_("冷たい風があなたの周りに吹き始めた。それは腐敗臭を運んでいる...",
3881 "Cold winds begin to blow around you, carrying with them the stench of decay..."));
3886 msg_print(_("古えの死せる者共があなたに仕えるため土から甦った!",
3887 "Ancient, long-dead forms arise from the ground to serve you!"));
3891 msg_print(_("死者が甦った。眠りを妨げるあなたを罰するために!",
3892 "'The dead arise... to punish you for disturbing them!'"));
3895 chg_virtue(V_UNLIFE, 1);
3902 if (name) return _("死者の秘伝", "Esoteria");
3903 if (desc) return _("アイテムを1つ識別する。レベルが高いとアイテムの能力を完全に知ることができる。",
3904 "Identifies an item. Or *identifies* an item at higher level.");
3909 if (randint1(50) > plev)
3911 if (!ident_spell(FALSE)) return NULL;
3915 if (!identify_fully(FALSE)) return NULL;
3922 if (name) return _("吸血鬼変化", "Polymorph Vampire");
3923 if (desc) return _("一定時間、吸血鬼に変化する。変化している間は本来の種族の能力を失い、代わりに吸血鬼としての能力を得る。",
3924 "Mimic a vampire for a while. Loses abilities of original race and gets abilities as a vampire.");
3927 int base = 10 + plev / 2;
3929 if (info) return info_duration(base, base);
3933 set_mimic(base + randint1(base), MIMIC_VAMPIRE, FALSE);
3939 if (name) return _("経験値復活", "Restore Life");
3940 if (desc) return _("失った経験値を回復する。", "Restore lost experience.");
3951 if (name) return _("周辺抹殺", "Mass Genocide");
3952 if (desc) return _("自分の周囲にいるモンスターを現在の階から消し去る。抵抗されると無効。",
3953 "Eliminates all nearby monsters, exhausting you. Powerful or unique monsters may be able to resist.");
3956 int power = plev + 50;
3958 if (info) return info_power(power);
3962 mass_genocide(power, TRUE);
3968 if (name) return _("地獄の劫火", "Hellfire");
3969 if (desc) return _("邪悪な力を持つ宝珠を放つ。善良なモンスターには大きなダメージを与える。",
3970 "Fires a powerful ball of evil power. Hurts good monsters greatly.");
3976 if (info) return info_damage(0, 0, dam);
3980 if (!get_aim_dir(&dir)) return NULL;
3982 fire_ball(GF_HELL_FIRE, dir, dam, rad);
3983 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("地獄の劫火の呪文を唱えた疲労", "the strain of casting Hellfire"), -1);
3989 if (name) return _("幽体化", "Wraithform");
3990 if (desc) return _("一定時間、壁を通り抜けることができ受けるダメージが軽減される幽体の状態に変身する。",
3991 "Becomes wraith form which gives ability to pass walls and makes all damages half.");
3994 int base = plev / 2;
3996 if (info) return info_duration(base, base);
4000 set_wraith_form(randint1(base) + base, FALSE);
4011 * @brief トランプ領域魔法の各処理を行う
4013 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
4014 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
4016 static cptr do_trump_spell(int spell, int mode)
4018 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
4019 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
4020 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
4021 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
4022 bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
4023 static const char s_random[] = _("ランダム", "random");
4026 int plev = p_ptr->lev;
4031 if (name) return _("ショート・テレポート", "Phase Door");
4032 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");
4037 if (info) return info_range(range);
4041 teleport_player(range, 0L);
4047 if (name) return _("蜘蛛のカード", "Trump Spiders");
4048 if (desc) return _("蜘蛛を召喚する。", "Summons spiders.");
4053 msg_print(_("あなたは蜘蛛のカードに集中する...", "You concentrate on the trump of an spider..."));
4054 if (trump_summoning(1, !fail, py, px, 0, SUMMON_SPIDER, PM_ALLOW_GROUP))
4058 msg_print(_("召喚された蜘蛛は怒っている!", "The summoned spiders get angry!"));
4066 if (name) return _("シャッフル", "Shuffle");
4067 if (desc) return _("カードの占いをする。", "Causes random effects.");
4070 if (info) return s_random;
4080 if (name) return _("フロア・リセット", "Reset Recall");
4081 if (desc) return _("最深階を変更する。", "Resets the 'deepest' level for recall spell.");
4086 if (!reset_recall()) return NULL;
4092 if (name) return _("テレポート", "Teleport");
4093 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
4096 int range = plev * 4;
4098 if (info) return info_range(range);
4102 teleport_player(range, 0L);
4108 if (name) return _("感知のカード", "Trump Spying");
4109 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
4115 if (info) return info_duration(base, sides);
4119 set_tim_esp(randint1(sides) + base, FALSE);
4125 if (name) return _("テレポート・モンスター", "Teleport Away");
4126 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
4131 if (info) return info_power(power);
4135 if (!get_aim_dir(&dir)) return NULL;
4137 fire_beam(GF_AWAY_ALL, dir, power);
4143 if (name) return _("動物のカード", "Trump Animals");
4144 if (desc) return _("1体の動物を召喚する。", "Summons an animal.");
4149 int type = (!fail ? SUMMON_ANIMAL_RANGER : SUMMON_ANIMAL);
4150 msg_print(_("あなたは動物のカードに集中する...", "You concentrate on the trump of an animal..."));
4151 if (trump_summoning(1, !fail, py, px, 0, type, 0L))
4155 msg_print(_("召喚された動物は怒っている!", "The summoned animal gets angry!"));
4163 if (name) return _("移動のカード", "Trump Reach");
4164 if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");
4167 int weight = plev * 15;
4169 if (info) return info_weight(weight);
4173 if (!get_aim_dir(&dir)) return NULL;
4175 fetch(dir, weight, FALSE);
4181 if (name) return _("カミカゼのカード", "Trump Kamikaze");
4182 if (desc) return _("複数の爆発するモンスターを召喚する。", "Summons monsters which explode by itself.");
4192 if (!target_set(TARGET_KILL)) return NULL;
4198 /* Summons near player when failed */
4203 if (p_ptr->pclass == CLASS_BEASTMASTER)
4204 type = SUMMON_KAMIKAZE_LIVING;
4206 type = SUMMON_KAMIKAZE;
4208 msg_print(_("あなたはカミカゼのカードに集中する...", "You concentrate on several trumps at once..."));
4209 if (trump_summoning(2 + randint0(plev / 7), !fail, y, x, 0, type, 0L))
4213 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
4221 if (name) return _("幻霊召喚", "Phantasmal Servant");
4222 if (desc) return _("1体の幽霊を召喚する。", "Summons a ghost.");
4225 /* Phantasmal Servant is not summoned as enemy when failed */
4228 int summon_lev = plev * 2 / 3 + randint1(plev / 2);
4230 if (trump_summoning(1, !fail, py, px, (summon_lev * 3 / 2), SUMMON_PHANTOM, 0L))
4232 msg_print(_("御用でございますか、御主人様?", "'Your wish, master?'"));
4239 if (name) return _("スピード・モンスター", "Haste Monster");
4240 if (desc) return _("モンスター1体を加速させる。", "Hastes a monster.");
4247 /* Temporary enable target_pet option */
4248 bool old_target_pet = target_pet;
4251 result = get_aim_dir(&dir);
4253 /* Restore target_pet option */
4254 target_pet = old_target_pet;
4256 if (!result) return NULL;
4258 speed_monster(dir, plev);
4264 if (name) return _("テレポート・レベル", "Teleport Level");
4265 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");
4270 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
4277 if (name) return _("次元の扉", "Dimension Door");
4278 if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleport to given location.");
4281 int range = plev / 2 + 10;
4283 if (info) return info_range(range);
4287 msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));
4288 if (!dimension_door()) return NULL;
4294 if (name) return _("帰還の呪文", "Word of Recall");
4295 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
4296 "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
4302 if (info) return info_delay(base, sides);
4306 if (!word_of_recall()) return NULL;
4312 if (name) return _("怪物追放", "Banish");
4313 if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");
4316 int power = plev * 4;
4318 if (info) return info_power(power);
4322 banish_monsters(power);
4328 if (name) return _("位置交換のカード", "Swap Position");
4329 if (desc) return _("1体のモンスターと位置を交換する。", "Swap positions of you and a monster.");
4336 /* HACK -- No range limit */
4337 project_length = -1;
4339 result = get_aim_dir(&dir);
4341 /* Restore range to default */
4344 if (!result) return NULL;
4352 if (name) return _("アンデッドのカード", "Trump Undead");
4353 if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");
4358 msg_print(_("あなたはアンデッドのカードに集中する...", "You concentrate on the trump of an undead creature..."));
4359 if (trump_summoning(1, !fail, py, px, 0, SUMMON_UNDEAD, 0L))
4363 msg_print(_("召喚されたアンデッドは怒っている!", "The summoned undead creature gets angry!"));
4371 if (name) return _("爬虫類のカード", "Trump Reptiles");
4372 if (desc) return _("1体のヒドラを召喚する。", "Summons a hydra.");
4377 msg_print(_("あなたは爬虫類のカードに集中する...", "You concentrate on the trump of a reptile..."));
4378 if (trump_summoning(1, !fail, py, px, 0, SUMMON_HYDRA, 0L))
4382 msg_print(_("召喚された爬虫類は怒っている!", "The summoned reptile gets angry!"));
4390 if (name) return _("モンスターのカード", "Trump Monsters");
4391 if (desc) return _("複数のモンスターを召喚する。", "Summons some monsters.");
4397 msg_print(_("あなたはモンスターのカードに集中する...", "You concentrate on several trumps at once..."));
4398 if (p_ptr->pclass == CLASS_BEASTMASTER)
4399 type = SUMMON_LIVING;
4403 if (trump_summoning((1 + (plev - 15)/ 10), !fail, py, px, 0, type, 0L))
4407 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
4416 if (name) return _("ハウンドのカード", "Trump Hounds");
4417 if (desc) return _("1グループのハウンドを召喚する。", "Summons a group of hounds.");
4422 msg_print(_("あなたはハウンドのカードに集中する...", "You concentrate on the trump of a hound..."));
4423 if (trump_summoning(1, !fail, py, px, 0, SUMMON_HOUND, PM_ALLOW_GROUP))
4427 msg_print(_("召喚されたハウンドは怒っている!", "The summoned hounds get angry!"));
4435 if (name) return _("トランプの刃", "Trump Branding");
4436 if (desc) return _("武器にトランプの属性をつける。", "Makes current weapon a Trump weapon.");
4447 if (name) return _("人間トランプ", "Living Trump");
4448 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",
4449 "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");
4457 /* Teleport control */
4460 /* Random teleportation (uncontrolled) */
4463 /* Gain the mutation */
4464 if (gain_random_mutation(mutation))
4466 msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));
4473 if (name) return _("サイバーデーモンのカード", "Trump Cyberdemon");
4474 if (desc) return _("1体のサイバーデーモンを召喚する。", "Summons a cyber demon.");
4479 msg_print(_("あなたはサイバーデーモンのカードに集中する...", "You concentrate on the trump of a Cyberdemon..."));
4480 if (trump_summoning(1, !fail, py, px, 0, SUMMON_CYBER, 0L))
4484 msg_print(_("召喚されたサイバーデーモンは怒っている!", "The summoned Cyberdemon gets angry!"));
4492 if (name) return _("予見のカード", "Trump Divination");
4493 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
4494 "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
4497 int rad = DETECT_RAD_DEFAULT;
4499 if (info) return info_radius(rad);
4509 if (name) return _("知識のカード", "Trump Lore");
4510 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
4515 if (!identify_fully(FALSE)) return NULL;
4521 if (name) return _("回復モンスター", "Heal Monster");
4522 if (desc) return _("モンスター1体の体力を回復させる。", "Heal a monster.");
4525 int heal = plev * 10 + 200;
4527 if (info) return info_heal(0, 0, heal);
4533 /* Temporary enable target_pet option */
4534 bool old_target_pet = target_pet;
4537 result = get_aim_dir(&dir);
4539 /* Restore target_pet option */
4540 target_pet = old_target_pet;
4542 if (!result) return NULL;
4544 heal_monster(dir, heal);
4550 if (name) return _("ドラゴンのカード", "Trump Dragon");
4551 if (desc) return _("1体のドラゴンを召喚する。", "Summons a dragon.");
4556 msg_print(_("あなたはドラゴンのカードに集中する...", "You concentrate on the trump of a dragon..."));
4557 if (trump_summoning(1, !fail, py, px, 0, SUMMON_DRAGON, 0L))
4561 msg_print(_("召喚されたドラゴンは怒っている!", "The summoned dragon gets angry!"));
4569 if (name) return _("隕石のカード", "Trump Meteor");
4570 if (desc) return _("自分の周辺に隕石を落とす。", "Makes meteor balls fall down to nearby random locations.");
4576 if (info) return info_multi_damage(dam);
4580 cast_meteor(dam, rad);
4586 if (name) return _("デーモンのカード", "Trump Demon");
4587 if (desc) return _("1体の悪魔を召喚する。", "Summons a demon.");
4592 msg_print(_("あなたはデーモンのカードに集中する...", "You concentrate on the trump of a demon..."));
4593 if (trump_summoning(1, !fail, py, px, 0, SUMMON_DEMON, 0L))
4597 msg_print(_("召喚されたデーモンは怒っている!", "The summoned demon gets angry!"));
4605 if (name) return _("地獄のカード", "Trump Greater Undead");
4606 if (desc) return _("1体の上級アンデッドを召喚する。", "Summons a greater undead.");
4611 msg_print(_("あなたは強力なアンデッドのカードに集中する...", "You concentrate on the trump of a greater undead being..."));
4612 /* May allow unique depend on level and dice roll */
4613 if (trump_summoning(1, !fail, py, px, 0, SUMMON_HI_UNDEAD, PM_ALLOW_UNIQUE))
4617 msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead creature gets angry!"));
4625 if (name) return _("古代ドラゴンのカード", "Trump Ancient Dragon");
4626 if (desc) return _("1体の古代ドラゴンを召喚する。", "Summons an ancient dragon.");
4633 if (p_ptr->pclass == CLASS_BEASTMASTER)
4634 type = SUMMON_HI_DRAGON_LIVING;
4636 type = SUMMON_HI_DRAGON;
4638 msg_print(_("あなたは古代ドラゴンのカードに集中する...", "You concentrate on the trump of an ancient dragon..."));
4639 /* May allow unique depend on level and dice roll */
4640 if (trump_summoning(1, !fail, py, px, 0, type, PM_ALLOW_UNIQUE))
4644 msg_print(_("召喚された古代ドラゴンは怒っている!", "The summoned ancient dragon gets angry!"));
4657 * @brief 秘術領域魔法の各処理を行う
4659 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
4660 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
4662 static cptr do_arcane_spell(int spell, int mode)
4664 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
4665 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
4666 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
4667 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
4670 int plev = p_ptr->lev;
4675 if (name) return _("電撃", "Zap");
4676 if (desc) return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");
4679 int dice = 3 + (plev - 1) / 5;
4682 if (info) return info_damage(dice, sides, 0);
4686 if (!get_aim_dir(&dir)) return NULL;
4688 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));
4694 if (name) return _("魔法の施錠", "Wizard Lock");
4695 if (desc) return _("扉に鍵をかける。", "Locks a door.");
4700 if (!get_aim_dir(&dir)) return NULL;
4708 if (name) return _("透明体感知", "Detect Invisibility");
4709 if (desc) return _("近くの透明なモンスターを感知する。", "Detects all invisible monsters in your vicinity.");
4712 int rad = DETECT_RAD_DEFAULT;
4714 if (info) return info_radius(rad);
4718 detect_monsters_invis(rad);
4724 if (name) return _("モンスター感知", "Detect Monsters");
4725 if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
4728 int rad = DETECT_RAD_DEFAULT;
4730 if (info) return info_radius(rad);
4734 detect_monsters_normal(rad);
4740 if (name) return _("ショート・テレポート", "Blink");
4741 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");
4746 if (info) return info_range(range);
4750 teleport_player(range, 0L);
4756 if (name) return _("ライト・エリア", "Light Area");
4757 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
4761 int sides = plev / 2;
4762 int rad = plev / 10 + 1;
4764 if (info) return info_damage(dice, sides, 0);
4768 lite_area(damroll(dice, sides), rad);
4774 if (name) return _("罠と扉 破壊", "Trap & Door Destruction");
4775 if (desc) return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");
4780 if (!get_aim_dir(&dir)) return NULL;
4788 if (name) return _("軽傷の治癒", "Cure Light Wounds");
4789 if (desc) return _("怪我と体力を少し回復させる。", "Heals cut and HP a little.");
4795 if (info) return info_heal(dice, sides, 0);
4799 hp_player(damroll(dice, sides));
4800 set_cut(p_ptr->cut - 10);
4806 if (name) return _("罠と扉 感知", "Detect Doors & Traps");
4807 if (desc) return _("近くの全ての罠と扉と階段を感知する。", "Detects traps, doors, and stairs in your vicinity.");
4810 int rad = DETECT_RAD_DEFAULT;
4812 if (info) return info_radius(rad);
4816 detect_traps(rad, TRUE);
4824 if (name) return _("燃素", "Phlogiston");
4825 if (desc) return _("光源に燃料を補給する。", "Adds more turns of light to a lantern or torch.");
4836 if (name) return _("財宝感知", "Detect Treasure");
4837 if (desc) return _("近くの財宝を感知する。", "Detects all treasures in your vicinity.");
4840 int rad = DETECT_RAD_DEFAULT;
4842 if (info) return info_radius(rad);
4846 detect_treasure(rad);
4847 detect_objects_gold(rad);
4853 if (name) return _("魔法 感知", "Detect Enchantment");
4854 if (desc) return _("近くの魔法がかかったアイテムを感知する。", "Detects all magical items in your vicinity.");
4857 int rad = DETECT_RAD_DEFAULT;
4859 if (info) return info_radius(rad);
4863 detect_objects_magic(rad);
4869 if (name) return _("アイテム感知", "Detect Objects");
4870 if (desc) return _("近くの全てのアイテムを感知する。", "Detects all items in your vicinity.");
4873 int rad = DETECT_RAD_DEFAULT;
4875 if (info) return info_radius(rad);
4879 detect_objects_normal(rad);
4885 if (name) return _("解毒", "Cure Poison");
4886 if (desc) return _("毒を体内から完全に取り除く。", "Cures poison status.");
4897 if (name) return _("耐冷", "Resist Cold");
4898 if (desc) return _("一定時間、冷気への耐性を得る。装備による耐性に累積する。", "Gives resistance to cold. This resistance can be added to which from equipment for more powerful resistance.");
4903 if (info) return info_duration(base, base);
4907 set_oppose_cold(randint1(base) + base, FALSE);
4913 if (name) return _("耐火", "Resist Fire");
4914 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
4915 "Gives resistance to fire. This resistance can be added to which from equipment for more powerful resistance.");
4920 if (info) return info_duration(base, base);
4924 set_oppose_fire(randint1(base) + base, FALSE);
4930 if (name) return _("耐電", "Resist Lightning");
4931 if (desc) return _("一定時間、電撃への耐性を得る。装備による耐性に累積する。",
4932 "Gives resistance to electricity. This resistance can be added to which from equipment for more powerful resistance.");
4937 if (info) return info_duration(base, base);
4941 set_oppose_elec(randint1(base) + base, FALSE);
4947 if (name) return _("耐酸", "Resist Acid");
4948 if (desc) return _("一定時間、酸への耐性を得る。装備による耐性に累積する。",
4949 "Gives resistance to acid. This resistance can be added to which from equipment for more powerful resistance.");
4954 if (info) return info_duration(base, base);
4958 set_oppose_acid(randint1(base) + base, FALSE);
4964 if (name) return _("重傷の治癒", "Cure Medium Wounds");
4965 if (desc) return _("怪我と体力を中程度回復させる。", "Heals cut and HP more.");
4971 if (info) return info_heal(dice, sides, 0);
4975 hp_player(damroll(dice, sides));
4976 set_cut((p_ptr->cut / 2) - 50);
4982 if (name) return _("テレポート", "Teleport");
4983 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");
4986 int range = plev * 5;
4988 if (info) return info_range(range);
4992 teleport_player(range, 0L);
4998 if (name) return _("鑑定", "Identify");
4999 if (desc) return _("アイテムを識別する。", "Identifies an item.");
5004 if (!ident_spell(FALSE)) return NULL;
5010 if (name) return _("岩石溶解", "Stone to Mud");
5011 if (desc) return _("壁を溶かして床にする。", "Turns one rock square to mud.");
5018 if (info) return info_damage(dice, sides, base);
5022 if (!get_aim_dir(&dir)) return NULL;
5024 wall_to_mud(dir, 20 + randint1(30));
5030 if (name) return _("閃光", "Ray of Light");
5031 if (desc) return _("光線を放つ。光りを嫌うモンスターに効果がある。", "Fires a beam of light which damages to light-sensitive monsters.");
5037 if (info) return info_damage(dice, sides, 0);
5041 if (!get_aim_dir(&dir)) return NULL;
5043 msg_print(_("光線が放たれた。", "A line of light appears."));
5044 lite_line(dir, damroll(6, 8));
5050 if (name) return _("空腹充足", "Satisfy Hunger");
5051 if (desc) return _("満腹にする。", "Satisfies hunger.");
5056 set_food(PY_FOOD_MAX - 1);
5062 if (name) return _("透明視認", "See Invisible");
5063 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
5068 if (info) return info_duration(base, base);
5072 set_tim_invis(randint1(base) + base, FALSE);
5078 if (name) return _("エレメンタル召喚", "Conjure Elemental");
5079 if (desc) return _("1体のエレメンタルを召喚する。", "Summons an elemental.");
5084 if (!summon_specific(-1, py, px, plev, SUMMON_ELEMENTAL, (PM_ALLOW_GROUP | PM_FORCE_PET)))
5086 msg_print(_("エレメンタルは現れなかった。", "No Elementals arrive."));
5093 if (name) return _("テレポート・レベル", "Teleport Level");
5094 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");
5099 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
5106 if (name) return _("テレポート・モンスター", "Teleport Away");
5107 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
5112 if (info) return info_power(power);
5116 if (!get_aim_dir(&dir)) return NULL;
5118 fire_beam(GF_AWAY_ALL, dir, power);
5124 if (name) return _("元素の球", "Elemental Ball");
5125 if (desc) return _("炎、電撃、冷気、酸のどれかの球を放つ。", "Fires a ball of some elements.");
5128 int dam = 75 + plev;
5131 if (info) return info_damage(0, 0, dam);
5137 if (!get_aim_dir(&dir)) return NULL;
5139 switch (randint1(4))
5141 case 1: type = GF_FIRE;break;
5142 case 2: type = GF_ELEC;break;
5143 case 3: type = GF_COLD;break;
5144 default: type = GF_ACID;break;
5147 fire_ball(type, dir, dam, rad);
5153 if (name) return _("全感知", "Detection");
5154 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
5155 "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
5158 int rad = DETECT_RAD_DEFAULT;
5160 if (info) return info_radius(rad);
5170 if (name) return _("帰還の呪文", "Word of Recall");
5171 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
5172 "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");
5178 if (info) return info_delay(base, sides);
5182 if (!word_of_recall()) return NULL;
5188 if (name) return _("千里眼", "Clairvoyance");
5189 if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。さらに、一定時間テレパシー能力を得る。",
5190 "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");
5196 if (info) return info_duration(base, sides);
5200 chg_virtue(V_KNOWLEDGE, 1);
5201 chg_virtue(V_ENLIGHTEN, 1);
5205 if (!p_ptr->telepathy)
5207 set_tim_esp(randint1(sides) + base, FALSE);
5218 * @brief 匠領域魔法の各処理を行う
5220 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
5221 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
5223 static cptr do_craft_spell(int spell, int mode)
5225 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
5226 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
5227 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
5228 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
5230 int plev = p_ptr->lev;
5235 if (name) return _("赤外線視力", "Infravision");
5236 if (desc) return _("一定時間、赤外線視力が増強される。", "Gives infravision for a while.");
5241 if (info) return info_duration(base, base);
5245 set_tim_infra(base + randint1(base), FALSE);
5251 if (name) return _("回復力強化", "Regeneration");
5252 if (desc) return _("一定時間、回復力が増強される。", "Gives regeneration ability for a while.");
5257 if (info) return info_duration(base, base);
5261 set_tim_regen(base + randint1(base), FALSE);
5267 if (name) return _("空腹充足", "Satisfy Hunger");
5268 if (desc) return _("満腹になる。", "Satisfies hunger.");
5273 set_food(PY_FOOD_MAX - 1);
5279 if (name) return _("耐冷気", "Resist Cold");
5280 if (desc) return _("一定時間、冷気への耐性を得る。装備による耐性に累積する。",
5281 "Gives resistance to cold. This resistance can be added to which from equipment for more powerful resistance.");
5286 if (info) return info_duration(base, base);
5290 set_oppose_cold(randint1(base) + base, FALSE);
5296 if (name) return _("耐火炎", "Resist Fire");
5297 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
5298 "Gives resistance to fire. This resistance can be added to which from equipment for more powerful resistance.");
5303 if (info) return info_duration(base, base);
5307 set_oppose_fire(randint1(base) + base, FALSE);
5313 if (name) return _("士気高揚", "Heroism");
5314 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
5319 if (info) return info_duration(base, base);
5323 set_hero(randint1(base) + base, FALSE);
5331 if (name) return _("耐電撃", "Resist Lightning");
5332 if (desc) return _("一定時間、電撃への耐性を得る。装備による耐性に累積する。",
5333 "Gives resistance to electricity. This resistance can be added to which from equipment for more powerful resistance.");
5338 if (info) return info_duration(base, base);
5342 set_oppose_elec(randint1(base) + base, FALSE);
5348 if (name) return _("耐酸", "Resist Acid");
5349 if (desc) return _("一定時間、酸への耐性を得る。装備による耐性に累積する。",
5350 "Gives resistance to acid. This resistance can be added to which from equipment for more powerful resistance.");
5355 if (info) return info_duration(base, base);
5359 set_oppose_acid(randint1(base) + base, FALSE);
5365 if (name) return _("透明視認", "See Invisibility");
5366 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
5371 if (info) return info_duration(base, base);
5375 set_tim_invis(randint1(base) + base, FALSE);
5381 if (name) return _("解呪", "Remove Curse");
5382 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
5389 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
5396 if (name) return _("耐毒", "Resist Poison");
5397 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",
5398 "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");
5403 if (info) return info_duration(base, base);
5407 set_oppose_pois(randint1(base) + base, FALSE);
5413 if (name) return _("狂戦士化", "Berserk");
5414 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");
5419 if (info) return info_duration(base, base);
5423 set_shero(randint1(base) + base, FALSE);
5431 if (name) return _("自己分析", "Self Knowledge");
5432 if (desc) return _("現在の自分の状態を完全に知る。",
5433 "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");
5444 if (name) return _("対邪悪結界", "Protection from Evil");
5445 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");
5448 int base = 3 * plev;
5451 if (info) return info_duration(base, sides);
5455 set_protevil(randint1(sides) + base, FALSE);
5461 if (name) return _("癒し", "Cure");
5462 if (desc) return _("毒、朦朧状態、負傷を全快させ、幻覚を直す。", "Heals poison, stun, cut and hallucination completely.");
5476 if (name) return _("魔法剣", "Mana Branding");
5477 if (desc) return _("一定時間、武器に冷気、炎、電撃、酸、毒のいずれかの属性をつける。武器を持たないと使えない。",
5478 "Makes current weapon some elemental branded. You must wield weapons.");
5481 int base = plev / 2;
5483 if (info) return info_duration(base, base);
5487 if (!choose_ele_attack()) return NULL;
5493 if (name) return _("テレパシー", "Telepathy");
5494 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
5500 if (info) return info_duration(base, sides);
5504 set_tim_esp(randint1(sides) + base, FALSE);
5510 if (name) return _("肌石化", "Stone Skin");
5511 if (desc) return _("一定時間、ACを上昇させる。", "Gives bonus to AC for a while.");
5517 if (info) return info_duration(base, sides);
5521 set_shield(randint1(sides) + base, FALSE);
5527 if (name) return _("全耐性", "Resistance");
5528 if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
5529 "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.");
5534 if (info) return info_duration(base, base);
5538 set_oppose_acid(randint1(base) + base, FALSE);
5539 set_oppose_elec(randint1(base) + base, FALSE);
5540 set_oppose_fire(randint1(base) + base, FALSE);
5541 set_oppose_cold(randint1(base) + base, FALSE);
5542 set_oppose_pois(randint1(base) + base, FALSE);
5548 if (name) return _("スピード", "Haste Self");
5549 if (desc) return _("一定時間、加速する。", "Hastes you for a while.");
5553 int sides = 20 + plev;
5555 if (info) return info_duration(base, sides);
5559 set_fast(randint1(sides) + base, FALSE);
5565 if (name) return _("壁抜け", "Walk through Wall");
5566 if (desc) return _("一定時間、半物質化し壁を通り抜けられるようになる。", "Gives ability to pass walls for a while.");
5569 int base = plev / 2;
5571 if (info) return info_duration(base, base);
5575 set_kabenuke(randint1(base) + base, FALSE);
5581 if (name) return _("盾磨き", "Polish Shield");
5582 if (desc) return _("盾に反射の属性をつける。", "Makes a shield a shield of reflection.");
5593 if (name) return _("ゴーレム製造", "Create Golem");
5594 if (desc) return _("1体のゴーレムを製造する。", "Creates a golem.");
5599 if (summon_specific(-1, py, px, plev, SUMMON_GOLEM, PM_FORCE_PET))
5601 msg_print(_("ゴーレムを作った。", "You make a golem."));
5605 msg_print(_("うまくゴーレムを作れなかった。", "No Golems arrive."));
5612 if (name) return _("魔法の鎧", "Magical armor");
5613 if (desc) return _("一定時間、魔法防御力とACが上がり、混乱と盲目の耐性、反射能力、麻痺知らず、浮遊を得る。",
5614 "Gives resistance to magic, bonus to AC, resistance to confusion, blindness, reflection, free action and levitation for a while.");
5619 if (info) return info_duration(base, base);
5623 set_magicdef(randint1(base) + base, FALSE);
5629 if (name) return _("装備無力化", "Remove Enchantment");
5630 if (desc) return _("武器・防具にかけられたあらゆる魔力を完全に解除する。", "Removes all magics completely from any weapon or armor.");
5635 if (!mundane_spell(TRUE)) return NULL;
5641 if (name) return _("呪い粉砕", "Remove All Curse");
5642 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
5647 if (remove_all_curse())
5649 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
5656 if (name) return _("完全なる知識", "Knowledge True");
5657 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
5662 if (!identify_fully(FALSE)) return NULL;
5668 if (name) return _("武器強化", "Enchant Weapon");
5669 if (desc) return _("武器の命中率修正とダメージ修正を強化する。", "Attempts to increase +to-hit, +to-dam of a weapon.");
5674 if (!enchant_spell(randint0(4) + 1, randint0(4) + 1, 0)) return NULL;
5680 if (name) return _("防具強化", "Enchant Armor");
5681 if (desc) return _("鎧の防御修正を強化する。", "Attempts to increase +AC of an armor.");
5686 if (!enchant_spell(0, 0, randint0(3) + 2)) return NULL;
5692 if (name) return _("武器属性付与", "Brand Weapon");
5693 if (desc) return _("武器にランダムに属性をつける。", "Makes current weapon a random ego weapon.");
5698 brand_weapon(randint0(18));
5704 if (name) return _("人間トランプ", "Living Trump");
5705 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",
5706 "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");
5714 /* Teleport control */
5717 /* Random teleportation (uncontrolled) */
5720 /* Gain the mutation */
5721 if (gain_random_mutation(mutation))
5723 msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));
5730 if (name) return _("属性への免疫", "Immunity");
5731 if (desc) return _("一定時間、冷気、炎、電撃、酸のいずれかに対する免疫を得る。",
5732 "Gives an immunity to fire, cold, electricity or acid for a while.");
5737 if (info) return info_duration(base, base);
5741 if (!choose_ele_immune(base + randint1(base))) return NULL;
5751 * @brief 悪魔領域魔法の各処理を行う
5753 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
5754 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
5756 static cptr do_daemon_spell(int spell, int mode)
5758 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
5759 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
5760 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
5761 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
5762 static const char s_dam[] = _("損傷:", "dam ");
5765 int plev = p_ptr->lev;
5770 if (name) return _("マジック・ミサイル", "Magic Missile");
5771 if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");
5774 int dice = 3 + (plev - 1) / 5;
5777 if (info) return info_damage(dice, sides, 0);
5781 if (!get_aim_dir(&dir)) return NULL;
5783 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));
5789 if (name) return _("無生命感知", "Detect Unlife");
5790 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
5793 int rad = DETECT_RAD_DEFAULT;
5795 if (info) return info_radius(rad);
5799 detect_monsters_nonliving(rad);
5805 if (name) return _("邪なる祝福", "Evil Bless");
5806 if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
5811 if (info) return info_duration(base, base);
5815 set_blessed(randint1(base) + base, FALSE);
5821 if (name) return _("耐火炎", "Resist Fire");
5822 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。",
5823 "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");
5828 if (info) return info_duration(base, base);
5832 set_oppose_fire(randint1(base) + base, FALSE);
5838 if (name) return _("恐慌", "Horrify");
5839 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
5844 if (info) return info_power(power);
5848 if (!get_aim_dir(&dir)) return NULL;
5850 fear_monster(dir, power);
5851 stun_monster(dir, power);
5857 if (name) return _("地獄の矢", "Nether Bolt");
5858 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
5861 int dice = 6 + (plev - 5) / 4;
5864 if (info) return info_damage(dice, sides, 0);
5868 if (!get_aim_dir(&dir)) return NULL;
5870 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
5876 if (name) return _("古代の死霊召喚", "Summon Manes");
5877 if (desc) return _("古代の死霊を召喚する。", "Summons a manes.");
5882 if (!summon_specific(-1, py, px, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET)))
5884 msg_print(_("古代の死霊は現れなかった。", "No Manes arrive."));
5891 if (name) return _("地獄の焔", "Hellish Flame");
5892 if (desc) return _("邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",
5893 "Fires a ball of evil power. Hurts good monsters greatly.");
5898 int rad = (plev < 30) ? 2 : 3;
5901 if (p_ptr->pclass == CLASS_MAGE ||
5902 p_ptr->pclass == CLASS_HIGH_MAGE ||
5903 p_ptr->pclass == CLASS_SORCERER)
5904 base = plev + plev / 2;
5906 base = plev + plev / 4;
5909 if (info) return info_damage(dice, sides, base);
5913 if (!get_aim_dir(&dir)) return NULL;
5915 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides) + base, rad);
5921 if (name) return _("デーモン支配", "Dominate Demon");
5922 if (desc) return _("悪魔1体を魅了する。抵抗されると無効", "Attempts to charm a demon.");
5927 if (info) return info_power(power);
5931 if (!get_aim_dir(&dir)) return NULL;
5933 control_one_demon(dir, power);
5939 if (name) return _("ビジョン", "Vision");
5940 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
5943 int rad = DETECT_RAD_MAP;
5945 if (info) return info_radius(rad);
5955 if (name) return _("耐地獄", "Resist Nether");
5956 if (desc) return _("一定時間、地獄への耐性を得る。", "Gives resistance to nether for a while.");
5961 if (info) return info_duration(base, base);
5965 set_tim_res_nether(randint1(base) + base, FALSE);
5971 if (name) return _("プラズマ・ボルト", "Plasma bolt");
5972 if (desc) return _("プラズマのボルトもしくはビームを放つ。", "Fires a bolt or beam of plasma.");
5975 int dice = 11 + (plev - 5) / 4;
5978 if (info) return info_damage(dice, sides, 0);
5982 if (!get_aim_dir(&dir)) return NULL;
5984 fire_bolt_or_beam(beam_chance(), GF_PLASMA, dir, damroll(dice, sides));
5990 if (name) return _("ファイア・ボール", "Fire Ball");
5991 if (desc) return _("炎の球を放つ。", "Fires a ball of fire.");
5994 int dam = plev + 55;
5997 if (info) return info_damage(0, 0, dam);
6001 if (!get_aim_dir(&dir)) return NULL;
6003 fire_ball(GF_FIRE, dir, dam, rad);
6009 if (name) return _("炎の刃", "Fire Branding");
6010 if (desc) return _("武器に炎の属性をつける。", "Makes current weapon fire branded.");
6021 if (name) return _("地獄球", "Nether Ball");
6022 if (desc) return _("大きな地獄の球を放つ。", "Fires a huge ball of nether.");
6025 int dam = plev * 3 / 2 + 100;
6026 int rad = plev / 20 + 2;
6028 if (info) return info_damage(0, 0, dam);
6032 if (!get_aim_dir(&dir)) return NULL;
6034 fire_ball(GF_NETHER, dir, dam, rad);
6040 if (name) return _("デーモン召喚", "Summon Demon");
6041 if (desc) return _("悪魔1体を召喚する。", "Summons a demon.");
6046 bool pet = !one_in_(3);
6049 if (pet) mode |= PM_FORCE_PET;
6050 else mode |= PM_NO_PET;
6051 if (!(pet && (plev < 50))) mode |= PM_ALLOW_GROUP;
6053 if (summon_specific((pet ? -1 : 0), py, px, plev*2/3+randint1(plev/2), SUMMON_DEMON, mode))
6055 msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));
6059 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
6063 msg_print(_("「卑しき者よ、我は汝の下僕にあらず! お前の魂を頂くぞ!」",
6064 "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));
6069 msg_print(_("悪魔は現れなかった。", "No demons arrive."));
6077 if (name) return _("悪魔の目", "Devilish Eye");
6078 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
6084 if (info) return info_duration(base, sides);
6088 set_tim_esp(randint1(base) + sides, FALSE);
6094 if (name) return _("悪魔のクローク", "Devil Cloak");
6095 if (desc) return _("恐怖を取り除き、一定時間、炎と冷気の耐性、炎のオーラを得る。耐性は装備による耐性に累積する。",
6096 "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.");
6101 if (info) return info_duration(base, base);
6105 int dur = randint1(base) + base;
6107 set_oppose_fire(dur, FALSE);
6108 set_oppose_cold(dur, FALSE);
6109 set_tim_sh_fire(dur, FALSE);
6117 if (name) return _("溶岩流", "The Flow of Lava");
6118 if (desc) return _("自分を中心とした炎の球を作り出し、床を溶岩に変える。",
6119 "Generates a ball of fire centered on you which transforms floors to magma.");
6122 int dam = (55 + plev) * 2;
6125 if (info) return info_damage(0, 0, dam/2);
6129 fire_ball(GF_FIRE, 0, dam, rad);
6130 fire_ball_hide(GF_LAVA_FLOW, 0, 2 + randint1(2), rad);
6136 if (name) return _("プラズマ球", "Plasma Ball");
6137 if (desc) return _("プラズマの球を放つ。", "Fires a ball of plasma.");
6140 int dam = plev * 3 / 2 + 80;
6141 int rad = 2 + plev / 40;
6143 if (info) return info_damage(0, 0, dam);
6147 if (!get_aim_dir(&dir)) return NULL;
6149 fire_ball(GF_PLASMA, dir, dam, rad);
6155 if (name) return _("悪魔変化", "Polymorph Demon");
6156 if (desc) return _("一定時間、悪魔に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔としての能力を得る。",
6157 "Mimic a demon for a while. Loses abilities of original race and gets abilities as a demon.");
6160 int base = 10 + plev / 2;
6162 if (info) return info_duration(base, base);
6166 set_mimic(base + randint1(base), MIMIC_DEMON, FALSE);
6172 if (name) return _("地獄の波動", "Nather Wave");
6173 if (desc) return _("視界内の全てのモンスターにダメージを与える。善良なモンスターに特に大きなダメージを与える。",
6174 "Damages all monsters in sight. Hurts good monsters greatly.");
6177 int sides1 = plev * 2;
6178 int sides2 = plev * 2;
6180 if (info) return format("%sd%d+d%d", s_dam, sides1, sides2);
6184 dispel_monsters(randint1(sides1));
6185 dispel_good(randint1(sides2));
6191 if (name) return _("サキュバスの接吻", "Kiss of Succubus");
6192 if (desc) return _("因果混乱の球を放つ。", "Fires a ball of nexus.");
6195 int dam = 100 + plev * 2;
6198 if (info) return info_damage(0, 0, dam);
6202 if (!get_aim_dir(&dir)) return NULL;
6203 fire_ball(GF_NEXUS, dir, dam, rad);
6209 if (name) return _("破滅の手", "Doom Hand");
6210 if (desc) return _("破滅の手を放つ。食らったモンスターはそのときのHPの半分前後のダメージを受ける。", "Attempts to make a monster's HP almost half.");
6215 if (!get_aim_dir(&dir))
6218 msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));
6220 fire_ball_hide(GF_HAND_DOOM, dir, plev * 2, 0);
6226 if (name) return _("士気高揚", "Raise the Morale");
6227 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
6232 if (info) return info_duration(base, base);
6236 set_hero(randint1(base) + base, FALSE);
6244 if (name) return _("不滅の肉体", "Immortal Body");
6245 if (desc) return _("一定時間、時間逆転への耐性を得る。", "Gives resistance to time for a while.");
6250 if (info) return info_duration(base, base);
6254 set_tim_res_time(randint1(base)+base, FALSE);
6260 if (name) return _("狂気の円環", "Insanity Circle");
6261 if (desc) return _("自分を中心としたカオスの球、混乱の球を発生させ、近くのモンスターを魅了する。",
6262 "Generate balls of chaos, confusion and charm centered on you.");
6265 int dam = 50 + plev;
6266 int power = 20 + plev;
6267 int rad = 3 + plev / 20;
6269 if (info) return format("%s%d+%d", s_dam, dam/2, dam/2);
6273 fire_ball(GF_CHAOS, 0, dam, rad);
6274 fire_ball(GF_CONFUSION, 0, dam, rad);
6275 fire_ball(GF_CHARM, 0, power, rad);
6281 if (name) return _("ペット爆破", "Explode Pets");
6282 if (desc) return _("全てのペットを強制的に爆破させる。", "Makes all pets explode.");
6293 if (name) return _("グレーターデーモン召喚", "Summon Greater Demon");
6294 if (desc) return _("上級デーモンを召喚する。召喚するには人間('p','h','t'で表されるモンスター)の死体を捧げなければならない。",
6295 "Summons greater demon. It need to sacrifice a corpse of human ('p','h' or 't').");
6300 if (!cast_summon_greater_demon()) return NULL;
6306 if (name) return _("地獄嵐", "Nether Storm");
6307 if (desc) return _("超巨大な地獄の球を放つ。", "Generate a huge ball of nether.");
6310 int dam = plev * 15;
6313 if (info) return info_damage(0, 0, dam);
6317 if (!get_aim_dir(&dir)) return NULL;
6319 fire_ball(GF_NETHER, dir, dam, rad);
6325 if (name) return _("血の呪い", "Bloody Curse");
6326 if (desc) return _("自分がダメージを受けることによって対象に呪いをかけ、ダメージを与え様々な効果を引き起こす。",
6327 "Puts blood curse which damages and causes various effects on a monster. You also take damage.");
6333 if (info) return info_damage(0, 0, dam);
6337 if (!get_aim_dir(&dir)) return NULL;
6339 fire_ball_hide(GF_BLOOD_CURSE, dir, dam, rad);
6340 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("血の呪い", "Blood curse"), -1);
6346 if (name) return _("魔王変化", "Polymorph Demonlord");
6347 if (desc) return _("悪魔の王に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔の王としての能力を得、壁を破壊しながら歩く。",
6348 "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.");
6353 if (info) return info_duration(base, base);
6357 set_mimic(base + randint1(base), MIMIC_DEMON_LORD, FALSE);
6367 * @brief 破邪領域魔法の各処理を行う
6369 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
6370 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
6372 static cptr do_crusade_spell(int spell, int mode)
6374 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
6375 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
6376 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
6377 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
6380 int plev = p_ptr->lev;
6385 if (name) return _("懲罰", "Punishment");
6386 if (desc) return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");
6389 int dice = 3 + (plev - 1) / 5;
6392 if (info) return info_damage(dice, sides, 0);
6396 if (!get_aim_dir(&dir)) return NULL;
6398 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));
6404 if (name) return _("邪悪存在感知", "Detect Evil");
6405 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
6408 int rad = DETECT_RAD_DEFAULT;
6410 if (info) return info_radius(rad);
6414 detect_monsters_evil(rad);
6420 if (name) return _("恐怖除去", "Remove Fear");
6421 if (desc) return _("恐怖を取り除く。", "Removes fear.");
6432 if (name) return _("威圧", "Scare Monster");
6433 if (desc) return _("モンスター1体を恐怖させる。抵抗されると無効。", "Attempts to scare a monster.");
6438 if (info) return info_power(power);
6442 if (!get_aim_dir(&dir)) return NULL;
6444 fear_monster(dir, power);
6450 if (name) return _("聖域", "Sanctuary");
6451 if (desc) return _("隣接した全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep monsters in the adjacent squares.");
6456 if (info) return info_power(power);
6460 sleep_monsters_touch();
6466 if (name) return _("入口", "Portal");
6467 if (desc) return _("中距離のテレポートをする。", "Teleport medium distance.");
6470 int range = 25 + plev / 2;
6472 if (info) return info_range(range);
6476 teleport_player(range, 0L);
6482 if (name) return _("スターダスト", "Star Dust");
6483 if (desc) return _("ターゲット付近に閃光のボルトを連射する。", "Fires many bolts of light near the target.");
6486 int dice = 3 + (plev - 1) / 9;
6489 if (info) return info_multi_damage_dice(dice, sides);
6493 if (!get_aim_dir(&dir)) return NULL;
6494 fire_blast(GF_LITE, dir, dice, sides, 10, 3);
6500 if (name) return _("身体浄化", "Purify");
6501 if (desc) return _("傷、毒、朦朧から全快する。", "Heals all cut, stun and poison status.");
6514 if (name) return _("邪悪飛ばし", "Scatter Evil");
6515 if (desc) return _("邪悪なモンスター1体をテレポートさせる。抵抗されると無効。", "Attempts to teleport an evil monster away.");
6518 int power = MAX_SIGHT * 5;
6520 if (info) return info_power(power);
6524 if (!get_aim_dir(&dir)) return NULL;
6525 fire_ball(GF_AWAY_EVIL, dir, power, 0);
6531 if (name) return _("聖なる光球", "Holy Orb");
6532 if (desc) return _("聖なる力をもつ宝珠を放つ。邪悪なモンスターに対して大きなダメージを与えるが、善良なモンスターには効果がない。",
6533 "Fires a ball with holy power. Hurts evil monsters greatly, but don't effect good monsters.");
6538 int rad = (plev < 30) ? 2 : 3;
6541 if (p_ptr->pclass == CLASS_PRIEST ||
6542 p_ptr->pclass == CLASS_HIGH_MAGE ||
6543 p_ptr->pclass == CLASS_SORCERER)
6544 base = plev + plev / 2;
6546 base = plev + plev / 4;
6549 if (info) return info_damage(dice, sides, base);
6553 if (!get_aim_dir(&dir)) return NULL;
6555 fire_ball(GF_HOLY_FIRE, dir, damroll(dice, sides) + base, rad);
6561 if (name) return _("悪魔払い", "Exorcism");
6562 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与え、邪悪なモンスターを恐怖させる。",
6563 "Damages all undead and demons in sight, and scares all evil monsters in sight.");
6569 if (info) return info_damage(1, sides, 0);
6573 dispel_undead(randint1(sides));
6574 dispel_demons(randint1(sides));
6581 if (name) return _("解呪", "Remove Curse");
6582 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
6589 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
6596 if (name) return _("透明視認", "Sense Unseen");
6597 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
6602 if (info) return info_duration(base, base);
6606 set_tim_invis(randint1(base) + base, FALSE);
6612 if (name) return _("対邪悪結界", "Protection from Evil");
6613 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");
6617 int sides = 3 * plev;
6619 if (info) return info_duration(base, sides);
6623 set_protevil(randint1(sides) + sides, FALSE);
6629 if (name) return _("裁きの雷", "Judgment Thunder");
6630 if (desc) return _("強力な電撃のボルトを放つ。", "Fires a powerful bolt of lightning.");
6635 if (info) return info_damage(0, 0, dam);
6639 if (!get_aim_dir(&dir)) return NULL;
6640 fire_bolt(GF_ELEC, dir, dam);
6646 if (name) return _("聖なる御言葉", "Holy Word");
6647 if (desc) return _("視界内の邪悪な存在に大きなダメージを与え、体力を回復し、毒、恐怖、朦朧状態、負傷から全快する。",
6648 "Damages all evil monsters in sight, heals HP somewhat, and completely heals poison, fear, stun and cut status.");
6651 int dam_sides = plev * 6;
6654 if (info) return format(_("損:1d%d/回%d", "dam:d%d/h%d"), dam_sides, heal);
6657 dispel_evil(randint1(dam_sides));
6668 if (name) return _("開かれた道", "Unbarring Ways");
6669 if (desc) return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");
6674 if (!get_aim_dir(&dir)) return NULL;
6682 if (name) return _("封魔", "Arrest");
6683 if (desc) return _("邪悪なモンスターの動きを止める。", "Attempts to paralyze an evil monster.");
6686 int power = plev * 2;
6688 if (info) return info_power(power);
6692 if (!get_aim_dir(&dir)) return NULL;
6699 if (name) return _("聖なるオーラ", "Holy Aura");
6700 if (desc) return _("一定時間、邪悪なモンスターを傷つける聖なるオーラを得る。",
6701 "Gives aura of holy power which injures evil monsters which attacked you for a while.");
6706 if (info) return info_duration(base, base);
6710 set_tim_sh_holy(randint1(base) + base, FALSE);
6716 if (name) return _("アンデッド&悪魔退散", "Dispel Undead & Demons");
6717 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与える。", "Damages all undead and demons in sight.");
6720 int sides = plev * 4;
6722 if (info) return info_damage(1, sides, 0);
6726 dispel_undead(randint1(sides));
6727 dispel_demons(randint1(sides));
6733 if (name) return _("邪悪退散", "Dispel Evil");
6734 if (desc) return _("視界内の全ての邪悪なモンスターにダメージを与える。", "Damages all evil monsters in sight.");
6737 int sides = plev * 4;
6739 if (info) return info_damage(1, sides, 0);
6743 dispel_evil(randint1(sides));
6749 if (name) return _("聖なる刃", "Holy Blade");
6750 if (desc) return _("通常の武器に滅邪の属性をつける。", "Makes current weapon especially deadly against evil monsters.");
6761 if (name) return _("スターバースト", "Star Burst");
6762 if (desc) return _("巨大な閃光の球を放つ。", "Fires a huge ball of powerful light.");
6765 int dam = 100 + plev * 2;
6768 if (info) return info_damage(0, 0, dam);
6772 if (!get_aim_dir(&dir)) return NULL;
6774 fire_ball(GF_LITE, dir, dam, rad);
6780 if (name) return _("天使召喚", "Summon Angel");
6781 if (desc) return _("天使を1体召喚する。", "Summons an angel.");
6786 bool pet = !one_in_(3);
6789 if (pet) mode |= PM_FORCE_PET;
6790 else mode |= PM_NO_PET;
6791 if (!(pet && (plev < 50))) mode |= PM_ALLOW_GROUP;
6793 if (summon_specific((pet ? -1 : 0), py, px, (plev * 3) / 2, SUMMON_ANGEL, mode))
6797 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
6801 msg_print(_("「我は汝の下僕にあらず! 悪行者よ、悔い改めよ!」", "Mortal! Repent of thy impiousness."));
6809 if (name) return _("士気高揚", "Heroism");
6810 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
6815 if (info) return info_duration(base, base);
6819 set_hero(randint1(base) + base, FALSE);
6827 if (name) return _("呪い退散", "Dispel Curse");
6828 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
6833 if (remove_all_curse())
6835 msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
6842 if (name) return _("邪悪追放", "Banish Evil");
6843 if (desc) return _("視界内の全ての邪悪なモンスターをテレポートさせる。抵抗されると無効。",
6844 "Teleports all evil monsters in sight away unless resisted.");
6849 if (info) return info_power(power);
6853 if (banish_evil(power))
6855 msg_print(_("神聖な力が邪悪を打ち払った!", "The holy power banishes evil!"));
6862 if (name) return _("ハルマゲドン", "Armageddon");
6863 if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroy everything in nearby area.");
6871 destroy_area(py, px, base + randint1(sides), FALSE);
6877 if (name) return _("目には目を", "An Eye for an Eye");
6878 if (desc) return _("一定時間、自分がダメージを受けたときに攻撃を行ったモンスターに対して同等のダメージを与える。",
6879 "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.");
6884 if (info) return info_duration(base, base);
6888 set_tim_eyeeye(randint1(base) + base, FALSE);
6894 if (name) return _("神の怒り", "Wrath of the God");
6895 if (desc) return _("ターゲットの周囲に分解の球を多数落とす。", "Drops many balls of disintegration near the target.");
6898 int dam = plev * 3 + 25;
6901 if (info) return info_multi_damage(dam);
6905 if (!cast_wrath_of_the_god(dam, rad)) return NULL;
6911 if (name) return _("神威", "Divine Intervention");
6912 if (desc) return _("隣接するモンスターに聖なるダメージを与え、視界内のモンスターにダメージ、減速、朦朧、混乱、恐怖、眠りを与える。さらに体力を回復する。",
6913 "Damages all adjacent monsters with holy power. Damages and attempt to slow, stun, confuse, scare and freeze all monsters in sight. And heals HP.");
6916 int b_dam = plev * 11;
6917 int d_dam = plev * 4;
6919 int power = plev * 4;
6921 if (info) return format(_("回%d/損%d+%d", "h%d/dm%d+%d"), heal, d_dam, b_dam/2);
6924 project(0, 1, py, px, b_dam, GF_HOLY_FIRE, PROJECT_KILL, -1);
6925 dispel_monsters(d_dam);
6926 slow_monsters(plev);
6927 stun_monsters(power);
6928 confuse_monsters(power);
6929 turn_monsters(power);
6930 stasis_monsters(power);
6937 if (name) return _("聖戦", "Crusade");
6938 if (desc) return _("視界内の善良なモンスターをペットにしようとし、ならなかった場合及び善良でないモンスターを恐怖させる。さらに多数の加速された騎士を召喚し、ヒーロー、祝福、加速、対邪悪結界を得る。",
6939 "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.");
6945 int sp_sides = 20 + plev;
6950 for (i = 0; i < 12; i++)
6957 scatter(&my, &mx, py, px, 4, 0);
6959 /* Require empty grids */
6960 if (cave_empty_bold2(my, mx)) break;
6962 if (attempt < 0) continue;
6963 summon_specific(-1, my, mx, plev, SUMMON_KNIGHTS, (PM_ALLOW_GROUP | PM_FORCE_PET | PM_HASTE));
6965 set_hero(randint1(base) + base, FALSE);
6966 set_blessed(randint1(base) + base, FALSE);
6967 set_fast(randint1(sp_sides) + sp_base, FALSE);
6968 set_protevil(randint1(base) + base, FALSE);
6982 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP)
6983 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
6985 static cptr do_music_spell(int spell, int mode)
6987 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
6988 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
6989 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
6990 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
6991 bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
6992 bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
6993 bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
6994 static const char s_dam[] = _("損傷:", "dam ");
6997 int plev = p_ptr->lev;
7002 if (name) return _("遅鈍の歌", "Song of Holding");
7003 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
7005 /* Stop singing before start another */
7006 if (cast || fail) stop_singing();
7010 msg_print(_("ゆっくりとしたメロディを口ずさみ始めた...", "You start humming a slow, steady melody..."));
7011 start_singing(spell, MUSIC_SLOW);
7017 if (info) return info_power(power);
7021 slow_monsters(plev);
7027 if (name) return _("祝福の歌", "Song of Blessing");
7028 if (desc) return _("命中率とACのボーナスを得る。", "Gives bonus to hit and AC for a few turns.");
7030 /* Stop singing before start another */
7031 if (cast || fail) stop_singing();
7035 msg_print(_("厳かなメロディを奏で始めた...", "The holy power of the Music of the Ainur enters you..."));
7036 start_singing(spell, MUSIC_BLESS);
7041 if (!p_ptr->blessed)
7043 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
7050 if (name) return _("崩壊の音色", "Wrecking Note");
7051 if (desc) return _("轟音のボルトを放つ。", "Fires a bolt of sound.");
7053 /* Stop singing before start another */
7054 if (cast || fail) stop_singing();
7057 int dice = 4 + (plev - 1) / 5;
7060 if (info) return info_damage(dice, sides, 0);
7064 if (!get_aim_dir(&dir)) return NULL;
7066 fire_bolt(GF_SOUND, dir, damroll(dice, sides));
7072 if (name) return _("朦朧の旋律", "Stun Pattern");
7073 if (desc) return _("視界内の全てのモンスターを朦朧させる。抵抗されると無効。", "Attempts to stun all monsters in sight.");
7075 /* Stop singing before start another */
7076 if (cast || fail) stop_singing();
7080 msg_print(_("眩惑させるメロディを奏で始めた...", "You weave a pattern of sounds to bewilder and daze..."));
7081 start_singing(spell, MUSIC_STUN);
7085 int dice = plev / 10;
7088 if (info) return info_power_dice(dice, sides);
7092 stun_monsters(damroll(dice, sides));
7099 if (name) return _("生命の流れ", "Flow of Life");
7100 if (desc) return _("体力を少し回復させる。", "Heals HP a little.");
7102 /* Stop singing before start another */
7103 if (cast || fail) stop_singing();
7107 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing a song of healing..."));
7108 start_singing(spell, MUSIC_L_LIFE);
7115 if (info) return info_heal(dice, sides, 0);
7119 hp_player(damroll(dice, sides));
7126 if (name) return _("太陽の歌", "Song of the Sun");
7127 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
7129 /* Stop singing before start another */
7130 if (cast || fail) stop_singing();
7134 int sides = plev / 2;
7135 int rad = plev / 10 + 1;
7137 if (info) return info_damage(dice, sides, 0);
7141 msg_print(_("光り輝く歌が辺りを照らした。", "Your uplifting song brings brightness to dark places..."));
7142 lite_area(damroll(dice, sides), rad);
7148 if (name) return _("恐怖の歌", "Song of Fear");
7149 if (desc) return _("視界内の全てのモンスターを恐怖させる。抵抗されると無効。", "Attempts to scare all monsters in sight.");
7151 /* Stop singing before start another */
7152 if (cast || fail) stop_singing();
7156 msg_print(_("おどろおどろしいメロディを奏で始めた...", "You start weaving a fearful pattern..."));
7157 start_singing(spell, MUSIC_FEAR);
7163 if (info) return info_power(power);
7167 project_hack(GF_TURN_ALL, power);
7174 if (name) return _("戦いの歌", "Heroic Ballad");
7175 if (desc) return _("ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
7177 /* Stop singing before start another */
7178 if (cast || fail) stop_singing();
7182 msg_print(_("激しい戦いの歌を歌った...", "You start singing a song of intense fighting..."));
7184 (void)hp_player(10);
7185 (void)set_afraid(0);
7187 /* Recalculate hitpoints */
7188 p_ptr->update |= (PU_HP);
7190 start_singing(spell, MUSIC_HERO);
7197 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
7198 /* Recalculate hitpoints */
7199 p_ptr->update |= (PU_HP);
7206 if (name) return _("霊的知覚", "Clairaudience");
7207 if (desc) return _("近くの罠/扉/階段を感知する。レベル15で全てのモンスター、20で財宝とアイテムを感知できるようになる。レベル25で周辺の地形を感知し、40でその階全体を永久に照らし、ダンジョン内のすべてのアイテムを感知する。この効果は歌い続けることで順に起こる。",
7208 "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.");
7210 /* Stop singing before start another */
7211 if (cast || fail) stop_singing();
7215 msg_print(_("静かな音楽が感覚を研ぎ澄まさせた...", "Your quiet music sharpens your sense of hearing..."));
7216 /* Hack -- Initialize the turn count */
7217 p_ptr->magic_num1[2] = 0;
7219 start_singing(spell, MUSIC_DETECT);
7223 int rad = DETECT_RAD_DEFAULT;
7225 if (info) return info_radius(rad);
7229 int count = p_ptr->magic_num1[2];
7231 if (count >= 19) wiz_lite(FALSE);
7235 if (plev > 39 && count < 19)
7236 p_ptr->magic_num1[2] = count + 1;
7240 /* There are too many hidden treasure. So... */
7241 /* detect_treasure(rad); */
7242 detect_objects_gold(rad);
7243 detect_objects_normal(rad);
7245 if (plev > 24 && count < 11)
7246 p_ptr->magic_num1[2] = count + 1;
7250 detect_monsters_invis(rad);
7251 detect_monsters_normal(rad);
7253 if (plev > 19 && count < 6)
7254 p_ptr->magic_num1[2] = count + 1;
7256 detect_traps(rad, TRUE);
7260 if (plev > 14 && count < 3)
7261 p_ptr->magic_num1[2] = count + 1;
7268 if (name) return _("魂の歌", "Soul Shriek");
7269 if (desc) return _("視界内の全てのモンスターに対して精神攻撃を行う。", "Damages all monsters in sight with PSI damages.");
7271 /* Stop singing before start another */
7272 if (cast || fail) stop_singing();
7276 msg_print(_("精神を捻じ曲げる歌を歌った...", "You start singing a song of soul in pain..."));
7277 start_singing(spell, MUSIC_PSI);
7282 int sides = plev * 3 / 2;
7284 if (info) return info_damage(dice, sides, 0);
7288 project_hack(GF_PSI, damroll(dice, sides));
7295 if (name) return _("知識の歌", "Song of Lore");
7296 if (desc) return _("自分のいるマスと隣りのマスに落ちているアイテムを鑑定する。", "Identifies all items which are in the adjacent squares.");
7298 /* Stop singing before start another */
7299 if (cast || fail) stop_singing();
7303 msg_print(_("この世界の知識が流れ込んできた...", "You recall the rich lore of the world..."));
7304 start_singing(spell, MUSIC_ID);
7310 if (info) return info_radius(rad);
7314 * MP不足で鑑定が発動される前に歌が中断してしまうのを防止。
7318 project(0, rad, py, px, 0, GF_IDENTIFY, PROJECT_ITEM, -1);
7325 if (name) return _("隠遁の歌", "Hiding Tune");
7326 if (desc) return _("隠密行動能力を上昇させる。", "Gives improved stealth.");
7328 /* Stop singing before start another */
7329 if (cast || fail) stop_singing();
7333 msg_print(_("あなたの姿が景色にとけこんでいった...", "Your song carries you beyond the sight of mortal eyes..."));
7334 start_singing(spell, MUSIC_STEALTH);
7339 if (!p_ptr->tim_stealth)
7341 msg_print(_("姿がはっきりと見えるようになった。", "You are no longer hided."));
7348 if (name) return _("幻影の旋律", "Illusion Pattern");
7349 if (desc) return _("視界内の全てのモンスターを混乱させる。抵抗されると無効。", "Attempts to confuse all monsters in sight.");
7351 /* Stop singing before start another */
7352 if (cast || fail) stop_singing();
7356 msg_print(_("辺り一面に幻影が現れた...", "You weave a pattern of sounds to beguile and confuse..."));
7357 start_singing(spell, MUSIC_CONF);
7361 int power = plev * 2;
7363 if (info) return info_power(power);
7367 confuse_monsters(power);
7374 if (name) return _("破滅の叫び", "Doomcall");
7375 if (desc) return _("視界内の全てのモンスターに対して轟音攻撃を行う。", "Damages all monsters in sight with booming sound.");
7377 /* Stop singing before start another */
7378 if (cast || fail) stop_singing();
7382 msg_print(_("轟音が響いた...", "The fury of the Downfall of Numenor lashes out..."));
7383 start_singing(spell, MUSIC_SOUND);
7387 int dice = 10 + plev / 5;
7390 if (info) return info_damage(dice, sides, 0);
7394 project_hack(GF_SOUND, damroll(dice, sides));
7401 if (name) return _("フィリエルの歌", "Firiel's Song");
7402 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
7405 /* Stop singing before start another */
7406 if (cast || fail) stop_singing();
7410 msg_print(_("生命と復活のテーマを奏で始めた...", "The themes of life and revival are woven into your song..."));
7411 animate_dead(0, py, px);
7417 if (name) return _("旅の仲間", "Fellowship Chant");
7418 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
7420 /* Stop singing before start another */
7421 if (cast || fail) stop_singing();
7425 msg_print(_("安らかなメロディを奏で始めた...", "You weave a slow, soothing melody of imploration..."));
7426 start_singing(spell, MUSIC_CHARM);
7430 int dice = 10 + plev / 15;
7433 if (info) return info_power_dice(dice, sides);
7437 charm_monsters(damroll(dice, sides));
7444 if (name) return _("分解音波", "Sound of disintegration");
7445 if (desc) return _("壁を掘り進む。自分の足元のアイテムは蒸発する。", "Makes you be able to burrow into walls. Objects under your feet evaporate.");
7447 /* Stop singing before start another */
7448 if (cast || fail) stop_singing();
7452 msg_print(_("粉砕するメロディを奏で始めた...", "You weave a violent pattern of sounds to break wall."));
7453 start_singing(spell, MUSIC_WALL);
7459 * MP不足で効果が発動される前に歌が中断してしまうのを防止。
7463 project(0, 0, py, px,
7464 0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1);
7470 if (name) return _("元素耐性", "Finrod's Resistance");
7471 if (desc) return _("酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
7472 "Gives resistance to fire, cold, electricity, acid and poison. These resistances can be added to which from equipment for more powerful resistances.");
7474 /* Stop singing before start another */
7475 if (cast || fail) stop_singing();
7479 msg_print(_("元素の力に対する忍耐の歌を歌った。", "You sing a song of perseverance against powers..."));
7480 start_singing(spell, MUSIC_RESIST);
7485 if (!p_ptr->oppose_acid)
7487 msg_print(_("酸への耐性が薄れた気がする。", "You feel less resistant to acid."));
7490 if (!p_ptr->oppose_elec)
7492 msg_print(_("電撃への耐性が薄れた気がする。", "You feel less resistant to elec."));
7495 if (!p_ptr->oppose_fire)
7497 msg_print(_("火への耐性が薄れた気がする。", "You feel less resistant to fire."));
7500 if (!p_ptr->oppose_cold)
7502 msg_print(_("冷気への耐性が薄れた気がする。", "You feel less resistant to cold."));
7505 if (!p_ptr->oppose_pois)
7507 msg_print(_("毒への耐性が薄れた気がする。", "You feel less resistant to pois."));
7514 if (name) return _("ホビットのメロディ", "Hobbit Melodies");
7515 if (desc) return _("加速する。", "Hastes you.");
7517 /* Stop singing before start another */
7518 if (cast || fail) stop_singing();
7522 msg_print(_("軽快な歌を口ずさみ始めた...", "You start singing joyful pop song..."));
7523 start_singing(spell, MUSIC_SPEED);
7530 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
7537 if (name) return _("歪んだ世界", "World Contortion");
7538 if (desc) return _("近くのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all nearby monsters away unless resisted.");
7541 int rad = plev / 15 + 1;
7542 int power = plev * 3 + 1;
7544 if (info) return info_radius(rad);
7546 /* Stop singing before start another */
7547 if (cast || fail) stop_singing();
7551 msg_print(_("歌が空間を歪めた...", "Reality whirls wildly as you sing a dizzying melody..."));
7552 project(0, rad, py, px, power, GF_AWAY_ALL, PROJECT_KILL, -1);
7558 if (name) return _("退散の歌", "Dispelling chant");
7559 if (desc) return _("視界内の全てのモンスターにダメージを与える。邪悪なモンスターに特に大きなダメージを与える。",
7560 "Damages all monsters in sight. Hurts evil monsters greatly.");
7562 /* Stop singing before start another */
7563 if (cast || fail) stop_singing();
7567 msg_print(_("耐えられない不協和音が敵を責め立てた...", "You cry out in an ear-wracking voice..."));
7568 start_singing(spell, MUSIC_DISPEL);
7572 int m_sides = plev * 3;
7573 int e_sides = plev * 3;
7575 if (info) return format("%s1d%d+1d%d", s_dam, m_sides, e_sides);
7579 dispel_monsters(randint1(m_sides));
7580 dispel_evil(randint1(e_sides));
7586 if (name) return _("サルマンの甘言", "The Voice of Saruman");
7587 if (desc) return _("視界内の全てのモンスターを減速させ、眠らせようとする。抵抗されると無効。", "Attempts to slow and sleep all monsters in sight.");
7589 /* Stop singing before start another */
7590 if (cast || fail) stop_singing();
7594 msg_print(_("優しく、魅力的な歌を口ずさみ始めた...", "You start humming a gentle and attractive song..."));
7595 start_singing(spell, MUSIC_SARUMAN);
7601 if (info) return info_power(power);
7605 slow_monsters(plev);
7606 sleep_monsters(plev);
7613 if (name) return _("嵐の音色", "Song of the Tempest");
7614 if (desc) return _("轟音のビームを放つ。", "Fires a beam of sound.");
7617 int dice = 15 + (plev - 1) / 2;
7620 if (info) return info_damage(dice, sides, 0);
7622 /* Stop singing before start another */
7623 if (cast || fail) stop_singing();
7627 if (!get_aim_dir(&dir)) return NULL;
7629 fire_beam(GF_SOUND, dir, damroll(dice, sides));
7635 if (name) return _("もう一つの世界", "Ambarkanta");
7636 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
7642 if (info) return info_delay(base, sides);
7644 /* Stop singing before start another */
7645 if (cast || fail) stop_singing();
7649 msg_print(_("周囲が変化し始めた...", "You sing of the primeval shaping of Middle-earth..."));
7656 if (name) return _("破壊の旋律", "Wrecking Pattern");
7657 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
7658 "Shakes dungeon structure, and results in random swapping of floors and walls.");
7660 /* Stop singing before start another */
7661 if (cast || fail) stop_singing();
7665 msg_print(_("破壊的な歌が響きわたった...", "You weave a pattern of sounds to contort and shatter..."));
7666 start_singing(spell, MUSIC_QUAKE);
7672 if (info) return info_radius(rad);
7676 earthquake(py, px, 10);
7684 if (name) return _("停滞の歌", "Stationary Shriek");
7685 if (desc) return _("視界内の全てのモンスターを麻痺させようとする。抵抗されると無効。", "Attempts to freeze all monsters in sight.");
7687 /* Stop singing before start another */
7688 if (cast || fail) stop_singing();
7692 msg_print(_("ゆっくりとしたメロディを奏で始めた...", "You weave a very slow pattern which is almost likely to stop..."));
7693 start_singing(spell, MUSIC_STASIS);
7697 int power = plev * 4;
7699 if (info) return info_power(power);
7703 stasis_monsters(power);
7710 if (name) return _("守りの歌", "Endurance");
7711 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。",
7712 "Sets a glyph on the floor beneath you. Monsters cannot attack you if you are on a glyph, but can try to break glyph.");
7715 /* Stop singing before start another */
7716 if (cast || fail) stop_singing();
7720 msg_print(_("歌が神聖な場を作り出した...", "The holy power of the Music is creating sacred field..."));
7727 if (name) return _("英雄の詩", "The Hero's Poem");
7728 if (desc) return _("加速し、ヒーロー気分になり、視界内の全てのモンスターにダメージを与える。",
7729 "Hastes you. Gives heroism. Damages all monsters in sight.");
7731 /* Stop singing before start another */
7732 if (cast || fail) stop_singing();
7736 msg_print(_("英雄の歌を口ずさんだ...", "You chant a powerful, heroic call to arms..."));
7737 (void)hp_player(10);
7738 (void)set_afraid(0);
7740 /* Recalculate hitpoints */
7741 p_ptr->update |= (PU_HP);
7743 start_singing(spell, MUSIC_SHERO);
7750 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
7751 /* Recalculate hitpoints */
7752 p_ptr->update |= (PU_HP);
7757 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
7763 int sides = plev * 3;
7765 if (info) return info_damage(dice, sides, 0);
7769 dispel_monsters(damroll(dice, sides));
7775 if (name) return _("ヤヴァンナの助け", "Relief of Yavanna");
7776 if (desc) return _("強力な回復の歌で、負傷と朦朧状態も全快する。", "Powerful healing song. Also heals cut and stun completely.");
7778 /* Stop singing before start another */
7779 if (cast || fail) stop_singing();
7783 msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing the song..."));
7784 start_singing(spell, MUSIC_H_LIFE);
7791 if (info) return info_heal(dice, sides, 0);
7795 hp_player(damroll(dice, sides));
7804 if (name) return _("再生の歌", "Goddess' rebirth");
7805 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
7808 /* Stop singing before start another */
7809 if (cast || fail) stop_singing();
7813 msg_print(_("暗黒の中に光と美をふりまいた。体が元の活力を取り戻した。",
7814 "You strewed light and beauty in the dark as you sing. You feel refreshed."));
7815 (void)do_res_stat(A_STR);
7816 (void)do_res_stat(A_INT);
7817 (void)do_res_stat(A_WIS);
7818 (void)do_res_stat(A_DEX);
7819 (void)do_res_stat(A_CON);
7820 (void)do_res_stat(A_CHR);
7821 (void)restore_level();
7827 if (name) return _("サウロンの魔術", "Wizardry of Sauron");
7828 if (desc) return _("非常に強力でごく小さい轟音の球を放つ。", "Fires an extremely powerful tiny ball of sound.");
7831 int dice = 50 + plev;
7835 if (info) return info_damage(dice, sides, 0);
7837 /* Stop singing before start another */
7838 if (cast || fail) stop_singing();
7842 if (!get_aim_dir(&dir)) return NULL;
7844 fire_ball(GF_SOUND, dir, damroll(dice, sides), rad);
7850 if (name) return _("フィンゴルフィンの挑戦", "Fingolfin's Challenge");
7851 if (desc) return _("ダメージを受けなくなるバリアを張る。",
7852 "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks.");
7854 /* Stop singing before start another */
7855 if (cast || fail) stop_singing();
7859 msg_print(_("フィンゴルフィンの冥王への挑戦を歌った...",
7860 "You recall the valor of Fingolfin's challenge to the Dark Lord..."));
7863 p_ptr->redraw |= (PR_MAP);
7865 /* Update monsters */
7866 p_ptr->update |= (PU_MONSTERS);
7869 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
7871 start_singing(spell, MUSIC_INVULN);
7878 msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));
7880 p_ptr->redraw |= (PR_MAP);
7882 /* Update monsters */
7883 p_ptr->update |= (PU_MONSTERS);
7886 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
7899 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_CAST)
7900 * @return SPELL_NAME / SPELL_DESC 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
7902 static cptr do_hissatsu_spell(int spell, int mode)
7904 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
7905 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
7906 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
7909 int plev = p_ptr->lev;
7914 if (name) return _("飛飯綱", "Tobi-Izuna");
7915 if (desc) return _("2マス離れたところにいるモンスターを攻撃する。", "Attacks a two squares distant monster.");
7920 if (!get_aim_dir(&dir)) return NULL;
7922 project_hook(GF_ATTACK, dir, HISSATSU_2, PROJECT_STOP | PROJECT_KILL);
7927 if (name) return _("五月雨斬り", "3-Way Attack");
7928 if (desc) return _("3方向に対して攻撃する。", "Attacks in 3 directions in one time.");
7935 if (!get_rep_dir2(&dir)) return NULL;
7936 if (dir == 5) return NULL;
7938 for (cdir = 0;cdir < 8; cdir++)
7940 if (cdd[cdir] == dir) break;
7943 if (cdir == 8) return NULL;
7945 y = py + ddy_cdd[cdir];
7946 x = px + ddx_cdd[cdir];
7947 if (cave[y][x].m_idx)
7950 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
7952 y = py + ddy_cdd[(cdir + 7) % 8];
7953 x = px + ddx_cdd[(cdir + 7) % 8];
7954 if (cave[y][x].m_idx)
7957 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
7959 y = py + ddy_cdd[(cdir + 1) % 8];
7960 x = px + ddx_cdd[(cdir + 1) % 8];
7961 if (cave[y][x].m_idx)
7964 msg_print(_("攻撃は空を切った。", "You attack the empty air."));
7969 if (name) return _("ブーメラン", "Boomerang");
7970 if (desc) return _("武器を手元に戻ってくるように投げる。戻ってこないこともある。",
7971 "Throws current weapon. And it'll return to your hand unless failed.");
7975 if (!do_cmd_throw_aux(1, TRUE, -1)) return NULL;
7980 if (name) return _("焔霊", "Burning Strike");
7981 if (desc) return _("火炎耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to fire.");
7987 if (!get_rep_dir2(&dir)) return NULL;
7988 if (dir == 5) return NULL;
7993 if (cave[y][x].m_idx)
7994 py_attack(y, x, HISSATSU_FIRE);
7997 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8004 if (name) return _("殺気感知", "Detect Ferocity");
8005 if (desc) return _("近くの思考することができるモンスターを感知する。", "Detects all monsters except mindless in your vicinity.");
8009 detect_monsters_mind(DETECT_RAD_DEFAULT);
8014 if (name) return _("みね打ち", "Strike to Stun");
8015 if (desc) return _("相手にダメージを与えないが、朦朧とさせる。", "Attempts to stun a monster in the adjacent.");
8021 if (!get_rep_dir2(&dir)) return NULL;
8022 if (dir == 5) return NULL;
8027 if (cave[y][x].m_idx)
8028 py_attack(y, x, HISSATSU_MINEUCHI);
8031 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8038 if (name) return _("カウンター", "Counter");
8039 if (desc) return _("相手に攻撃されたときに反撃する。反撃するたびにMPを消費。",
8040 "Prepares to counterattack. When attack by a monster, strikes back using SP each time.");
8046 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
8049 msg_print(_("相手の攻撃に対して身構えた。", "You prepare to counter blow."));
8050 p_ptr->counter = TRUE;
8055 if (name) return _("払い抜け", "Harainuke");
8056 if (desc) return _("攻撃した後、反対側に抜ける。",
8057 "Attacks monster with your weapons normally, then move through counter side of the monster.");
8065 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));
8069 if (!get_rep_dir2(&dir)) return NULL;
8071 if (dir == 5) return NULL;
8075 if (!cave[y][x].m_idx)
8077 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8083 if (!player_can_enter(cave[y][x].feat, 0) || is_trap(cave[y][x].feat))
8089 if (player_can_enter(cave[y][x].feat, 0) && !is_trap(cave[y][x].feat) && !cave[y][x].m_idx)
8093 /* Move the player */
8094 (void)move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);
8100 if (name) return _("サーペンツタン", "Serpent's Tongue");
8101 if (desc) return _("毒耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to poison.");
8107 if (!get_rep_dir2(&dir)) return NULL;
8108 if (dir == 5) return NULL;
8113 if (cave[y][x].m_idx)
8114 py_attack(y, x, HISSATSU_POISON);
8117 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8124 if (name) return _("斬魔剣弐の太刀", "Zammaken");
8125 if (desc) return _("生命のない邪悪なモンスターに大ダメージを与えるが、他のモンスターには全く効果がない。",
8126 "Attacks an evil unliving monster with great damage. No effect to other monsters.");
8132 if (!get_rep_dir2(&dir)) return NULL;
8133 if (dir == 5) return NULL;
8138 if (cave[y][x].m_idx)
8139 py_attack(y, x, HISSATSU_ZANMA);
8142 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8149 if (name) return _("裂風剣", "Wind Blast");
8150 if (desc) return _("攻撃した相手を後方へ吹き飛ばす。", "Attacks an adjacent monster, and blow it away.");
8156 if (!get_rep_dir2(&dir)) return NULL;
8157 if (dir == 5) return NULL;
8162 if (cave[y][x].m_idx)
8166 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8169 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
8173 if (cave[y][x].m_idx)
8178 int m_idx = cave[y][x].m_idx;
8179 monster_type *m_ptr = &m_list[m_idx];
8182 monster_desc(m_name, m_ptr, 0);
8184 for (i = 0; i < 5; i++)
8188 if (cave_empty_bold(y, x))
8195 if ((ty != oy) || (tx != ox))
8197 msg_format(_("%sを吹き飛ばした!", "You blow %s away!"), m_name);
8198 cave[oy][ox].m_idx = 0;
8199 cave[ty][tx].m_idx = m_idx;
8203 update_mon(m_idx, TRUE);
8207 if (r_info[m_ptr->r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))
8208 p_ptr->update |= (PU_MON_LITE);
8215 if (name) return _("刀匠の目利き", "Judge");
8216 if (desc) return _("武器・防具を1つ識別する。レベル45以上で武器・防具の能力を完全に知ることができる。",
8217 "Identifies a weapon or armor. Or *identifies* these at level 45.");
8223 if (!identify_fully(TRUE)) return NULL;
8227 if (!ident_spell(TRUE)) return NULL;
8233 if (name) return _("破岩斬", "Rock Smash");
8234 if (desc) return _("岩を壊し、岩石系のモンスターに大ダメージを与える。", "Breaks rock. Or greatly damage a monster made by rocks.");
8240 if (!get_rep_dir2(&dir)) return NULL;
8241 if (dir == 5) return NULL;
8246 if (cave[y][x].m_idx)
8247 py_attack(y, x, HISSATSU_HAGAN);
8249 if (!cave_have_flag_bold(y, x, FF_HURT_ROCK)) break;
8251 /* Destroy the feature */
8252 cave_alter_feat(y, x, FF_HURT_ROCK);
8254 /* Update some things */
8255 p_ptr->update |= (PU_FLOW);
8260 if (name) return _("乱れ雪月花", "Midare-Setsugekka");
8261 if (desc) return _("攻撃回数が増え、冷気耐性のないモンスターに大ダメージを与える。",
8262 "Attacks a monster with increased number of attacks and more damage unless it has resistance to cold.");
8268 if (!get_rep_dir2(&dir)) return NULL;
8269 if (dir == 5) return NULL;
8274 if (cave[y][x].m_idx)
8275 py_attack(y, x, HISSATSU_COLD);
8278 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8285 if (name) return _("急所突き", "Spot Aiming");
8286 if (desc) return _("モンスターを一撃で倒す攻撃を繰り出す。失敗すると1点しかダメージを与えられない。",
8287 "Attempts to kill a monster instantly. If failed cause only 1HP of damage.");
8293 if (!get_rep_dir2(&dir)) return NULL;
8294 if (dir == 5) return NULL;
8299 if (cave[y][x].m_idx)
8300 py_attack(y, x, HISSATSU_KYUSHO);
8303 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8310 if (name) return _("魔神斬り", "Majingiri");
8311 if (desc) return _("会心の一撃で攻撃する。攻撃がかわされやすい。",
8312 "Attempts to attack with critical hit. But this attack is easy to evade for a monster.");
8318 if (!get_rep_dir2(&dir)) return NULL;
8319 if (dir == 5) return NULL;
8324 if (cave[y][x].m_idx)
8325 py_attack(y, x, HISSATSU_MAJIN);
8328 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8335 if (name) return _("捨て身", "Desperate Attack");
8336 if (desc) return _("強力な攻撃を繰り出す。次のターンまでの間、食らうダメージが増える。",
8337 "Attacks with all of your power. But all damages you take will be doubled for one turn.");
8343 if (!get_rep_dir2(&dir)) return NULL;
8344 if (dir == 5) return NULL;
8349 if (cave[y][x].m_idx)
8350 py_attack(y, x, HISSATSU_SUTEMI);
8353 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8356 p_ptr->sutemi = TRUE;
8361 if (name) return _("雷撃鷲爪斬", "Lightning Eagle");
8362 if (desc) return _("電撃耐性のないモンスターに非常に大きいダメージを与える。",
8363 "Attacks a monster with more damage unless it has resistance to electricity.");
8369 if (!get_rep_dir2(&dir)) return NULL;
8370 if (dir == 5) return NULL;
8375 if (cave[y][x].m_idx)
8376 py_attack(y, x, HISSATSU_ELEC);
8379 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8386 if (name) return _("入身", "Rush Attack");
8387 if (desc) return _("素早く相手に近寄り攻撃する。", "Steps close to a monster and attacks at a time.");
8391 if (!rush_attack(NULL)) return NULL;
8396 if (name) return _("赤流渦", "Bloody Maelstrom");
8397 if (desc) return _("自分自身も傷を作りつつ、その傷が深いほど大きい威力で全方向の敵を攻撃できる。生きていないモンスターには効果がない。",
8398 "Attacks all adjacent monsters with power corresponding to your cut status. Then increases your cut status. No effect to unliving monsters.");
8405 monster_type *m_ptr;
8407 if (p_ptr->cut < 300)
8408 set_cut(p_ptr->cut + 300);
8410 set_cut(p_ptr->cut * 2);
8412 for (dir = 0; dir < 8; dir++)
8414 y = py + ddy_ddd[dir];
8415 x = px + ddx_ddd[dir];
8416 c_ptr = &cave[y][x];
8418 /* Get the monster */
8419 m_ptr = &m_list[c_ptr->m_idx];
8421 /* Hack -- attack monsters */
8422 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
8424 if (!monster_living(&r_info[m_ptr->r_idx]))
8428 monster_desc(m_name, m_ptr, 0);
8429 msg_format(_("%sには効果がない!", "%s is unharmed!"), m_name);
8431 else py_attack(y, x, HISSATSU_SEKIRYUKA);
8438 if (name) return _("激震撃", "Earthquake Blow");
8439 if (desc) return _("地震を起こす。", "Shakes dungeon structure, and results in random swapping of floors and walls.");
8445 if (!get_rep_dir2(&dir)) return NULL;
8446 if (dir == 5) return NULL;
8451 if (cave[y][x].m_idx)
8452 py_attack(y, x, HISSATSU_QUAKE);
8454 earthquake(py, px, 10);
8459 if (name) return _("地走り", "Crack");
8460 if (desc) return _("衝撃波のビームを放つ。", "Fires a beam of shock wave.");
8464 int total_damage = 0, basedam, i;
8465 u32b flgs[TR_FLAG_SIZE];
8467 if (!get_aim_dir(&dir)) return NULL;
8468 msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
8469 for (i = 0; i < 2; i++)
8473 if (!buki_motteruka(INVEN_RARM+i)) break;
8474 o_ptr = &inventory[INVEN_RARM+i];
8475 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
8476 damage = o_ptr->to_d * 100;
8477 object_flags(o_ptr, flgs);
8478 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
8484 else if (have_flag(flgs, TR_VORPAL))
8486 /* vorpal flag only */
8491 damage *= p_ptr->num_blow[i];
8492 total_damage += damage / 200;
8493 if (i) total_damage = total_damage*7/10;
8495 fire_beam(GF_FORCE, dir, total_damage);
8500 if (name) return _("気迫の雄叫び", "War Cry");
8501 if (desc) return _("視界内の全モンスターに対して轟音の攻撃を行う。さらに、近くにいるモンスターを怒らせる。",
8502 "Damages all monsters in sight with sound. Aggravate nearby monsters.");
8506 msg_print(_("雄叫びをあげた!", "You roar out!"));
8507 project_hack(GF_SOUND, randint1(plev * 3));
8508 aggravate_monsters(0);
8513 if (name) return _("無双三段", "Musou-Sandan");
8514 if (desc) return _("強力な3段攻撃を繰り出す。", "Attacks with powerful 3 strikes.");
8520 if (!get_rep_dir2(&dir)) return NULL;
8521 if (dir == 5) return NULL;
8523 for (i = 0; i < 3; i++)
8529 monster_type *m_ptr;
8533 c_ptr = &cave[y][x];
8536 py_attack(y, x, HISSATSU_3DAN);
8539 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8543 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
8548 /* Monster is dead? */
8549 if (!c_ptr->m_idx) break;
8553 m_idx = c_ptr->m_idx;
8554 m_ptr = &m_list[m_idx];
8556 /* Monster cannot move back? */
8557 if (!monster_can_enter(ny, nx, &r_info[m_ptr->r_idx], 0))
8560 if (i < 2) msg_print(NULL);
8565 cave[ny][nx].m_idx = m_idx;
8569 update_mon(m_idx, TRUE);
8571 /* Redraw the old spot */
8574 /* Redraw the new spot */
8577 /* Player can move forward? */
8578 if (player_can_enter(c_ptr->feat, 0))
8580 /* Move the player */
8581 if (!move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP)) break;
8589 if (i < 2) msg_print(NULL);
8595 if (name) return _("吸血鬼の牙", "Vampire's Fang");
8596 if (desc) return _("攻撃した相手の体力を吸いとり、自分の体力を回復させる。生命を持たないモンスターには通じない。",
8597 "Attacks with vampiric strikes which absorbs HP from a monster and gives them to you. No effect to unliving monsters.");
8603 if (!get_rep_dir2(&dir)) return NULL;
8604 if (dir == 5) return NULL;
8609 if (cave[y][x].m_idx)
8610 py_attack(y, x, HISSATSU_DRAIN);
8613 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8620 if (name) return _("幻惑", "Moon Dazzling");
8621 if (desc) return _("視界内の起きている全モンスターに朦朧、混乱、眠りを与えようとする。", "Attempts to stun, confuse and sleep all waking monsters.");
8625 msg_print(_("武器を不規則に揺らした...", "You irregularly wave your weapon..."));
8626 project_hack(GF_ENGETSU, plev * 4);
8627 project_hack(GF_ENGETSU, plev * 4);
8628 project_hack(GF_ENGETSU, plev * 4);
8633 if (name) return _("百人斬り", "Hundred Slaughter");
8634 if (desc) return _("連続して入身でモンスターを攻撃する。攻撃するたびにMPを消費。MPがなくなるか、モンスターを倒せなかったら百人斬りは終了する。",
8635 "Performs a series of rush attacks. The series continues while killing each monster in a time and SP remains.");
8639 const int mana_cost_per_monster = 8;
8645 if (!rush_attack(&mdeath)) break;
8648 /* Reserve needed mana point */
8649 p_ptr->csp -= technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
8653 p_ptr->csp -= mana_cost_per_monster;
8658 p_ptr->redraw |= PR_MANA;
8661 while (p_ptr->csp > mana_cost_per_monster);
8663 if (is_new) return NULL;
8665 /* Restore reserved mana */
8666 p_ptr->csp += technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;
8671 if (name) return _("天翔龍閃", "Dragonic Flash");
8672 if (desc) return _("視界内の場所を指定して、その場所と自分の間にいる全モンスターを攻撃し、その場所に移動する。",
8673 "Runs toward given location while attacking all monsters on the path.");
8679 if (!tgt_pt(&x, &y)) return NULL;
8681 if (!cave_player_teleportable_bold(y, x, 0L) ||
8682 (distance(y, x, py, px) > MAX_SIGHT / 2) ||
8683 !projectable(py, px, y, x))
8685 msg_print(_("失敗!", "You cannot move to that place!"));
8688 if (p_ptr->anti_tele)
8690 msg_print(_("不思議な力がテレポートを防いだ!", "A mysterious force prevents you from teleporting!"));
8693 project(0, 0, y, x, HISSATSU_ISSEN, GF_ATTACK, PROJECT_BEAM | PROJECT_KILL, -1);
8694 teleport_player_to(y, x, 0L);
8699 if (name) return _("二重の剣撃", "Twin Slash");
8700 if (desc) return _("1ターンで2度攻撃を行う。", "double attacks at a time.");
8706 if (!get_rep_dir(&dir, FALSE)) return NULL;
8711 if (cave[y][x].m_idx)
8714 if (cave[y][x].m_idx)
8722 msg_print(_("その方向にはモンスターはいません。", "You don't see any monster in this direction"));
8729 if (name) return _("虎伏絶刀勢", "Kofuku-Zettousei");
8730 if (desc) return _("強力な攻撃を行い、近くの場所にも効果が及ぶ。", "Performs a powerful attack which even effect nearby monsters.");
8734 int total_damage = 0, basedam, i;
8736 u32b flgs[TR_FLAG_SIZE];
8739 if (!get_rep_dir2(&dir)) return NULL;
8740 if (dir == 5) return NULL;
8745 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)
8747 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));
8750 msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));
8751 for (i = 0; i < 2; i++)
8754 if (!buki_motteruka(INVEN_RARM+i)) break;
8755 o_ptr = &inventory[INVEN_RARM+i];
8756 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;
8757 damage = o_ptr->to_d * 100;
8758 object_flags(o_ptr, flgs);
8759 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))
8765 else if (have_flag(flgs, TR_VORPAL))
8767 /* vorpal flag only */
8772 damage += p_ptr->to_d[i] * 100;
8773 damage *= p_ptr->num_blow[i];
8774 total_damage += (damage / 100);
8776 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);
8781 if (name) return _("慶雲鬼忍剣", "Keiun-Kininken");
8782 if (desc) return _("自分もダメージをくらうが、相手に非常に大きなダメージを与える。アンデッドには特に効果がある。",
8783 "Attacks a monster with extremely powerful damage. But you also takes some damages. Hurts a undead monster greatly.");
8789 if (!get_rep_dir2(&dir)) return NULL;
8790 if (dir == 5) return NULL;
8795 if (cave[y][x].m_idx)
8796 py_attack(y, x, HISSATSU_UNDEAD);
8799 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));
8802 take_hit(DAMAGE_NOESCAPE, 100 + randint1(100), _("慶雲鬼忍剣を使った衝撃", "exhaustion on using Keiun-Kininken"), -1);
8807 if (name) return _("切腹", "Harakiri");
8808 if (desc) return _("「武士道とは、死ぬことと見つけたり。」", "'Busido is found in death'");
8813 if (!get_check(_("本当に自殺しますか?", "Do you really want to commit suicide? "))) return NULL;
8814 /* Special Verification for suicide */
8815 prt(_("確認のため '@' を押して下さい。", "Please verify SUICIDE by typing the '@' sign: "), 0, 0);
8820 if (i != '@') return NULL;
8821 if (p_ptr->total_winner)
8823 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
8824 p_ptr->total_winner = TRUE;
8828 msg_print(_("武士道とは、死ぬことと見つけたり。", "Meaning of Bushi-do is found in the death."));
8829 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);
8839 * @brief 呪術領域の武器呪縛の対象にできる武器かどうかを返す。 / An "item_tester_hook" for offer
8840 * @param o_ptr オブジェクト構造体の参照ポインタ
8841 * @return 呪縛可能な武器ならばTRUEを返す
8843 static bool item_tester_hook_weapon_except_bow(object_type *o_ptr)
8845 switch (o_ptr->tval)
8860 * @brief 呪術領域の各処理に使える呪われた装備かどうかを返す。 / An "item_tester_hook" for offer
8861 * @param o_ptr オブジェクト構造体の参照ポインタ
8862 * @return 使える装備ならばTRUEを返す
8864 static bool item_tester_hook_cursed(object_type *o_ptr)
8866 return (bool)(object_is_cursed(o_ptr));
8870 * @brief 呪術領域魔法の各処理を行う
8872 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_CONT / SPELL_STOP)
8873 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
8875 static cptr do_hex_spell(int spell, int mode)
8877 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
8878 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
8879 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
8880 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
8881 bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
8882 bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
8886 int plev = p_ptr->lev;
8891 /*** 1st book (0-7) ***/
8893 if (name) return _("邪なる祝福", "Evily blessing");
8894 if (desc) return _("祝福により攻撃精度と防御力が上がる。", "Attempts to increase +to_hit of a weapon and AC");
8897 if (!p_ptr->blessed)
8899 msg_print(_("高潔な気分になった!", "You feel righteous!"));
8904 if (!p_ptr->blessed)
8906 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
8912 if (name) return _("軽傷の治癒", "Cure light wounds");
8913 if (desc) return _("HPや傷を少し回復させる。", "Heals cut and HP a little.");
8914 if (info) return info_heal(1, 10, 0);
8917 msg_print(_("気分が良くなってくる。", "You feel better and better."));
8921 hp_player(damroll(1, 10));
8922 set_cut(p_ptr->cut - 10);
8927 if (name) return _("悪魔のオーラ", "Demonic aura");
8928 if (desc) return _("炎のオーラを身にまとい、回復速度が速くなる。", "Gives fire aura and regeneration.");
8931 msg_print(_("体が炎のオーラで覆われた。", "You have enveloped by fiery aura!"));
8935 msg_print(_("炎のオーラが消え去った。", "Fiery aura disappeared."));
8940 if (name) return _("悪臭霧", "Stinking mist");
8941 if (desc) return _("視界内のモンスターに微弱量の毒のダメージを与える。", "Deals few damages of poison to all monsters in your sight.");
8942 power = plev / 2 + 5;
8943 if (info) return info_damage(1, power, 0);
8946 project_hack(GF_POIS, randint1(power));
8951 if (name) return _("腕力強化", "Extra might");
8952 if (desc) return _("術者の腕力を上昇させる。", "Attempts to increase your strength.");
8955 msg_print(_("何だか力が湧いて来る。", "You feel you get stronger."));
8960 if (name) return _("武器呪縛", "Curse weapon");
8961 if (desc) return _("装備している武器を呪う。", "Curses your weapon.");
8966 char o_name[MAX_NLEN];
8968 u32b f[TR_FLAG_SIZE];
8970 item_tester_hook = item_tester_hook_weapon_except_bow;
8971 q = _("どれを呪いますか?", "Which weapon do you curse?");
8972 s = _("武器を装備していない。", "You wield no weapons.");
8974 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
8976 o_ptr = &inventory[item];
8977 object_desc(o_name, o_ptr, OD_NAME_ONLY);
8978 object_flags(o_ptr, f);
8980 if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
8983 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
8985 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
8988 if (o_ptr->to_d > 0)
8990 o_ptr->to_d -= randint1(3) % 2;
8991 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
8993 if (o_ptr->to_h > 0)
8995 o_ptr->to_h -= randint1(3) % 2;
8996 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
8998 if (o_ptr->to_a > 0)
9000 o_ptr->to_a -= randint1(3) % 2;
9001 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
9003 msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
9009 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
9010 o_ptr->curse_flags |= (TRC_CURSED);
9012 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
9015 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
9018 o_ptr->curse_flags |= (TRC_TY_CURSE);
9019 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
9021 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
9022 add_flag(o_ptr->art_flags, TR_VORPAL);
9023 add_flag(o_ptr->art_flags, TR_VAMPIRIC);
9024 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
9029 o_ptr->curse_flags |= get_curse(power, o_ptr);
9032 p_ptr->update |= (PU_BONUS);
9038 if (name) return _("邪悪感知", "Evil detection");
9039 if (desc) return _("周囲の邪悪なモンスターを感知する。", "Detects evil monsters.");
9040 if (info) return info_range(MAX_SIGHT);
9043 msg_print(_("邪悪な生物の存在を感じ取ろうとした。", "You attend to the presence of evil creatures."));
9048 if (name) return _("我慢", "Patience");
9049 if (desc) return _("数ターン攻撃を耐えた後、受けたダメージを地獄の業火として周囲に放出する。",
9050 "Bursts hell fire strongly after patients any damage while few turns.");
9051 power = MIN(200, (p_ptr->magic_num1[2] * 2));
9052 if (info) return info_damage(0, 0, power);
9055 int a = 3 - (p_ptr->pspeed - 100) / 10;
9056 int r = 3 + randint1(3) + MAX(0, MIN(3, a));
9058 if (p_ptr->magic_num2[2] > 0)
9060 msg_print(_("すでに我慢をしている。", "You are already patienting."));
9064 p_ptr->magic_num2[1] = 1;
9065 p_ptr->magic_num2[2] = r;
9066 p_ptr->magic_num1[2] = 0;
9067 msg_print(_("じっと耐えることにした。", "You decide to patient all damages."));
9072 int rad = 2 + (power / 50);
9074 p_ptr->magic_num2[2]--;
9076 if ((p_ptr->magic_num2[2] <= 0) || (power >= 200))
9078 msg_print(_("我慢が解かれた!", "Time for end of patioence!"));
9081 project(0, rad, py, px, power, GF_HELL_FIRE,
9082 (PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);
9086 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
9090 p_ptr->magic_num2[1] = 0;
9091 p_ptr->magic_num2[2] = 0;
9092 p_ptr->magic_num1[2] = 0;
9097 /*** 2nd book (8-15) ***/
9099 if (name) return _("氷の鎧", "Ice armor");
9100 if (desc) return _("氷のオーラを身にまとい、防御力が上昇する。", "Gives fire aura and bonus to AC.");
9103 msg_print(_("体が氷の鎧で覆われた。", "You have enveloped by ice armor!"));
9107 msg_print(_("氷の鎧が消え去った。", "Ice armor disappeared."));
9112 if (name) return _("重傷の治癒", "Cure serious wounds");
9113 if (desc) return _("体力や傷を多少回復させる。", "Heals cut and HP more.");
9114 if (info) return info_heal(2, 10, 0);
9117 msg_print(_("気分が良くなってくる。", "You feel better and better."));
9121 hp_player(damroll(2, 10));
9122 set_cut((p_ptr->cut / 2) - 10);
9127 if (name) return _("薬品吸入", "Inhail potion");
9128 if (desc) return _("呪文詠唱を中止することなく、薬の効果を得ることができる。", "Quaffs a potion without canceling of casting a spell.");
9131 p_ptr->magic_num1[0] |= (1L << HEX_INHAIL);
9132 do_cmd_quaff_potion();
9133 p_ptr->magic_num1[0] &= ~(1L << HEX_INHAIL);
9139 if (name) return _("吸血霧", "Vampiric mist");
9140 if (desc) return _("視界内のモンスターに微弱量の生命力吸収のダメージを与える。与えたダメージの分、体力が回復する。",
9141 "Deals few dameges of drain life to all monsters in your sight.");
9142 power = (plev / 2) + 5;
9143 if (info) return info_damage(1, power, 0);
9146 project_hack(GF_OLD_DRAIN, randint1(power));
9151 if (name) return _("魔剣化", "Swords to runeswords");
9152 if (desc) return _("武器の攻撃力を上げる。切れ味を得、呪いに応じて与えるダメージが上昇し、善良なモンスターに対するダメージが2倍になる。",
9153 "Gives vorpal ability to your weapon. Increases damages by your weapon acccording to curse of your weapon.");
9157 msg_print("あなたの武器が黒く輝いた。");
9159 if (!empty_hands(FALSE))
9160 msg_print("Your weapons glow bright black.");
9162 msg_print("Your weapon glows bright black.");
9168 msg_print("武器の輝きが消え去った。");
9170 msg_format("Brightness of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
9176 if (name) return _("混乱の手", "Touch of confusion");
9177 if (desc) return _("攻撃した際モンスターを混乱させる。", "Confuses a monster when you attack.");
9180 msg_print(_("あなたの手が赤く輝き始めた。", "Your hands glow bright red."));
9184 msg_print(_("手の輝きがなくなった。", "Brightness on your hands disappeard."));
9189 if (name) return _("肉体強化", "Building up");
9190 if (desc) return _("術者の腕力、器用さ、耐久力を上昇させる。攻撃回数の上限を 1 増加させる。",
9191 "Attempts to increases your strength, dexterity and constitusion.");
9194 msg_print(_("身体が強くなった気がした。", "You feel your body is developed more now."));
9199 if (name) return _("反テレポート結界", "Anti teleport barrier");
9200 if (desc) return _("視界内のモンスターのテレポートを阻害するバリアを張る。", "Obstructs all teleportations by monsters in your sight.");
9201 power = plev * 3 / 2;
9202 if (info) return info_power(power);
9205 msg_print(_("テレポートを防ぐ呪いをかけた。", "You feel anyone can not teleport except you."));
9209 /*** 3rd book (16-23) ***/
9211 if (name) return _("衝撃のクローク", "Cloak of shock");
9212 if (desc) return _("電気のオーラを身にまとい、動きが速くなる。", "Gives lightning aura and a bonus to speed.");
9215 msg_print(_("体が稲妻のオーラで覆われた。", "You have enveloped by electrical aura!"));
9219 msg_print(_("稲妻のオーラが消え去った。", "Electrical aura disappeared."));
9224 if (name) return _("致命傷の治癒", "Cure critical wounds");
9225 if (desc) return _("体力や傷を回復させる。", "Heals cut and HP greatry.");
9226 if (info) return info_heal(4, 10, 0);
9229 msg_print(_("気分が良くなってくる。", "You feel better and better."));
9233 hp_player(damroll(4, 10));
9241 if (name) return _("呪力封入", "Recharging");
9242 if (desc) return _("魔法の道具に魔力を再充填する。", "Recharges a magic device.");
9244 if (info) return info_power(power);
9247 if (!recharge(power)) return NULL;
9253 if (name) return _("死者復活", "Animate Dead");
9254 if (desc) return _("死体を蘇らせてペットにする。", "Raises corpses and skeletons from dead.");
9257 msg_print(_("死者への呼びかけを始めた。", "You start to call deads.!"));
9261 animate_dead(0, py, px);
9266 if (name) return _("防具呪縛", "Curse armor");
9267 if (desc) return _("装備している防具に呪いをかける。", "Curse a piece of armour that you wielding.");
9272 char o_name[MAX_NLEN];
9274 u32b f[TR_FLAG_SIZE];
9276 item_tester_hook = object_is_armour;
9277 q = _("どれを呪いますか?", "Which piece of armour do you curse?");
9278 s = _("防具を装備していない。", "You wield no piece of armours.");
9280 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
9282 o_ptr = &inventory[item];
9283 object_desc(o_name, o_ptr, OD_NAME_ONLY);
9284 object_flags(o_ptr, f);
9286 if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
9289 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
9291 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
9294 if (o_ptr->to_d > 0)
9296 o_ptr->to_d -= randint1(3) % 2;
9297 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
9299 if (o_ptr->to_h > 0)
9301 o_ptr->to_h -= randint1(3) % 2;
9302 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
9304 if (o_ptr->to_a > 0)
9306 o_ptr->to_a -= randint1(3) % 2;
9307 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
9309 msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
9315 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
9316 o_ptr->curse_flags |= (TRC_CURSED);
9318 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
9321 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
9324 o_ptr->curse_flags |= (TRC_TY_CURSE);
9325 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
9327 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
9328 add_flag(o_ptr->art_flags, TR_RES_POIS);
9329 add_flag(o_ptr->art_flags, TR_RES_DARK);
9330 add_flag(o_ptr->art_flags, TR_RES_NETHER);
9331 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
9336 o_ptr->curse_flags |= get_curse(power, o_ptr);
9339 p_ptr->update |= (PU_BONUS);
9345 if (name) return _("影のクローク", "Cloak of shadow");
9346 if (desc) return _("影のオーラを身にまとい、敵に影のダメージを与える。", "Gives aura of shadow.");
9349 object_type *o_ptr = &inventory[INVEN_OUTER];
9353 msg_print(_("クロークを身につけていない!", "You don't ware any cloak."));
9356 else if (!object_is_cursed(o_ptr))
9358 msg_print(_("クロークは呪われていない!", "Your cloak is not cursed."));
9363 msg_print(_("影のオーラを身にまとった。", "You have enveloped by shadow aura!"));
9368 object_type *o_ptr = &inventory[INVEN_OUTER];
9370 if ((!o_ptr->k_idx) || (!object_is_cursed(o_ptr)))
9372 do_spell(REALM_HEX, spell, SPELL_STOP);
9373 p_ptr->magic_num1[0] &= ~(1L << spell);
9374 p_ptr->magic_num2[0]--;
9375 if (!p_ptr->magic_num2[0]) set_action(ACTION_NONE);
9380 msg_print(_("影のオーラが消え去った。", "Shadow aura disappeared."));
9385 if (name) return _("苦痛を魔力に", "Pains to mana");
9386 if (desc) return _("視界内のモンスターに精神ダメージ与え、魔力を吸い取る。", "Deals psychic damages to all monsters in sight, and drains some mana.");
9387 power = plev * 3 / 2;
9388 if (info) return info_damage(1, power, 0);
9391 project_hack(GF_PSI_DRAIN, randint1(power));
9396 if (name) return _("目には目を", "Eye for an eye");
9397 if (desc) return _("打撃や魔法で受けたダメージを、攻撃元のモンスターにも与える。", "Returns same damage which you got to the monster which damaged you.");
9400 msg_print(_("復讐したい欲望にかられた。", "You wish strongly you want to revenge anything."));
9404 /*** 4th book (24-31) ***/
9406 if (name) return _("反増殖結界", "Anti multiply barrier");
9407 if (desc) return _("その階の増殖するモンスターの増殖を阻止する。", "Obstructs all multiplying by monsters in entire floor.");
9410 msg_print(_("増殖を阻止する呪いをかけた。", "You feel anyone can not already multiply."));
9415 if (name) return _("全復活", "Restoration");
9416 if (desc) return _("経験値を徐々に復活し、減少した能力値を回復させる。", "Restores experience and status.");
9419 msg_print(_("体が元の活力を取り戻し始めた。", "You feel your lost status starting to return."));
9424 int d = (p_ptr->max_exp - p_ptr->exp);
9425 int r = (p_ptr->exp / 20);
9431 p_ptr->exp = p_ptr->max_exp;
9435 /* Check the experience */
9440 for (i = A_STR; i < 6; i ++)
9442 if (p_ptr->stat_cur[i] < p_ptr->stat_max[i])
9444 if (p_ptr->stat_cur[i] < 18)
9445 p_ptr->stat_cur[i]++;
9447 p_ptr->stat_cur[i] += 10;
9449 if (p_ptr->stat_cur[i] > p_ptr->stat_max[i])
9450 p_ptr->stat_cur[i] = p_ptr->stat_max[i];
9452 /* Recalculate bonuses */
9453 p_ptr->update |= (PU_BONUS);
9461 msg_format(_("%sの呪文の詠唱をやめた。", "Finish casting '%^s'."), do_spell(REALM_HEX, HEX_RESTORE, SPELL_NAME));
9462 p_ptr->magic_num1[0] &= ~(1L << HEX_RESTORE);
9463 if (cont) p_ptr->magic_num2[0]--;
9464 if (p_ptr->magic_num2) p_ptr->action = ACTION_NONE;
9467 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
9468 p_ptr->redraw |= (PR_EXTRA);
9476 if (name) return _("呪力吸収", "Drain curse power");
9477 if (desc) return _("呪われた武器の呪いを吸収して魔力を回復する。", "Drains curse on your weapon and heals SP a little.");
9482 u32b f[TR_FLAG_SIZE];
9485 item_tester_hook = item_tester_hook_cursed;
9486 q = _("どの装備品から吸収しますか?", "Which cursed equipment do you drain mana from?");
9487 s = _("呪われたアイテムを装備していない。", "You have no cursed equipment.");
9489 if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
9491 o_ptr = &inventory[item];
9492 object_flags(o_ptr, f);
9494 p_ptr->csp += (p_ptr->lev / 5) + randint1(p_ptr->lev / 5);
9495 if (have_flag(f, TR_TY_CURSE) || (o_ptr->curse_flags & TRC_TY_CURSE)) p_ptr->csp += randint1(5);
9496 if (p_ptr->csp > p_ptr->msp) p_ptr->csp = p_ptr->msp;
9498 if (o_ptr->curse_flags & TRC_PERMA_CURSE)
9502 else if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
9506 msg_print(_("呪いを全て吸い取った。", "Heavy curse vanished away."));
9507 o_ptr->curse_flags = 0L;
9510 else if ((o_ptr->curse_flags & (TRC_CURSED)) && one_in_(3))
9512 msg_print(_("呪いを全て吸い取った。", "Curse vanished away."));
9513 o_ptr->curse_flags = 0L;
9521 if (name) return _("吸血の刃", "Swords to vampires");
9522 if (desc) return _("吸血属性で攻撃する。", "Gives vampiric ability to your weapon.");
9526 msg_print("あなたの武器が血を欲している。");
9528 if (!empty_hands(FALSE))
9529 msg_print("Your weapons want more blood now.");
9531 msg_print("Your weapon wants more blood now.");
9537 msg_print("武器の渇望が消え去った。");
9539 msg_format("Thirsty of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
9545 if (name) return _("朦朧の言葉", "Word of stun");
9546 if (desc) return _("視界内のモンスターを朦朧とさせる。", "Stuns all monsters in your sight.");
9548 if (info) return info_power(power);
9551 stun_monsters(power);
9556 if (name) return _("影移動", "Moving into shadow");
9557 if (desc) return _("モンスターの隣のマスに瞬間移動する。", "Teleports you close to a monster.");
9563 for (i = 0; i < 3; i++)
9565 if (!tgt_pt(&x, &y)) return FALSE;
9569 for (dir = 0; dir < 8; dir++)
9571 int dy = y + ddy_ddd[dir];
9572 int dx = x + ddx_ddd[dir];
9573 if (dir == 5) continue;
9574 if(cave[dy][dx].m_idx) flag = TRUE;
9577 if (!cave_empty_bold(y, x) || (cave[y][x].info & CAVE_ICKY) ||
9578 (distance(y, x, py, px) > plev + 2))
9580 msg_print(_("そこには移動できない。", "Can not teleport to there."));
9586 if (flag && randint0(plev * plev / 2))
9588 teleport_player_to(y, x, 0L);
9592 msg_print(_("おっと!", "Oops!"));
9593 teleport_player(30, 0L);
9601 if (name) return _("反魔法結界", "Anti magic barrier");
9602 if (desc) return _("視界内のモンスターの魔法を阻害するバリアを張る。", "Obstructs all magic spell of monsters in your sight.");
9603 power = plev * 3 / 2;
9604 if (info) return info_power(power);
9607 msg_print(_("魔法を防ぐ呪いをかけた。", "You feel anyone can not cast spells except you."));
9612 if (name) return _("復讐の宣告", "Revenge sentence");
9613 if (desc) return _("数ターン後にそれまで受けたダメージに応じた威力の地獄の劫火の弾を放つ。",
9614 "Fires a ball of hell fire to try revenging after few turns.");
9615 power = p_ptr->magic_num1[2];
9616 if (info) return info_damage(0, 0, power);
9620 int a = 3 - (p_ptr->pspeed - 100) / 10;
9621 r = 1 + randint1(2) + MAX(0, MIN(3, a));
9623 if (p_ptr->magic_num2[2] > 0)
9625 msg_print(_("すでに復讐は宣告済みだ。", "You already pronounced your revenge."));
9629 p_ptr->magic_num2[1] = 2;
9630 p_ptr->magic_num2[2] = r;
9631 msg_format(_("あなたは復讐を宣告した。あと %d ターン。", "You pronounce your revenge. %d turns left."), r);
9636 p_ptr->magic_num2[2]--;
9638 if (p_ptr->magic_num2[2] <= 0)
9648 msg_print(_("復讐の時だ!", "Time to revenge!"));
9650 while (!get_aim_dir(&dir));
9652 fire_ball(GF_HELL_FIRE, dir, power, 1);
9656 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
9661 msg_print(_("復讐する気が失せた。", "You are not a mood to revenge."));
9663 p_ptr->magic_num1[2] = 0;
9670 if ((cast) && (add))
9673 p_ptr->magic_num1[0] |= 1L << (spell);
9674 p_ptr->magic_num2[0]++;
9676 if (p_ptr->action != ACTION_SPELL) set_action(ACTION_SPELL);
9682 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
9683 p_ptr->redraw |= (PR_EXTRA | PR_HP | PR_MANA);
9691 * @brief 魔法処理のメインルーチン
9692 * @param realm 魔法領域のID
9693 * @param spell 各領域の魔法ID
9695 * @return 各領域魔法に各種テキストを求めた場合は文字列参照ポインタ、そうでない場合はNULLポインタを返す。
9697 cptr do_spell(int realm, int spell, int mode)
9701 case REALM_LIFE: return do_life_spell(spell, mode);
9702 case REALM_SORCERY: return do_sorcery_spell(spell, mode);
9703 case REALM_NATURE: return do_nature_spell(spell, mode);
9704 case REALM_CHAOS: return do_chaos_spell(spell, mode);
9705 case REALM_DEATH: return do_death_spell(spell, mode);
9706 case REALM_TRUMP: return do_trump_spell(spell, mode);
9707 case REALM_ARCANE: return do_arcane_spell(spell, mode);
9708 case REALM_CRAFT: return do_craft_spell(spell, mode);
9709 case REALM_DAEMON: return do_daemon_spell(spell, mode);
9710 case REALM_CRUSADE: return do_crusade_spell(spell, mode);
9711 case REALM_MUSIC: return do_music_spell(spell, mode);
9712 case REALM_HISSATSU: return do_hissatsu_spell(spell, mode);
9713 case REALM_HEX: return do_hex_spell(spell, mode);