OSDN Git Service

[Refactor] #37353 型の置換(QUEST_IDX) / Type replacement.
[hengband/hengband.git] / src / realm-death.c
index 3a93d7b..0a5a9e8 100644 (file)
-#include "angband.h"\r
-#include "cmd-spell.h"\r
-\r
-\r
-\r
-/*!\r
-* @brief \88Ã\8d\95\97Ì\88æ\96\82\96@\82Ì\8ae\8f\88\97\9d\82ð\8ds\82¤\r
-* @param spell \96\82\96@ID\r
-* @param mode \8f\88\97\9d\93à\97e (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)\r
-* @return SPELL_NAME / SPELL_DESC / SPELL_INFO \8e\9e\82É\82Í\95\8e\9a\97ñ\83|\83C\83\93\83^\82ð\95Ô\82·\81BSPELL_CAST\8e\9e\82ÍNULL\95\8e\9a\97ñ\82ð\95Ô\82·\81B\r
-*/\r
-cptr do_death_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
-{\r
-       bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
-       bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
-       bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
-       bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
-\r
-       static const char s_dam[] = _("\91¹\8f\9d:", "dam ");\r
-       static const char s_random[] = _("\83\89\83\93\83_\83\80", "random");\r
-\r
-       int dir;\r
-       int plev = p_ptr->lev;\r
-\r
-       switch (spell)\r
-       {\r
-       case 0:\r
-               if (name) return _("\96³\90\96½\8a´\92m", "Detect Unlife");\r
-               if (desc) return _("\8bß\82­\82Ì\90\96½\82Ì\82È\82¢\83\82\83\93\83X\83^\81[\82ð\8a´\92m\82·\82é\81B", "Detects all nonliving monsters in your vicinity.");\r
-\r
-               {\r
-                       int rad = DETECT_RAD_DEFAULT;\r
-\r
-                       if (info) return info_radius(rad);\r
-\r
-                       if (cast)\r
-                       {\r
-                               detect_monsters_nonliving(rad);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 1:\r
-               if (name) return _("\8eô\8eE\92e", "Malediction");\r
-               if (desc) return _("\82²\82­\8f¬\82³\82È\8e×\88«\82È\97Í\82ð\8e\9d\82Â\83{\81[\83\8b\82ð\95ú\82Â\81B\91P\97Ç\82È\83\82\83\93\83X\83^\81[\82É\82Í\91å\82«\82È\83_\83\81\81[\83W\82ð\97^\82¦\82é\81B",\r
-                       "Fires a tiny ball of evil power which hurts good monsters greatly.");\r
-\r
-               {\r
-                       int dice = 3 + (plev - 1) / 5;\r
-                       int sides = 4;\r
-                       int rad = 0;\r
-\r
-                       if (info) return info_damage(dice, sides, 0);\r
-\r
-                       if (cast)\r
-                       {\r
-                               if (!get_aim_dir(&dir)) return NULL;\r
-\r
-                               /*\r
-                               * A radius-0 ball may (1) be aimed at\r
-                               * objects etc., and will affect them;\r
-                               * (2) may be aimed at ANY visible\r
-                               * monster, unlike a 'bolt' which must\r
-                               * travel to the monster.\r
-                               */\r
-\r
-                               fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides), rad);\r
-\r
-                               if (one_in_(5))\r
-                               {\r
-                                       /* Special effect first */\r
-                                       int effect = randint1(1000);\r
-\r
-                                       if (effect == 666)\r
-                                               fire_ball_hide(GF_DEATH_RAY, dir, plev * 200, 0);\r
-                                       else if (effect < 500)\r
-                                               fire_ball_hide(GF_TURN_ALL, dir, plev, 0);\r
-                                       else if (effect < 800)\r
-                                               fire_ball_hide(GF_OLD_CONF, dir, plev, 0);\r
-                                       else\r
-                                               fire_ball_hide(GF_STUN, dir, plev, 0);\r
-                               }\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 2:\r
-               if (name) return _("\8e×\88«\8a´\92m", "Detect Evil");\r
-               if (desc) return _("\8bß\82­\82Ì\8e×\88«\82È\83\82\83\93\83X\83^\81[\82ð\8a´\92m\82·\82é\81B", "Detects all evil monsters in your vicinity.");\r
-\r
-               {\r
-                       int rad = DETECT_RAD_DEFAULT;\r
-\r
-                       if (info) return info_radius(rad);\r
-\r
-                       if (cast)\r
-                       {\r
-                               detect_monsters_evil(rad);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 3:\r
-               if (name) return _("\88«\8fL\89_", "Stinking Cloud");\r
-               if (desc) return _("\93Å\82Ì\8b\85\82ð\95ú\82Â\81B", "Fires a ball of poison.");\r
-\r
-               {\r
-                       HIT_POINT dam = 10 + plev / 2;\r
-                       int rad = 2;\r
-\r
-                       if (info) return info_damage(0, 0, dam);\r
-\r
-                       if (cast)\r
-                       {\r
-                               if (!get_aim_dir(&dir)) return NULL;\r
-\r
-                               fire_ball(GF_POIS, dir, dam, rad);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 4:\r
-               if (name) return _("\8d\95\82¢\96°\82è", "Black Sleep");\r
-               if (desc) return _("1\91Ì\82Ì\83\82\83\93\83X\83^\81[\82ð\96°\82ç\82¹\82é\81B\92ï\8dR\82³\82ê\82é\82Æ\96³\8cø\81B", "Attempts to sleep a monster.");\r
-\r
-               {\r
-                       int power = plev;\r
-\r
-                       if (info) return info_power(power);\r
-\r
-                       if (cast)\r
-                       {\r
-                               if (!get_aim_dir(&dir)) return NULL;\r
-\r
-                               sleep_monster(dir, plev);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 5:\r
-               if (name) return _("\91Ï\93Å", "Resist Poison");\r
-               if (desc) return _("\88ê\92è\8e\9e\8aÔ\81A\93Å\82Ö\82Ì\91Ï\90«\82ð\93¾\82é\81B\91\95\94õ\82É\82æ\82é\91Ï\90«\82É\97Ý\90Ï\82·\82é\81B",\r
-                       "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");\r
-\r
-               {\r
-                       int base = 20;\r
-\r
-                       if (info) return info_duration(base, base);\r
-\r
-                       if (cast)\r
-                       {\r
-                               set_oppose_pois(randint1(base) + base, FALSE);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 6:\r
-               if (name) return _("\8b°\8dQ", "Horrify");\r
-               if (desc) return _("\83\82\83\93\83X\83^\81[1\91Ì\82ð\8b°\95|\82³\82¹\81A\9eN\9eO\82³\82¹\82é\81B\92ï\8dR\82³\82ê\82é\82Æ\96³\8cø\81B", "Attempts to scare and stun a monster.");\r
-\r
-               {\r
-                       int power = plev;\r
-\r
-                       if (info) return info_power(power);\r
-\r
-                       if (cast)\r
-                       {\r
-                               if (!get_aim_dir(&dir)) return NULL;\r
-\r
-                               fear_monster(dir, power);\r
-                               stun_monster(dir, power);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 7:\r
-               if (name) return _("\83A\83\93\83f\83b\83h\8f]\91®", "Enslave Undead");\r
-               if (desc) return _("\83A\83\93\83f\83b\83h1\91Ì\82ð\96£\97¹\82·\82é\81B\92ï\8dR\82³\82ê\82é\82Æ\96³\8cø\81B", "Attempts to charm an undead monster.");\r
-\r
-               {\r
-                       int power = plev;\r
-\r
-                       if (info) return info_power(power);\r
-\r
-                       if (cast)\r
-                       {\r
-                               if (!get_aim_dir(&dir)) return NULL;\r
-\r
-                               control_one_undead(dir, power);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 8:\r
-               if (name) return _("\83G\83\93\83g\83\8d\83s\81[\82Ì\8b\85", "Orb of Entropy");\r
-               if (desc) return _("\90\96½\82Ì\82 \82é\8eÒ\82ÌHP\82Æ\8dÅ\91åHP\91o\95û\82É\83_\83\81\81[\83W\82ð\97^\82¦\82é\8cø\89Ê\82Ì\82 \82é\8b\85\82ð\95ú\82Â\81B", "Fires a ball which damages to both HP and MaxHP of living monsters.");\r
-\r
-               {\r
-                       int dice = 3;\r
-                       int sides = 6;\r
-                       int rad = (plev < 30) ? 2 : 3;\r
-                       int base;\r
-\r
-                       if (IS_WIZARD_CLASS())\r
-                               base = plev + plev / 2;\r
-                       else\r
-                               base = plev + plev / 4;\r
-\r
-\r
-                       if (info) return info_damage(dice, sides, base);\r
-\r
-                       if (cast)\r
-                       {\r
-                               if (!get_aim_dir(&dir)) return NULL;\r
-\r
-                               fire_ball(GF_HYPODYNAMIA, dir, damroll(dice, sides) + base, rad);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 9:\r
-               if (name) return _("\92n\8d\96\82Ì\96î", "Nether Bolt");\r
-               if (desc) return _("\92n\8d\96\82Ì\83{\83\8b\83g\82à\82µ\82­\82Í\83r\81[\83\80\82ð\95ú\82Â\81B", "Fires a bolt or beam of nether.");\r
-\r
-               {\r
-                       int dice = 8 + (plev - 5) / 4;\r
-                       int sides = 8;\r
-\r
-                       if (info) return info_damage(dice, sides, 0);\r
-\r
-                       if (cast)\r
-                       {\r
-                               if (!get_aim_dir(&dir)) return NULL;\r
-\r
-                               fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 10:\r
-               if (name) return _("\8eE\9dC\89_", "Cloud kill");\r
-               if (desc) return _("\8e©\95ª\82ð\92\86\90S\82Æ\82µ\82½\93Å\82Ì\8b\85\82ð\94­\90\82³\82¹\82é\81B", "Generate a ball of poison centered on you.");\r
-\r
-               {\r
-                       HIT_POINT dam = (30 + plev) * 2;\r
-                       int rad = plev / 10 + 2;\r
-\r
-                       if (info) return info_damage(0, 0, dam / 2);\r
-\r
-                       if (cast)\r
-                       {\r
-                               project(0, rad, p_ptr->y, p_ptr->x, dam, GF_POIS, PROJECT_KILL | PROJECT_ITEM, -1);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 11:\r
-               if (name) return _("\83\82\83\93\83X\83^\81[\8fÁ\96Å", "Genocide One");\r
-               if (desc) return _("\83\82\83\93\83X\83^\81[1\91Ì\82ð\8fÁ\82µ\8b\8e\82é\81B\8co\8c±\92l\82â\83A\83C\83e\83\80\82Í\8eè\82É\93ü\82ç\82È\82¢\81B\92ï\8dR\82³\82ê\82é\82Æ\96³\8cø\81B", "Attempts to vanish a monster.");\r
-\r
-               {\r
-                       int power = plev + 50;\r
-\r
-                       if (info) return info_power(power);\r
-\r
-                       if (cast)\r
-                       {\r
-                               if (!get_aim_dir(&dir)) return NULL;\r
-\r
-                               fire_ball_hide(GF_GENOCIDE, dir, power, 0);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 12:\r
-               if (name) return _("\93Å\82Ì\90n", "Poison Branding");\r
-               if (desc) return _("\95\90\8aí\82É\93Å\82Ì\91®\90«\82ð\82Â\82¯\82é\81B", "Makes current weapon poison branded.");\r
-\r
-               {\r
-                       if (cast)\r
-                       {\r
-                               brand_weapon(3);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 13:\r
-               if (name) return _("\8bz\8c\8c\82Ì\96î", "Vampiric Bolt");\r
-               if (desc) return _("\83{\83\8b\83g\82É\82æ\82è\83\82\83\93\83X\83^\81[1\91Ì\82©\82ç\90\96½\97Í\82ð\8bz\82¢\82Æ\82é\81B\8bz\82¢\82Æ\82Á\82½\90\96½\97Í\82É\82æ\82Á\82Ä\96\9e\95 \93x\82ª\8fã\82ª\82é\81B",\r
-                       "Absorbs some HP from a monster and gives them to you by bolt. You will also gain nutritional sustenance from this.");\r
-\r
-               {\r
-                       int dice = 1;\r
-                       int sides = plev * 2;\r
-                       int base = plev * 2;\r
-\r
-                       if (info) return info_damage(dice, sides, base);\r
-\r
-                       if (cast)\r
-                       {\r
-                               HIT_POINT dam = base + damroll(dice, sides);\r
-\r
-                               if (!get_aim_dir(&dir)) return NULL;\r
-\r
-                               if (hypodynamic_bolt(dir, dam))\r
-                               {\r
-                                       chg_virtue(V_SACRIFICE, -1);\r
-                                       chg_virtue(V_VITALITY, -1);\r
-\r
-                                       hp_player(dam);\r
-\r
-                                       /*\r
-                                       * Gain nutritional sustenance:\r
-                                       * 150/hp drained\r
-                                       *\r
-                                       * A Food ration gives 5000\r
-                                       * food points (by contrast)\r
-                                       * Don't ever get more than\r
-                                       * "Full" this way But if we\r
-                                       * ARE Gorged, it won't cure\r
-                                       * us\r
-                                       */\r
-                                       dam = p_ptr->food + MIN(5000, 100 * dam);\r
-\r
-                                       /* Not gorged already */\r
-                                       if (p_ptr->food < PY_FOOD_MAX)\r
-                                               set_food(dam >= PY_FOOD_MAX ? PY_FOOD_MAX - 1 : dam);\r
-                               }\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 14:\r
-               if (name) return _("\94½\8d°\82Ì\8fp", "Animate dead");\r
-               if (desc) return _("\8eü\88Í\82Ì\8e\80\91Ì\82â\8d\9c\82ð\90\82«\95Ô\82·\81B", "Resurrects nearby corpse and skeletons. And makes these your pets.");\r
-\r
-               {\r
-                       if (cast)\r
-                       {\r
-                               animate_dead(0, p_ptr->y, p_ptr->x);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 15:\r
-               if (name) return _("\96\95\8eE", "Genocide");\r
-               if (desc) return _("\8ew\92è\82µ\82½\95\8e\9a\82Ì\83\82\83\93\83X\83^\81[\82ð\8c»\8dÝ\82Ì\8aK\82©\82ç\8fÁ\82µ\8b\8e\82é\81B\92ï\8dR\82³\82ê\82é\82Æ\96³\8cø\81B",\r
-                       "Eliminates an entire class of monster, exhausting you.  Powerful or unique monsters may resist.");\r
-\r
-               {\r
-                       int power = plev + 50;\r
-\r
-                       if (info) return info_power(power);\r
-\r
-                       if (cast)\r
-                       {\r
-                               symbol_genocide(power, TRUE);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 16:\r
-               if (name) return _("\8b\90í\8em\89»", "Berserk");\r
-               if (desc) return _("\8b\90í\8em\89»\82µ\81A\8b°\95|\82ð\8f\9c\8b\8e\82·\82é\81B", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");\r
-\r
-               {\r
-                       int base = 25;\r
-\r
-                       if (info) return info_duration(base, base);\r
-\r
-                       if (cast)\r
-                       {\r
-                               set_shero(randint1(base) + base, FALSE);\r
-                               hp_player(30);\r
-                               set_afraid(0);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 17:\r
-               if (name) return _("\88«\97ì\8f¢\8a«", "Invoke Spirits");\r
-               if (desc) return _("\83\89\83\93\83_\83\80\82Å\97l\81X\82È\8cø\89Ê\82ª\8bN\82±\82é\81B", "Causes random effects.");\r
-\r
-               {\r
-                       if (info) return s_random;\r
-\r
-                       if (cast)\r
-                       {\r
-                               if (!get_aim_dir(&dir)) return NULL;\r
-\r
-                               cast_invoke_spirits(dir);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 18:\r
-               if (name) return _("\88Ã\8d\95\82Ì\96î", "Dark Bolt");\r
-               if (desc) return _("\88Ã\8d\95\82Ì\83{\83\8b\83g\82à\82µ\82­\82Í\83r\81[\83\80\82ð\95ú\82Â\81B", "Fires a bolt or beam of darkness.");\r
-\r
-               {\r
-                       int dice = 4 + (plev - 5) / 4;\r
-                       int sides = 8;\r
-\r
-                       if (info) return info_damage(dice, sides, 0);\r
-\r
-                       if (cast)\r
-                       {\r
-                               if (!get_aim_dir(&dir)) return NULL;\r
-\r
-                               fire_bolt_or_beam(beam_chance(), GF_DARK, dir, damroll(dice, sides));\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 19:\r
-               if (name) return _("\8b\97\90\90í\8em", "Battle Frenzy");\r
-               if (desc) return _("\8b\90í\8em\89»\82µ\81A\8b°\95|\82ð\8f\9c\8b\8e\82µ\81A\89Á\91¬\82·\82é\81B",\r
-                       "Gives another bonus to hit and HP, immunity to fear for a while. Hastes you. But decreases AC.");\r
-\r
-               {\r
-                       int b_base = 25;\r
-                       int sp_base = plev / 2;\r
-                       int sp_sides = 20 + plev / 2;\r
-\r
-                       if (info) return info_duration(b_base, b_base);\r
-\r
-                       if (cast)\r
-                       {\r
-                               set_shero(randint1(25) + 25, FALSE);\r
-                               hp_player(30);\r
-                               set_afraid(0);\r
-                               set_fast(randint1(sp_sides) + sp_base, FALSE);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 20:\r
-               if (name) return _("\8bz\8c\8c\82Ì\90n", "Vampiric Branding");\r
-               if (desc) return _("\95\90\8aí\82É\8bz\8c\8c\82Ì\91®\90«\82ð\82Â\82¯\82é\81B", "Makes current weapon Vampiric.");\r
-\r
-               {\r
-                       if (cast)\r
-                       {\r
-                               brand_weapon(4);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 21:\r
-               if (name) return _("\8bz\8c\8c\82Ì\98A\96î", "Vampiric Bolts");\r
-               if (desc) return _("3\98A\8eË\82Ì\83{\83\8b\83g\82É\82æ\82è\83\82\83\93\83X\83^\81[1\91Ì\82©\82ç\90\96½\97Í\82ð\8bz\82¢\82Æ\82é\81B\8bz\82¢\82Æ\82Á\82½\90\96½\97Í\82É\82æ\82Á\82Ä\91Ì\97Í\82ª\89ñ\95\9c\82·\82é\81B",\r
-                       "Fires 3 bolts. Each of the bolts absorbs some HP from a monster and gives them to you.");\r
-               {\r
-                       HIT_POINT dam = 100;\r
-\r
-                       if (info) return format("%s3*%d", s_dam, dam);\r
-\r
-                       if (cast)\r
-                       {\r
-                               int i;\r
-\r
-                               if (!get_aim_dir(&dir)) return NULL;\r
-\r
-                               chg_virtue(V_SACRIFICE, -1);\r
-                               chg_virtue(V_VITALITY, -1);\r
-\r
-                               for (i = 0; i < 3; i++)\r
-                               {\r
-                                       if (hypodynamic_bolt(dir, dam))\r
-                                               hp_player(dam);\r
-                               }\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 22:\r
-               if (name) return _("\8e\80\82Ì\8c¾\8d°", "Nether Wave");\r
-               if (desc) return _("\8e\8b\8aE\93à\82Ì\90\96½\82Ì\82 \82é\83\82\83\93\83X\83^\81[\82É\83_\83\81\81[\83W\82ð\97^\82¦\82é\81B", "Damages all living monsters in sight.");\r
-\r
-               {\r
-                       int sides = plev * 3;\r
-\r
-                       if (info) return info_damage(1, sides, 0);\r
-\r
-                       if (cast)\r
-                       {\r
-                               dispel_living(randint1(sides));\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 23:\r
-               if (name) return _("\88Ã\8d\95\82Ì\97\92", "Darkness Storm");\r
-               if (desc) return _("\8b\90\91å\82È\88Ã\8d\95\82Ì\8b\85\82ð\95ú\82Â\81B", "Fires a huge ball of darkness.");\r
-\r
-               {\r
-                       HIT_POINT dam = 100 + plev * 2;\r
-                       int rad = 4;\r
-\r
-                       if (info) return info_damage(0, 0, dam);\r
-\r
-                       if (cast)\r
-                       {\r
-                               if (!get_aim_dir(&dir)) return NULL;\r
-\r
-                               fire_ball(GF_DARK, dir, dam, rad);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 24:\r
-               if (name) return _("\8e\80\82Ì\8cõ\90ü", "Death Ray");\r
-               if (desc) return _("\8e\80\82Ì\8cõ\90ü\82ð\95ú\82Â\81B", "Fires a beam of death.");\r
-\r
-               {\r
-                       if (cast)\r
-                       {\r
-                               if (!get_aim_dir(&dir)) return NULL;\r
-\r
-                               death_ray(dir, plev);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 25:\r
-               if (name) return _("\8e\80\8eÒ\8f¢\8a«", "Raise the Dead");\r
-               if (desc) return _("1\91Ì\82Ì\83A\83\93\83f\83b\83h\82ð\8f¢\8a«\82·\82é\81B", "Summons an undead monster.");\r
-\r
-               {\r
-                       if (cast)\r
-                       {\r
-                               int type;\r
-                               bool pet = one_in_(3);\r
-                               u32b flg = 0L;\r
-\r
-                               type = (plev > 47 ? SUMMON_HI_UNDEAD : SUMMON_UNDEAD);\r
-\r
-                               if (!pet || (pet && (plev > 24) && one_in_(3)))\r
-                                       flg |= PM_ALLOW_GROUP;\r
-\r
-                               if (pet) flg |= PM_FORCE_PET;\r
-                               else flg |= (PM_ALLOW_UNIQUE | PM_NO_PET);\r
-\r
-                               if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, type, flg))\r
-                               {\r
-                                       msg_print(_("\97â\82½\82¢\95\97\82ª\82 \82È\82½\82Ì\8eü\82è\82É\90\81\82«\8en\82ß\82½\81B\82»\82ê\82Í\95\85\94s\8fL\82ð\89^\82ñ\82Å\82¢\82é...",\r
-                                               "Cold winds begin to blow around you, carrying with them the stench of decay..."));\r
-\r
-\r
-                                       if (pet)\r
-                                       {\r
-                                               msg_print(_("\8cÃ\82¦\82Ì\8e\80\82¹\82é\8eÒ\8b¤\82ª\82 \82È\82½\82É\8ed\82¦\82é\82½\82ß\93y\82©\82çáS\82Á\82½\81I",\r
-                                                       "Ancient, long-dead forms arise from the ground to serve you!"));\r
-                                       }\r
-                                       else\r
-                                       {\r
-                                               msg_print(_("\8e\80\8eÒ\82ªáS\82Á\82½\81B\96°\82è\82ð\96W\82°\82é\82 \82È\82½\82ð\94±\82·\82é\82½\82ß\82É\81I",\r
-                                                       "'The dead arise... to punish you for disturbing them!'"));\r
-                                       }\r
-\r
-                                       chg_virtue(V_UNLIFE, 1);\r
-                               }\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 26:\r
-               if (name) return _("\8e\80\8eÒ\82Ì\94é\93`", "Esoteria");\r
-               if (desc) return _("\83A\83C\83e\83\80\82ð1\82Â\8e¯\95Ê\82·\82é\81B\83\8c\83x\83\8b\82ª\8d\82\82¢\82Æ\83A\83C\83e\83\80\82Ì\94\\97Í\82ð\8a®\91S\82É\92m\82é\82±\82Æ\82ª\82Å\82«\82é\81B",\r
-                       "Identifies an item. Or *identifies* an item at higher level.");\r
-\r
-               {\r
-                       if (cast)\r
-                       {\r
-                               if (randint1(50) > plev)\r
-                               {\r
-                                       if (!ident_spell(FALSE)) return NULL;\r
-                               }\r
-                               else\r
-                               {\r
-                                       if (!identify_fully(FALSE)) return NULL;\r
-                               }\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 27:\r
-               if (name) return _("\8bz\8c\8c\8bS\95Ï\89»", "Polymorph Vampire");\r
-               if (desc) return _("\88ê\92è\8e\9e\8aÔ\81A\8bz\8c\8c\8bS\82É\95Ï\89»\82·\82é\81B\95Ï\89»\82µ\82Ä\82¢\82é\8aÔ\82Í\96{\97\88\82Ì\8eí\91°\82Ì\94\\97Í\82ð\8e¸\82¢\81A\91ã\82í\82è\82É\8bz\8c\8c\8bS\82Æ\82µ\82Ä\82Ì\94\\97Í\82ð\93¾\82é\81B",\r
-                       "Mimic a vampire for a while. Loses abilities of original race and gets abilities as a vampire.");\r
-\r
-               {\r
-                       int base = 10 + plev / 2;\r
-\r
-                       if (info) return info_duration(base, base);\r
-\r
-                       if (cast)\r
-                       {\r
-                               set_mimic(base + randint1(base), MIMIC_VAMPIRE, FALSE);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 28:\r
-               if (name) return _("\8co\8c±\92l\95\9c\8a\88", "Restore Life");\r
-               if (desc) return _("\8e¸\82Á\82½\8co\8c±\92l\82ð\89ñ\95\9c\82·\82é\81B", "Restore lost experience.");\r
-\r
-               {\r
-                       if (cast)\r
-                       {\r
-                               restore_level();\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 29:\r
-               if (name) return _("\8eü\95Ó\96\95\8eE", "Mass Genocide");\r
-               if (desc) return _("\8e©\95ª\82Ì\8eü\88Í\82É\82¢\82é\83\82\83\93\83X\83^\81[\82ð\8c»\8dÝ\82Ì\8aK\82©\82ç\8fÁ\82µ\8b\8e\82é\81B\92ï\8dR\82³\82ê\82é\82Æ\96³\8cø\81B",\r
-                       "Eliminates all nearby monsters, exhausting you.  Powerful or unique monsters may be able to resist.");\r
-\r
-               {\r
-                       int power = plev + 50;\r
-\r
-                       if (info) return info_power(power);\r
-\r
-                       if (cast)\r
-                       {\r
-                               mass_genocide(power, TRUE);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 30:\r
-               if (name) return _("\92n\8d\96\82Ì\8d\85\89Î", "Hellfire");\r
-               if (desc) return _("\8e×\88«\82È\97Í\82ð\8e\9d\82Â\95ó\8eì\82ð\95ú\82Â\81B\91P\97Ç\82È\83\82\83\93\83X\83^\81[\82É\82Í\91å\82«\82È\83_\83\81\81[\83W\82ð\97^\82¦\82é\81B",\r
-                       "Fires a powerful ball of evil power. Hurts good monsters greatly.");\r
-\r
-               {\r
-                       HIT_POINT dam = 666;\r
-                       int rad = 3;\r
-\r
-                       if (info) return info_damage(0, 0, dam);\r
-\r
-                       if (cast)\r
-                       {\r
-                               if (!get_aim_dir(&dir)) return NULL;\r
-\r
-                               fire_ball(GF_HELL_FIRE, dir, dam, rad);\r
-                               take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("\92n\8d\96\82Ì\8d\85\89Î\82Ì\8eô\95\82ð\8f¥\82¦\82½\94æ\98J", "the strain of casting Hellfire"), -1);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 31:\r
-               if (name) return _("\97H\91Ì\89»", "Wraithform");\r
-               if (desc) return _("\88ê\92è\8e\9e\8aÔ\81A\95Ç\82ð\92Ê\82è\94²\82¯\82é\82±\82Æ\82ª\82Å\82«\8eó\82¯\82é\83_\83\81\81[\83W\82ª\8cy\8c¸\82³\82ê\82é\97H\91Ì\82Ì\8fó\91Ô\82É\95Ï\90g\82·\82é\81B",\r
-                       "Becomes wraith form which gives ability to pass walls and makes all damages half.");\r
-\r
-               {\r
-                       int base = plev / 2;\r
-\r
-                       if (info) return info_duration(base, base);\r
-\r
-                       if (cast)\r
-                       {\r
-                               set_wraith_form(randint1(base) + base, FALSE);\r
-                       }\r
-               }\r
-               break;\r
-       }\r
-\r
-       return "";\r
-}\r
+#include "angband.h"
+#include "cmd-spell.h"
+#include "projection.h"
+#include "spells-summon.h"
+
+
+
+/*!
+* @brief 暗黒領域魔法の各処理を行う
+* @param spell 魔法ID
+* @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
+* @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
+*/
+concptr do_death_spell(SPELL_IDX spell, BIT_FLAGS mode)
+{
+       bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
+       bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
+       bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
+       bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
+
+       DIRECTION dir;
+       PLAYER_LEVEL plev = p_ptr->lev;
+
+       switch (spell)
+       {
+       case 0:
+               if (name) return _("無生命感知", "Detect Unlife");
+               if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");
+
+               {
+                       POSITION rad = DETECT_RAD_DEFAULT;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               detect_monsters_nonliving(rad);
+                       }
+               }
+               break;
+
+       case 1:
+               if (name) return _("呪殺弾", "Malediction");
+               if (desc) return _("ごく小さな邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",
+                       "Fires a tiny ball of evil power which hurts good monsters greatly.");
+
+               {
+                       DICE_NUMBER dice = 3 + (plev - 1) / 5;
+                       DICE_SID sides = 4;
+                       POSITION rad = 0;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               /*
+                               * A radius-0 ball may (1) be aimed at
+                               * objects etc., and will affect them;
+                               * (2) may be aimed at ANY visible
+                               * monster, unlike a 'bolt' which must
+                               * travel to the monster.
+                               */
+
+                               fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides), rad);
+
+                               if (one_in_(5))
+                               {
+                                       /* Special effect first */
+                                       int effect = randint1(1000);
+
+                                       if (effect == 666)
+                                               fire_ball_hide(GF_DEATH_RAY, dir, plev * 200, 0);
+                                       else if (effect < 500)
+                                               fire_ball_hide(GF_TURN_ALL, dir, plev, 0);
+                                       else if (effect < 800)
+                                               fire_ball_hide(GF_OLD_CONF, dir, plev, 0);
+                                       else
+                                               fire_ball_hide(GF_STUN, dir, plev, 0);
+                               }
+                       }
+               }
+               break;
+
+       case 2:
+               if (name) return _("邪悪感知", "Detect Evil");
+               if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");
+
+               {
+                       POSITION rad = DETECT_RAD_DEFAULT;
+
+                       if (info) return info_radius(rad);
+
+                       if (cast)
+                       {
+                               detect_monsters_evil(rad);
+                       }
+               }
+               break;
+
+       case 3:
+               if (name) return _("悪臭雲", "Stinking Cloud");
+               if (desc) return _("毒の球を放つ。", "Fires a ball of poison.");
+
+               {
+                       HIT_POINT dam = 10 + plev / 2;
+                       POSITION rad = 2;
+
+                       if (info) return info_damage(0, 0, dam);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_POIS, dir, dam, rad);
+                       }
+               }
+               break;
+
+       case 4:
+               if (name) return _("黒い眠り", "Black Sleep");
+               if (desc) return _("1体のモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep a monster.");
+
+               {
+                       int power = plev;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               sleep_monster(dir, plev);
+                       }
+               }
+               break;
+
+       case 5:
+               if (name) return _("耐毒", "Resist Poison");
+               if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",
+                       "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");
+
+               {
+                       int base = 20;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_oppose_pois(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case 6:
+               if (name) return _("恐慌", "Horrify");
+               if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");
+
+               {
+                       int power = plev;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fear_monster(dir, plev);
+                               stun_monster(dir, plev);
+                       }
+               }
+               break;
+
+       case 7:
+               if (name) return _("アンデッド従属", "Enslave Undead");
+               if (desc) return _("アンデッド1体を魅了する。抵抗されると無効。", "Attempts to charm an undead monster.");
+
+               {
+                       int power = plev;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               control_one_undead(dir, plev);
+                       }
+               }
+               break;
+
+       case 8:
+               if (name) return _("エントロピーの球", "Orb of Entropy");
+               if (desc) return _("生命のある者のHPと最大HP双方にダメージを与える効果のある球を放つ。", "Fires a ball which damages to both HP and MaxHP of living monsters.");
+
+               {
+                       DICE_NUMBER dice = 3;
+                       DICE_SID sides = 6;
+                       POSITION rad = (plev < 30) ? 2 : 3;
+                       int base;
+
+                       if (IS_WIZARD_CLASS())
+                               base = plev + plev / 2;
+                       else
+                               base = plev + plev / 4;
+
+
+                       if (info) return info_damage(dice, sides, base);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_HYPODYNAMIA, dir, damroll(dice, sides) + base, rad);
+                       }
+               }
+               break;
+
+       case 9:
+               if (name) return _("地獄の矢", "Nether Bolt");
+               if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");
+
+               {
+                       DICE_NUMBER dice = 8 + (plev - 5) / 4;
+                       DICE_SID sides = 8;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case 10:
+               if (name) return _("殺戮雲", "Cloud kill");
+               if (desc) return _("自分を中心とした毒の球を発生させる。", "Generate a ball of poison centered on you.");
+
+               {
+                       HIT_POINT dam = (30 + plev) * 2;
+                       POSITION rad = plev / 10 + 2;
+
+                       if (info) return info_damage(0, 0, dam / 2);
+
+                       if (cast)
+                       {
+                               project(0, rad, p_ptr->y, p_ptr->x, dam, GF_POIS, PROJECT_KILL | PROJECT_ITEM, -1);
+                       }
+               }
+               break;
+
+       case 11:
+               if (name) return _("モンスター消滅", "Genocide One");
+               if (desc) return _("モンスター1体を消し去る。経験値やアイテムは手に入らない。抵抗されると無効。", "Attempts to vanish a monster.");
+
+               {
+                       int power = plev + 50;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball_hide(GF_GENOCIDE, dir, power, 0);
+                       }
+               }
+               break;
+
+       case 12:
+               if (name) return _("毒の刃", "Poison Branding");
+               if (desc) return _("武器に毒の属性をつける。", "Makes current weapon poison branded.");
+
+               {
+                       if (cast)
+                       {
+                               brand_weapon(3);
+                       }
+               }
+               break;
+
+       case 13:
+               if (name) return _("吸血の矢", "Vampiric Bolt");
+               if (desc) return _("ボルトによりモンスター1体から生命力を吸いとる。吸いとった生命力によって満腹度が上がる。",
+                       "Absorbs some HP from a monster and gives them to you by bolt. You will also gain nutritional sustenance from this.");
+
+               {
+                       DICE_NUMBER dice = 1;
+                       DICE_SID sides = plev * 2;
+                       int base = plev * 2;
+
+                       if (info) return info_damage(dice, sides, base);
+
+                       if (cast)
+                       {
+                               HIT_POINT dam = base + damroll(dice, sides);
+
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               if (hypodynamic_bolt(dir, dam))
+                               {
+                                       chg_virtue(V_SACRIFICE, -1);
+                                       chg_virtue(V_VITALITY, -1);
+
+                                       hp_player(dam);
+
+                                       /*
+                                       * Gain nutritional sustenance:
+                                       * 150/hp drained
+                                       *
+                                       * A Food ration gives 5000
+                                       * food points (by contrast)
+                                       * Don't ever get more than
+                                       * "Full" this way But if we
+                                       * ARE Gorged, it won't cure
+                                       * us
+                                       */
+                                       dam = p_ptr->food + MIN(5000, 100 * dam);
+
+                                       /* Not gorged already */
+                                       if (p_ptr->food < PY_FOOD_MAX)
+                                               set_food(dam >= PY_FOOD_MAX ? PY_FOOD_MAX - 1 : dam);
+                               }
+                       }
+               }
+               break;
+
+       case 14:
+               if (name) return _("反魂の術", "Animate dead");
+               if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");
+
+               {
+                       if (cast)
+                       {
+                               animate_dead(0, p_ptr->y, p_ptr->x);
+                       }
+               }
+               break;
+
+       case 15:
+               if (name) return _("抹殺", "Genocide");
+               if (desc) return _("指定した文字のモンスターを現在の階から消し去る。抵抗されると無効。",
+                       "Eliminates an entire class of monster, exhausting you.  Powerful or unique monsters may resist.");
+
+               {
+                       int power = plev + 50;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               symbol_genocide(power, TRUE);
+                       }
+               }
+               break;
+
+       case 16:
+               if (name) return _("狂戦士化", "Berserk");
+               if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");
+
+               {
+                       int base = 25;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               (void)berserk(base + randint1(base));
+                       }
+               }
+               break;
+
+       case 17:
+               if (name) return _("悪霊召喚", "Invoke Spirits");
+               if (desc) return _("ランダムで様々な効果が起こる。", "Causes random effects.");
+
+               {
+                       if (info) return s_random;
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               cast_invoke_spirits(dir);
+                       }
+               }
+               break;
+
+       case 18:
+               if (name) return _("暗黒の矢", "Dark Bolt");
+               if (desc) return _("暗黒のボルトもしくはビームを放つ。", "Fires a bolt or beam of darkness.");
+
+               {
+                       DICE_NUMBER dice = 4 + (plev - 5) / 4;
+                       DICE_SID sides = 8;
+
+                       if (info) return info_damage(dice, sides, 0);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_bolt_or_beam(beam_chance(), GF_DARK, dir, damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case 19:
+               if (name) return _("狂乱戦士", "Battle Frenzy");
+               if (desc) return _("狂戦士化し、恐怖を除去し、加速する。",
+                       "Gives another bonus to hit and HP, immunity to fear for a while. Hastes you. But decreases AC.");
+
+               {
+                       int b_base = 25;
+                       int sp_base = plev / 2;
+                       int sp_sides = 20 + plev / 2;
+
+                       if (info) return info_duration(b_base, b_base);
+
+                       if (cast)
+                       {
+                               (void)berserk(b_base + randint1(b_base));
+                               set_fast(randint1(sp_sides) + sp_base, FALSE);
+                       }
+               }
+               break;
+
+       case 20:
+               if (name) return _("吸血の刃", "Vampiric Branding");
+               if (desc) return _("武器に吸血の属性をつける。", "Makes current weapon Vampiric.");
+
+               {
+                       if (cast)
+                       {
+                               brand_weapon(4);
+                       }
+               }
+               break;
+
+       case 21:
+               if (name) return _("吸血の連矢", "Vampiric Bolts");
+               if (desc) return _("3連射のボルトによりモンスター1体から生命力を吸いとる。吸いとった生命力によって体力が回復する。",
+                       "Fires 3 bolts. Each of the bolts absorbs some HP from a monster and gives them to you.");
+               {
+                       HIT_POINT dam = 100;
+
+                       if (info) return format("%s3*%d", s_dam, dam);
+
+                       if (cast)
+                       {
+                               int i;
+
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               chg_virtue(V_SACRIFICE, -1);
+                               chg_virtue(V_VITALITY, -1);
+
+                               for (i = 0; i < 3; i++)
+                               {
+                                       if (hypodynamic_bolt(dir, dam))
+                                               hp_player(dam);
+                               }
+                       }
+               }
+               break;
+
+       case 22:
+               if (name) return _("死の言魂", "Nether Wave");
+               if (desc) return _("視界内の生命のあるモンスターにダメージを与える。", "Damages all living monsters in sight.");
+
+               {
+                       DICE_SID sides = plev * 3;
+
+                       if (info) return info_damage(1, sides, 0);
+
+                       if (cast)
+                       {
+                               dispel_living(randint1(sides));
+                       }
+               }
+               break;
+
+       case 23:
+               if (name) return _("暗黒の嵐", "Darkness Storm");
+               if (desc) return _("巨大な暗黒の球を放つ。", "Fires a huge ball of darkness.");
+
+               {
+                       HIT_POINT dam = 100 + plev * 2;
+                       POSITION rad = 4;
+
+                       if (info) return info_damage(0, 0, dam);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_DARK, dir, dam, rad);
+                       }
+               }
+               break;
+
+       case 24:
+               if (name) return _("死の光線", "Death Ray");
+               if (desc) return _("死の光線を放つ。", "Fires a beam of death.");
+
+               {
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               death_ray(dir, plev);
+                       }
+               }
+               break;
+
+       case 25:
+               if (name) return _("死者召喚", "Raise the Dead");
+               if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");
+
+               {
+                       if (cast)
+                       {
+                               int type;
+                               bool pet = one_in_(3);
+                               u32b flg = 0L;
+
+                               type = (plev > 47 ? SUMMON_HI_UNDEAD : SUMMON_UNDEAD);
+
+                               if (!pet || (pet && (plev > 24) && one_in_(3)))
+                                       flg |= PM_ALLOW_GROUP;
+
+                               if (pet) flg |= PM_FORCE_PET;
+                               else flg |= (PM_ALLOW_UNIQUE | PM_NO_PET);
+
+                               if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, type, flg, '\0'))
+                               {
+                                       msg_print(_("冷たい風があなたの周りに吹き始めた。それは腐敗臭を運んでいる...",
+                                               "Cold winds begin to blow around you, carrying with them the stench of decay..."));
+
+
+                                       if (pet)
+                                       {
+                                               msg_print(_("古えの死せる者共があなたに仕えるため土から甦った!",
+                                                       "Ancient, long-dead forms arise from the ground to serve you!"));
+                                       }
+                                       else
+                                       {
+                                               msg_print(_("死者が甦った。眠りを妨げるあなたを罰するために!",
+                                                       "'The dead arise... to punish you for disturbing them!'"));
+                                       }
+
+                                       chg_virtue(V_UNLIFE, 1);
+                               }
+                       }
+               }
+               break;
+
+       case 26:
+               if (name) return _("死者の秘伝", "Esoteria");
+               if (desc) return _("アイテムを1つ識別する。レベルが高いとアイテムの能力を完全に知ることができる。",
+                       "Identifies an item. Or *identifies* an item at higher level.");
+
+               {
+                       if (cast)
+                       {
+                               if (randint1(50) > plev)
+                               {
+                                       if (!ident_spell(FALSE)) return NULL;
+                               }
+                               else
+                               {
+                                       if (!identify_fully(FALSE)) return NULL;
+                               }
+                       }
+               }
+               break;
+
+       case 27:
+               if (name) return _("吸血鬼変化", "Polymorph Vampire");
+               if (desc) return _("一定時間、吸血鬼に変化する。変化している間は本来の種族の能力を失い、代わりに吸血鬼としての能力を得る。",
+                       "Mimic a vampire for a while. Loses abilities of original race and gets abilities as a vampire.");
+
+               {
+                       int base = 10 + plev / 2;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_mimic(base + randint1(base), MIMIC_VAMPIRE, FALSE);
+                       }
+               }
+               break;
+
+       case 28:
+               if (name) return _("経験値復活", "Restore Life");
+               if (desc) return _("失った経験値を回復する。", "Restore lost experience.");
+
+               {
+                       if (cast)
+                       {
+                               restore_level();
+                       }
+               }
+               break;
+
+       case 29:
+               if (name) return _("周辺抹殺", "Mass Genocide");
+               if (desc) return _("自分の周囲にいるモンスターを現在の階から消し去る。抵抗されると無効。",
+                       "Eliminates all nearby monsters, exhausting you.  Powerful or unique monsters may be able to resist.");
+
+               {
+                       int power = plev + 50;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               mass_genocide(power, TRUE);
+                       }
+               }
+               break;
+
+       case 30:
+               if (name) return _("地獄の劫火", "Hellfire");
+               if (desc) return _("邪悪な力を持つ宝珠を放つ。善良なモンスターには大きなダメージを与える。",
+                       "Fires a powerful ball of evil power. Hurts good monsters greatly.");
+
+               {
+                       HIT_POINT dam = 666;
+                       POSITION rad = 3;
+
+                       if (info) return info_damage(0, 0, dam);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               fire_ball(GF_HELL_FIRE, dir, dam, rad);
+                               take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("地獄の劫火の呪文を唱えた疲労", "the strain of casting Hellfire"), -1);
+                       }
+               }
+               break;
+
+       case 31:
+               if (name) return _("幽体化", "Wraithform");
+               if (desc) return _("一定時間、壁を通り抜けることができ受けるダメージが軽減される幽体の状態に変身する。",
+                       "Becomes wraith form which gives ability to pass walls and makes all damages half.");
+
+               {
+                       int base = plev / 2;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_wraith_form(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+       }
+
+       return "";
+}