OSDN Git Service

[Refactor] #37353 聖浄の杖の効果を cleasing_nova() に分離。 / Separate implementation of 'staff...
[hengband/hengband.git] / src / realm-crusade.c
index 043729e..10d545e 100644 (file)
-#include "angband.h"\r
-#include "cmd-spell.h"\r
-\r
-\r
-\r
-/*!\r
-* @brief \94j\8e×\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_crusade_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
-       int dir;\r
-       int plev = p_ptr->lev;\r
-\r
-       switch (spell)\r
-       {\r
-       case 0:\r
-               if (name) return _("\92¦\94±", "Punishment");\r
-               if (desc) return _("\93d\8c\82\82Ì\83{\83\8b\83g\82à\82µ\82­\82Í\83r\81[\83\80\82ð\95ú\82Â\81B", "Fires a bolt or beam of lightning.");\r
-\r
-               {\r
-                       int dice = 3 + (plev - 1) / 5;\r
-                       int sides = 4;\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() - 10, GF_ELEC, dir, damroll(dice, sides));\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 1:\r
-               if (name) return _("\8e×\88«\91\8dÝ\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 2:\r
-               if (name) return _("\8b°\95|\8f\9c\8b\8e", "Remove Fear");\r
-               if (desc) return _("\8b°\95|\82ð\8eæ\82è\8f\9c\82­\81B", "Removes fear.");\r
-\r
-               {\r
-                       if (cast)\r
-                       {\r
-                               set_afraid(0);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 3:\r
-               if (name) return _("\88Ð\88³", "Scare Monster");\r
-               if (desc) return _("\83\82\83\93\83X\83^\81[1\91Ì\82ð\8b°\95|\82³\82¹\82é\81B\92ï\8dR\82³\82ê\82é\82Æ\96³\8cø\81B", "Attempts to scare 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
-                       }\r
-               }\r
-               break;\r
-\r
-       case 4:\r
-               if (name) return _("\90¹\88æ", "Sanctuary");\r
-               if (desc) return _("\97×\90Ú\82µ\82½\91S\82Ä\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 monsters in the adjacent squares.");\r
-\r
-               {\r
-                       int power = plev;\r
-\r
-                       if (info) return info_power(power);\r
-\r
-                       if (cast)\r
-                       {\r
-                               sleep_monsters_touch();\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 5:\r
-               if (name) return _("\93ü\8cû", "Portal");\r
-               if (desc) return _("\92\86\8b\97\97£\82Ì\83e\83\8c\83|\81[\83g\82ð\82·\82é\81B", "Teleport medium distance.");\r
-\r
-               {\r
-                       POSITION range = 25 + plev / 2;\r
-\r
-                       if (info) return info_range(range);\r
-\r
-                       if (cast)\r
-                       {\r
-                               teleport_player(range, 0L);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 6:\r
-               if (name) return _("\83X\83^\81[\83_\83X\83g", "Star Dust");\r
-               if (desc) return _("\83^\81[\83Q\83b\83g\95t\8bß\82É\91M\8cõ\82Ì\83{\83\8b\83g\82ð\98A\8eË\82·\82é\81B", "Fires many bolts of light near the target.");\r
-\r
-               {\r
-                       int dice = 3 + (plev - 1) / 9;\r
-                       int sides = 2;\r
-\r
-                       if (info) return info_multi_damage_dice(dice, sides);\r
-\r
-                       if (cast)\r
-                       {\r
-                               if (!get_aim_dir(&dir)) return NULL;\r
-                               fire_blast(GF_LITE, dir, dice, sides, 10, 3);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 7:\r
-               if (name) return _("\90g\91Ì\8fò\89»", "Purify");\r
-               if (desc) return _("\8f\9d\81A\93Å\81A\9eN\9eO\82©\82ç\91S\89õ\82·\82é\81B", "Heals all cut, stun and poison status.");\r
-\r
-               {\r
-                       if (cast)\r
-                       {\r
-                               set_cut(0);\r
-                               set_poisoned(0);\r
-                               set_stun(0);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 8:\r
-               if (name) return _("\8e×\88«\94ò\82Î\82µ", "Scatter Evil");\r
-               if (desc) return _("\8e×\88«\82È\83\82\83\93\83X\83^\81[1\91Ì\82ð\83e\83\8c\83|\81[\83g\82³\82¹\82é\81B\92ï\8dR\82³\82ê\82é\82Æ\96³\8cø\81B", "Attempts to teleport an evil monster away.");\r
-\r
-               {\r
-                       int power = MAX_SIGHT * 5;\r
-\r
-                       if (info) return info_power(power);\r
-\r
-                       if (cast)\r
-                       {\r
-                               if (!get_aim_dir(&dir)) return NULL;\r
-                               fire_ball(GF_AWAY_EVIL, dir, power, 0);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 9:\r
-               if (name) return _("\90¹\82È\82é\8cõ\8b\85", "Holy Orb");\r
-               if (desc) return _("\90¹\82È\82é\97Í\82ð\82à\82Â\95ó\8eì\82ð\95ú\82Â\81B\8e×\88«\82È\83\82\83\93\83X\83^\81[\82É\91Î\82µ\82Ä\91å\82«\82È\83_\83\81\81[\83W\82ð\97^\82¦\82é\82ª\81A\91P\97Ç\82È\83\82\83\93\83X\83^\81[\82É\82Í\8cø\89Ê\82ª\82È\82¢\81B",\r
-                       "Fires a ball with holy power. Hurts evil monsters greatly, but don't effect good monsters.");\r
-\r
-               {\r
-                       int dice = 3;\r
-                       int sides = 6;\r
-                       int rad = (plev < 30) ? 2 : 3;\r
-                       int base;\r
-\r
-                       if (p_ptr->pclass == CLASS_PRIEST ||\r
-                               p_ptr->pclass == CLASS_HIGH_MAGE ||\r
-                               p_ptr->pclass == CLASS_SORCERER)\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_HOLY_FIRE, dir, damroll(dice, sides) + base, rad);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 10:\r
-               if (name) return _("\88«\96\82\95¥\82¢", "Exorcism");\r
-               if (desc) return _("\8e\8b\8aE\93à\82Ì\91S\82Ä\82Ì\83A\83\93\83f\83b\83h\8by\82Ñ\88«\96\82\82É\83_\83\81\81[\83W\82ð\97^\82¦\81A\8e×\88«\82È\83\82\83\93\83X\83^\81[\82ð\8b°\95|\82³\82¹\82é\81B",\r
-                       "Damages all undead and demons in sight, and scares all evil monsters in sight.");\r
-\r
-               {\r
-                       int sides = plev;\r
-                       int power = plev;\r
-\r
-                       if (info) return info_damage(1, sides, 0);\r
-\r
-                       if (cast)\r
-                       {\r
-                               dispel_undead(randint1(sides));\r
-                               dispel_demons(randint1(sides));\r
-                               turn_evil(power);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 11:\r
-               if (name) return _("\89ð\8eô", "Remove Curse");\r
-               if (desc) return _("\83A\83C\83e\83\80\82É\82©\82©\82Á\82½\8eã\82¢\8eô\82¢\82ð\89ð\8f\9c\82·\82é\81B", "Removes normal curses from equipped items.");\r
-\r
-               {\r
-                       if (cast)\r
-                       {\r
-                               if (remove_curse())\r
-                               {\r
-                                       msg_print(_("\92N\82©\82É\8c©\8eç\82ç\82ê\82Ä\82¢\82é\82æ\82¤\82È\8bC\82ª\82·\82é\81B", "You feel as if someone is watching over you."));\r
-                               }\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 12:\r
-               if (name) return _("\93§\96¾\8e\8b\94F", "Sense Unseen");\r
-               if (desc) return _("\88ê\92è\8e\9e\8aÔ\81A\93§\96¾\82È\82à\82Ì\82ª\8c©\82¦\82é\82æ\82¤\82É\82È\82é\81B", "Gives see invisible for a while.");\r
-\r
-               {\r
-                       int base = 24;\r
-\r
-                       if (info) return info_duration(base, base);\r
-\r
-                       if (cast)\r
-                       {\r
-                               set_tim_invis(randint1(base) + base, FALSE);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 13:\r
-               if (name) return _("\91Î\8e×\88«\8c\8b\8aE", "Protection from Evil");\r
-               if (desc) return _("\8e×\88«\82È\83\82\83\93\83X\83^\81[\82Ì\8dU\8c\82\82ð\96h\82®\83o\83\8a\83A\82ð\92£\82é\81B", "Gives aura which protect you from evil monster's physical attack.");\r
-\r
-               {\r
-                       int base = 25;\r
-                       int sides = 3 * plev;\r
-\r
-                       if (info) return info_duration(base, sides);\r
-\r
-                       if (cast)\r
-                       {\r
-                               set_protevil(randint1(sides) + base, FALSE);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 14:\r
-               if (name) return _("\8dÙ\82«\82Ì\97\8b", "Judgment Thunder");\r
-               if (desc) return _("\8b­\97Í\82È\93d\8c\82\82Ì\83{\83\8b\83g\82ð\95ú\82Â\81B", "Fires a powerful bolt of lightning.");\r
-\r
-               {\r
-                       HIT_POINT dam = plev * 5;\r
-\r
-                       if (info) return info_damage(0, 0, dam);\r
-\r
-                       if (cast)\r
-                       {\r
-                               if (!get_aim_dir(&dir)) return NULL;\r
-                               fire_bolt(GF_ELEC, dir, dam);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 15:\r
-               if (name) return _("\90¹\82È\82é\8cä\8c¾\97t", "Holy Word");\r
-               if (desc) return _("\8e\8b\8aE\93à\82Ì\8e×\88«\82È\91\8dÝ\82É\91å\82«\82È\83_\83\81\81[\83W\82ð\97^\82¦\81A\91Ì\97Í\82ð\89ñ\95\9c\82µ\81A\93Å\81A\8b°\95|\81A\9eN\9eO\8fó\91Ô\81A\95\89\8f\9d\82©\82ç\91S\89õ\82·\82é\81B",\r
-                       "Damages all evil monsters in sight, heals HP somewhat, and completely heals poison, fear, stun and cut status.");\r
-\r
-               {\r
-                       int dam_sides = plev * 6;\r
-                       int heal = 100;\r
-\r
-                       if (info) return format(_("\91¹:1d%d/\89ñ%d", "dam:d%d/h%d"), dam_sides, heal);\r
-                       if (cast)\r
-                       {\r
-                               dispel_evil(randint1(dam_sides));\r
-                               hp_player(heal);\r
-                               set_afraid(0);\r
-                               set_poisoned(0);\r
-                               set_stun(0);\r
-                               set_cut(0);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 16:\r
-               if (name) return _("\8aJ\82©\82ê\82½\93¹", "Unbarring Ways");\r
-               if (desc) return _("\88ê\92¼\90ü\8fã\82Ì\91S\82Ä\82Ìã©\82Æ\94à\82ð\94j\89ó\82·\82é\81B", "Fires a beam which destroy traps and doors.");\r
-\r
-               {\r
-                       if (cast)\r
-                       {\r
-                               if (!get_aim_dir(&dir)) return NULL;\r
-\r
-                               destroy_door(dir);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 17:\r
-               if (name) return _("\95\95\96\82", "Arrest");\r
-               if (desc) return _("\8e×\88«\82È\83\82\83\93\83X\83^\81[\82Ì\93®\82«\82ð\8e~\82ß\82é\81B", "Attempts to paralyze an evil monster.");\r
-\r
-               {\r
-                       int power = plev * 2;\r
-\r
-                       if (info) return info_power(power);\r
-\r
-                       if (cast)\r
-                       {\r
-                               if (!get_aim_dir(&dir)) return NULL;\r
-                               stasis_evil(dir);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 18:\r
-               if (name) return _("\90¹\82È\82é\83I\81[\83\89", "Holy Aura");\r
-               if (desc) return _("\88ê\92è\8e\9e\8aÔ\81A\8e×\88«\82È\83\82\83\93\83X\83^\81[\82ð\8f\9d\82Â\82¯\82é\90¹\82È\82é\83I\81[\83\89\82ð\93¾\82é\81B",\r
-                       "Gives aura of holy power which injures evil monsters which attacked you for a while.");\r
-\r
-               {\r
-                       int base = 20;\r
-\r
-                       if (info) return info_duration(base, base);\r
-\r
-                       if (cast)\r
-                       {\r
-                               set_tim_sh_holy(randint1(base) + base, FALSE);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 19:\r
-               if (name) return _("\83A\83\93\83f\83b\83h&\88«\96\82\91Þ\8eU", "Dispel Undead & Demons");\r
-               if (desc) return _("\8e\8b\8aE\93à\82Ì\91S\82Ä\82Ì\83A\83\93\83f\83b\83h\8by\82Ñ\88«\96\82\82É\83_\83\81\81[\83W\82ð\97^\82¦\82é\81B", "Damages all undead and demons in sight.");\r
-\r
-               {\r
-                       int sides = plev * 4;\r
-\r
-                       if (info) return info_damage(1, sides, 0);\r
-\r
-                       if (cast)\r
-                       {\r
-                               dispel_undead(randint1(sides));\r
-                               dispel_demons(randint1(sides));\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 20:\r
-               if (name) return _("\8e×\88«\91Þ\8eU", "Dispel Evil");\r
-               if (desc) return _("\8e\8b\8aE\93à\82Ì\91S\82Ä\82Ì\8e×\88«\82È\83\82\83\93\83X\83^\81[\82É\83_\83\81\81[\83W\82ð\97^\82¦\82é\81B", "Damages all evil monsters in sight.");\r
-\r
-               {\r
-                       int sides = plev * 4;\r
-\r
-                       if (info) return info_damage(1, sides, 0);\r
-\r
-                       if (cast)\r
-                       {\r
-                               dispel_evil(randint1(sides));\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 21:\r
-               if (name) return _("\90¹\82È\82é\90n", "Holy Blade");\r
-               if (desc) return _("\92Ê\8fí\82Ì\95\90\8aí\82É\96Å\8e×\82Ì\91®\90«\82ð\82Â\82¯\82é\81B", "Makes current weapon especially deadly against evil monsters.");\r
-\r
-               {\r
-                       if (cast)\r
-                       {\r
-                               brand_weapon(13);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 22:\r
-               if (name) return _("\83X\83^\81[\83o\81[\83X\83g", "Star Burst");\r
-               if (desc) return _("\8b\90\91å\82È\91M\8cõ\82Ì\8b\85\82ð\95ú\82Â\81B", "Fires a huge ball of powerful light.");\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_LITE, dir, dam, rad);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 23:\r
-               if (name) return _("\93V\8eg\8f¢\8a«", "Summon Angel");\r
-               if (desc) return _("\93V\8eg\82ð1\91Ì\8f¢\8a«\82·\82é\81B", "Summons an angel.");\r
-\r
-               {\r
-                       if (cast)\r
-                       {\r
-                               bool pet = !one_in_(3);\r
-                               u32b flg = 0L;\r
-\r
-                               if (pet) flg |= PM_FORCE_PET;\r
-                               else flg |= PM_NO_PET;\r
-                               if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;\r
-\r
-                               if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_ANGEL, flg))\r
-                               {\r
-                                       if (pet)\r
-                                       {\r
-                                               msg_print(_("\81u\82²\97p\82Å\82²\82´\82¢\82Ü\82·\82©\81A\82²\8eå\90l\97l\81v", "'What is thy bidding... Master?'"));\r
-                                       }\r
-                                       else\r
-                                       {\r
-                                               msg_print(_("\81u\89ä\82Í\93ð\82Ì\89º\96l\82É\82 \82ç\82¸\81\88«\8ds\8eÒ\82æ\81A\89÷\82¢\89ü\82ß\82æ\81I\81v", "Mortal! Repent of thy impiousness."));\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 24:\r
-               if (name) return _("\8em\8bC\8d\82\97g", "Heroism");\r
-               if (desc) return _("\88ê\92è\8e\9e\8aÔ\81A\83q\81[\83\8d\81[\8bC\95ª\82É\82È\82é\81B", "Removes fear, and gives bonus to hit and 10 more HP for a while.");\r
-\r
-               {\r
-                       int base = 25;\r
-\r
-                       if (info) return info_duration(base, base);\r
-\r
-                       if (cast)\r
-                       {\r
-                               set_hero(randint1(base) + base, FALSE);\r
-                               hp_player(10);\r
-                               set_afraid(0);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 25:\r
-               if (name) return _("\8eô\82¢\91Þ\8eU", "Dispel Curse");\r
-               if (desc) return _("\83A\83C\83e\83\80\82É\82©\82©\82Á\82½\8b­\97Í\82È\8eô\82¢\82ð\89ð\8f\9c\82·\82é\81B", "Removes normal and heavy curse from equipped items.");\r
-\r
-               {\r
-                       if (cast)\r
-                       {\r
-                               if (remove_all_curse())\r
-                               {\r
-                                       msg_print(_("\92N\82©\82É\8c©\8eç\82ç\82ê\82Ä\82¢\82é\82æ\82¤\82È\8bC\82ª\82·\82é\81B", "You feel as if someone is watching over you."));\r
-                               }\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 26:\r
-               if (name) return _("\8e×\88«\92Ç\95ú", "Banish Evil");\r
-               if (desc) return _("\8e\8b\8aE\93à\82Ì\91S\82Ä\82Ì\8e×\88«\82È\83\82\83\93\83X\83^\81[\82ð\83e\83\8c\83|\81[\83g\82³\82¹\82é\81B\92ï\8dR\82³\82ê\82é\82Æ\96³\8cø\81B",\r
-                       "Teleports all evil monsters in sight away unless resisted.");\r
-\r
-               {\r
-                       int power = 100;\r
-\r
-                       if (info) return info_power(power);\r
-\r
-                       if (cast)\r
-                       {\r
-                               if (banish_evil(power))\r
-                               {\r
-                                       msg_print(_("\90_\90¹\82È\97Í\82ª\8e×\88«\82ð\91Å\82¿\95¥\82Á\82½\81I", "The holy power banishes evil!"));\r
-                               }\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 27:\r
-               if (name) return _("\83n\83\8b\83}\83Q\83h\83\93", "Armageddon");\r
-               if (desc) return _("\8eü\95Ó\82Ì\83A\83C\83e\83\80\81A\83\82\83\93\83X\83^\81[\81A\92n\8c`\82ð\94j\89ó\82·\82é\81B", "Destroy everything in nearby area.");\r
-\r
-               {\r
-                       int base = 12;\r
-                       int sides = 4;\r
-\r
-                       if (cast)\r
-                       {\r
-                               destroy_area(p_ptr->y, p_ptr->x, base + randint1(sides), FALSE);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 28:\r
-               if (name) return _("\96Ú\82É\82Í\96Ú\82ð", "An Eye for an Eye");\r
-               if (desc) return _("\88ê\92è\8e\9e\8aÔ\81A\8e©\95ª\82ª\83_\83\81\81[\83W\82ð\8eó\82¯\82½\82Æ\82«\82É\8dU\8c\82\82ð\8ds\82Á\82½\83\82\83\93\83X\83^\81[\82É\91Î\82µ\82Ä\93¯\93\99\82Ì\83_\83\81\81[\83W\82ð\97^\82¦\82é\81B",\r
-                       "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.");\r
-\r
-               {\r
-                       int base = 10;\r
-\r
-                       if (info) return info_duration(base, base);\r
-\r
-                       if (cast)\r
-                       {\r
-                               set_tim_eyeeye(randint1(base) + base, FALSE);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 29:\r
-               if (name) return _("\90_\82Ì\93{\82è", "Wrath of the God");\r
-               if (desc) return _("\83^\81[\83Q\83b\83g\82Ì\8eü\88Í\82É\95ª\89ð\82Ì\8b\85\82ð\91½\90\94\97\8e\82Æ\82·\81B", "Drops many balls of disintegration near the target.");\r
-\r
-               {\r
-                       HIT_POINT dam = plev * 3 + 25;\r
-                       int rad = 2;\r
-\r
-                       if (info) return info_multi_damage(dam);\r
-\r
-                       if (cast)\r
-                       {\r
-                               if (!cast_wrath_of_the_god(dam, rad)) return NULL;\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 30:\r
-               if (name) return _("\90_\88Ð", "Divine Intervention");\r
-               if (desc) return _("\97×\90Ú\82·\82é\83\82\83\93\83X\83^\81[\82É\90¹\82È\82é\83_\83\81\81[\83W\82ð\97^\82¦\81A\8e\8b\8aE\93à\82Ì\83\82\83\93\83X\83^\81[\82É\83_\83\81\81[\83W\81A\8c¸\91¬\81A\9eN\9eO\81A\8d¬\97\90\81A\8b°\95|\81A\96°\82è\82ð\97^\82¦\82é\81B\82³\82ç\82É\91Ì\97Í\82ð\89ñ\95\9c\82·\82é\81B",\r
-                       "Damages all adjacent monsters with holy power. Damages and attempt to slow, stun, confuse, scare and freeze all monsters in sight. And heals HP.");\r
-\r
-               {\r
-                       int b_dam = plev * 11;\r
-                       int d_dam = plev * 4;\r
-                       int heal = 100;\r
-                       int power = plev * 4;\r
-\r
-                       if (info) return format(_("\89ñ%d/\91¹%d+%d", "h%d/dm%d+%d"), heal, d_dam, b_dam / 2);\r
-                       if (cast)\r
-                       {\r
-                               project(0, 1, p_ptr->y, p_ptr->x, b_dam, GF_HOLY_FIRE, PROJECT_KILL, -1);\r
-                               dispel_monsters(d_dam);\r
-                               slow_monsters(plev);\r
-                               stun_monsters(power);\r
-                               confuse_monsters(power);\r
-                               turn_monsters(power);\r
-                               stasis_monsters(power);\r
-                               hp_player(heal);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 31:\r
-               if (name) return _("\90¹\90í", "Crusade");\r
-               if (desc) return _("\8e\8b\8aE\93à\82Ì\91P\97Ç\82È\83\82\83\93\83X\83^\81[\82ð\83y\83b\83g\82É\82µ\82æ\82¤\82Æ\82µ\81A\82È\82ç\82È\82©\82Á\82½\8fê\8d\87\8by\82Ñ\91P\97Ç\82Å\82È\82¢\83\82\83\93\83X\83^\81[\82ð\8b°\95|\82³\82¹\82é\81B\82³\82ç\82É\91½\90\94\82Ì\89Á\91¬\82³\82ê\82½\8bR\8em\82ð\8f¢\8a«\82µ\81A\83q\81[\83\8d\81[\81A\8fj\95\9f\81A\89Á\91¬\81A\91Î\8e×\88«\8c\8b\8aE\82ð\93¾\82é\81B",\r
-                       "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.");\r
-\r
-               {\r
-                       if (cast)\r
-                       {\r
-                               int base = 25;\r
-                               int sp_sides = 20 + plev;\r
-                               int sp_base = plev;\r
-\r
-                               int i;\r
-                               crusade();\r
-                               for (i = 0; i < 12; i++)\r
-                               {\r
-                                       int attempt = 10;\r
-                                       POSITION my = 0, mx = 0;\r
-\r
-                                       while (attempt--)\r
-                                       {\r
-                                               scatter(&my, &mx, p_ptr->y, p_ptr->x, 4, 0);\r
-\r
-                                               /* Require empty grids */\r
-                                               if (cave_empty_bold2(my, mx)) break;\r
-                                       }\r
-                                       if (attempt < 0) continue;\r
-                                       summon_specific(-1, my, mx, plev, SUMMON_KNIGHTS, (PM_ALLOW_GROUP | PM_FORCE_PET | PM_HASTE));\r
-                               }\r
-                               set_hero(randint1(base) + base, FALSE);\r
-                               set_blessed(randint1(base) + base, FALSE);\r
-                               set_fast(randint1(sp_sides) + sp_base, FALSE);\r
-                               set_protevil(randint1(base) + base, FALSE);\r
-                               set_afraid(0);\r
-                       }\r
-               }\r
-               break;\r
-       }\r
-\r
-       return "";\r
-}\r
-\r
+#include "angband.h"
+#include "cmd-spell.h"
+#include "spells-summon.h"
+#include "projection.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_crusade_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 _("懲罰", "Punishment");
+               if (desc) return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");
+               {
+                       DICE_NUMBER dice = 3 + (plev - 1) / 5;
+                       DICE_SID sides = 4;
+                       if (info) return info_damage(dice, sides, 0);
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+                               fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));
+                       }
+               }
+               break;
+
+       case 1:
+               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 2:
+               if (name) return _("恐怖除去", "Remove Fear");
+               if (desc) return _("恐怖を取り除く。", "Removes fear.");
+               {
+                       if (cast) set_afraid(0);
+               }
+               break;
+
+       case 3:
+               if (name) return _("威圧", "Scare Monster");
+               if (desc) return _("モンスター1体を恐怖させる。抵抗されると無効。", "Attempts to scare a monster.");
+
+               {
+                       PLAYER_LEVEL power = plev;
+                       if (info) return info_power(power);
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+                               fear_monster(dir, power);
+                       }
+               }
+               break;
+
+       case 4:
+               if (name) return _("聖域", "Sanctuary");
+               if (desc) return _("隣接した全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep monsters in the adjacent squares.");
+               {
+                       PLAYER_LEVEL power = plev;
+                       if (info) return info_power(power);
+                       if (cast) sleep_monsters_touch();
+               }
+               break;
+
+       case 5:
+               if (name) return _("入口", "Portal");
+               if (desc) return _("中距離のテレポートをする。", "Teleport medium distance.");
+
+               {
+                       POSITION range = 25 + plev / 2;
+                       if (info) return info_range(range);
+                       if (cast) teleport_player(range, 0L);
+               }
+               break;
+
+       case 6:
+               if (name) return _("スターダスト", "Star Dust");
+               if (desc) return _("ターゲット付近に閃光のボルトを連射する。", "Fires many bolts of light near the target.");
+
+               {
+                       DICE_NUMBER dice = 3 + (plev - 1) / 9;
+                       DICE_SID sides = 2;
+                       if (info) return info_multi_damage_dice(dice, sides);
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+                               fire_blast(GF_LITE, dir, dice, sides, 10, 3);
+                       }
+               }
+               break;
+
+       case 7:
+               if (name) return _("身体浄化", "Purify");
+               if (desc) return _("傷、毒、朦朧から全快する。", "Heals all cut, stun and poison status.");
+               {
+                       if (cast)
+                       {
+                               set_cut(0);
+                               set_poisoned(0);
+                               set_stun(0);
+                       }
+               }
+               break;
+
+       case 8:
+               if (name) return _("邪悪飛ばし", "Scatter Evil");
+               if (desc) return _("邪悪なモンスター1体をテレポートさせる。抵抗されると無効。", "Attempts to teleport an evil monster away.");
+
+               {
+                       int power = MAX_SIGHT * 5;
+                       if (info) return info_power(power);
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+                               fire_ball(GF_AWAY_EVIL, dir, power, 0);
+                       }
+               }
+               break;
+
+       case 9:
+               if (name) return _("聖なる光球", "Holy Orb");
+               if (desc) return _("聖なる力をもつ宝珠を放つ。邪悪なモンスターに対して大きなダメージを与えるが、善良なモンスターには効果がない。",
+                       "Fires a ball with holy power. Hurts evil monsters greatly, but don't effect good monsters.");
+
+               {
+                       DICE_NUMBER dice = 3;
+                       DICE_SID sides = 6;
+                       POSITION rad = (plev < 30) ? 2 : 3;
+                       int base;
+                       if (p_ptr->pclass == CLASS_PRIEST ||
+                               p_ptr->pclass == CLASS_HIGH_MAGE ||
+                               p_ptr->pclass == CLASS_SORCERER)
+                               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_HOLY_FIRE, dir, damroll(dice, sides) + base, rad);
+                       }
+               }
+               break;
+
+       case 10:
+               if (name) return _("悪魔払い", "Exorcism");
+               if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与え、邪悪なモンスターを恐怖させる。",
+                       "Damages all undead and demons in sight, and scares all evil monsters in sight.");
+               {
+                       DICE_SID sides = plev;
+                       int power = plev;
+                       if (info) return info_damage(1, sides, 0);
+                       if (cast)
+                       {
+                               dispel_undead(randint1(sides));
+                               dispel_demons(randint1(sides));
+                               turn_evil(power);
+                       }
+               }
+               break;
+
+       case 11:
+               if (name) return _("解呪", "Remove Curse");
+               if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
+               {
+                       if (cast) (void)remove_curse();
+               }
+               break;
+
+       case 12:
+               if (name) return _("透明視認", "Sense Unseen");
+               if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");
+
+               {
+                       int base = 24;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_tim_invis(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case 13:
+               if (name) return _("対邪悪結界", "Protection from Evil");
+               if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");
+
+               {
+                       int base = 25;
+                       DICE_SID sides = 3 * plev;
+
+                       if (info) return info_duration(base, sides);
+
+                       if (cast)
+                       {
+                               set_protevil(randint1(sides) + base, FALSE);
+                       }
+               }
+               break;
+
+       case 14:
+               if (name) return _("裁きの雷", "Judgment Thunder");
+               if (desc) return _("強力な電撃のボルトを放つ。", "Fires a powerful bolt of lightning.");
+
+               {
+                       HIT_POINT dam = plev * 5;
+
+                       if (info) return info_damage(0, 0, dam);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+                               fire_bolt(GF_ELEC, dir, dam);
+                       }
+               }
+               break;
+
+       case 15:
+               if (name) return _("聖なる御言葉", "Holy Word");
+               if (desc) return _("視界内の邪悪な存在に大きなダメージを与え、体力を回復し、毒、恐怖、朦朧状態、負傷から全快する。",
+                       "Damages all evil monsters in sight, heals HP somewhat, and completely heals poison, fear, stun and cut status.");
+
+               {
+                       int dam_sides = plev * 6;
+                       int heal = 100;
+
+                       if (info) return format(_("損:1d%d/回%d", "dam:d%d/h%d"), dam_sides, heal);
+                       if (cast)
+                       {
+                               dispel_evil(randint1(dam_sides));
+                               hp_player(heal);
+                               set_afraid(0);
+                               set_poisoned(0);
+                               set_stun(0);
+                               set_cut(0);
+                       }
+               }
+               break;
+
+       case 16:
+               if (name) return _("開かれた道", "Unbarring Ways");
+               if (desc) return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");
+
+               {
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+
+                               destroy_door(dir);
+                       }
+               }
+               break;
+
+       case 17:
+               if (name) return _("封魔", "Arrest");
+               if (desc) return _("邪悪なモンスターの動きを止める。", "Attempts to paralyze an evil monster.");
+
+               {
+                       int power = plev * 2;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (!get_aim_dir(&dir)) return NULL;
+                               stasis_evil(dir);
+                       }
+               }
+               break;
+
+       case 18:
+               if (name) return _("聖なるオーラ", "Holy Aura");
+               if (desc) return _("一定時間、邪悪なモンスターを傷つける聖なるオーラを得る。",
+                       "Gives aura of holy power which injures evil monsters which attacked you for a while.");
+
+               {
+                       int base = 20;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_tim_sh_holy(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case 19:
+               if (name) return _("アンデッド&悪魔退散", "Dispel Undead & Demons");
+               if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与える。", "Damages all undead and demons in sight.");
+
+               {
+                       DICE_SID sides = plev * 4;
+
+                       if (info) return info_damage(1, sides, 0);
+
+                       if (cast)
+                       {
+                               dispel_undead(randint1(sides));
+                               dispel_demons(randint1(sides));
+                       }
+               }
+               break;
+
+       case 20:
+               if (name) return _("邪悪退散", "Dispel Evil");
+               if (desc) return _("視界内の全ての邪悪なモンスターにダメージを与える。", "Damages all evil monsters in sight.");
+
+               {
+                       DICE_SID sides = plev * 4;
+
+                       if (info) return info_damage(1, sides, 0);
+
+                       if (cast)
+                       {
+                               dispel_evil(randint1(sides));
+                       }
+               }
+               break;
+
+       case 21:
+               if (name) return _("聖なる刃", "Holy Blade");
+               if (desc) return _("通常の武器に滅邪の属性をつける。", "Makes current weapon especially deadly against evil monsters.");
+
+               {
+                       if (cast)
+                       {
+                               brand_weapon(13);
+                       }
+               }
+               break;
+
+       case 22:
+               if (name) return _("スターバースト", "Star Burst");
+               if (desc) return _("巨大な閃光の球を放つ。", "Fires a huge ball of powerful light.");
+
+               {
+                       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_LITE, dir, dam, rad);
+                       }
+               }
+               break;
+
+       case 23:
+               if (name) return _("天使召喚", "Summon Angel");
+               if (desc) return _("天使を1体召喚する。", "Summons an angel.");
+
+               {
+                       if (cast)
+                       {
+                               bool pet = !one_in_(3);
+                               u32b flg = 0L;
+
+                               if (pet) flg |= PM_FORCE_PET;
+                               else flg |= PM_NO_PET;
+                               if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;
+
+                               if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_ANGEL, flg, '\0'))
+                               {
+                                       if (pet)
+                                       {
+                                               msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
+                                       }
+                                       else
+                                       {
+                                               msg_print(_("「我は汝の下僕にあらず! 悪行者よ、悔い改めよ!」", "Mortal! Repent of thy impiousness."));
+                                       }
+                               }
+                       }
+               }
+               break;
+
+       case 24:
+               if (name) return _("士気高揚", "Heroism");
+               if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");
+
+               {
+                       int base = 25;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               (void)heroism(base);
+                       }
+               }
+               break;
+
+       case 25:
+               if (name) return _("呪い退散", "Dispel Curse");
+               if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
+
+               {
+                       if (cast) (void)remove_all_curse();
+               }
+               break;
+
+       case 26:
+               if (name) return _("邪悪追放", "Banish Evil");
+               if (desc) return _("視界内の全ての邪悪なモンスターをテレポートさせる。抵抗されると無効。",
+                       "Teleports all evil monsters in sight away unless resisted.");
+
+               {
+                       int power = 100;
+
+                       if (info) return info_power(power);
+
+                       if (cast)
+                       {
+                               if (banish_evil(power))
+                               {
+                                       msg_print(_("神聖な力が邪悪を打ち払った!", "The holy power banishes evil!"));
+                               }
+                       }
+               }
+               break;
+
+       case 27:
+               if (name) return _("ハルマゲドン", "Armageddon");
+               if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroy everything in nearby area.");
+
+               {
+                       int base = 12;
+                       DICE_SID sides = 4;
+
+                       if (cast)
+                       {
+                               destroy_area(p_ptr->y, p_ptr->x, base + randint1(sides), FALSE);
+                       }
+               }
+               break;
+
+       case 28:
+               if (name) return _("目には目を", "An Eye for an Eye");
+               if (desc) return _("一定時間、自分がダメージを受けたときに攻撃を行ったモンスターに対して同等のダメージを与える。",
+                       "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.");
+
+               {
+                       int base = 10;
+
+                       if (info) return info_duration(base, base);
+
+                       if (cast)
+                       {
+                               set_tim_eyeeye(randint1(base) + base, FALSE);
+                       }
+               }
+               break;
+
+       case 29:
+               if (name) return _("神の怒り", "Wrath of the God");
+               if (desc) return _("ターゲットの周囲に分解の球を多数落とす。", "Drops many balls of disintegration near the target.");
+
+               {
+                       HIT_POINT dam = plev * 3 + 25;
+                       POSITION rad = 2;
+
+                       if (info) return info_multi_damage(dam);
+
+                       if (cast)
+                       {
+                               if (!cast_wrath_of_the_god(dam, rad)) return NULL;
+                       }
+               }
+               break;
+
+       case 30:
+               if (name) return _("神威", "Divine Intervention");
+               if (desc) return _("隣接するモンスターに聖なるダメージを与え、視界内のモンスターにダメージ、減速、朦朧、混乱、恐怖、眠りを与える。さらに体力を回復する。",
+                       "Damages all adjacent monsters with holy power. Damages and attempt to slow, stun, confuse, scare and freeze all monsters in sight. And heals HP.");
+
+               {
+                       int b_dam = plev * 11;
+                       int d_dam = plev * 4;
+                       int heal = 100;
+                       int power = plev * 4;
+
+                       if (info) return format(_("回%d/損%d+%d", "h%d/dm%d+%d"), heal, d_dam, b_dam / 2);
+                       if (cast)
+                       {
+                               project(0, 1, p_ptr->y, p_ptr->x, b_dam, GF_HOLY_FIRE, PROJECT_KILL, -1);
+                               dispel_monsters(d_dam);
+                               slow_monsters(plev);
+                               stun_monsters(power);
+                               confuse_monsters(power);
+                               turn_monsters(power);
+                               stasis_monsters(power);
+                               hp_player(heal);
+                       }
+               }
+               break;
+
+       case 31:
+               if (name) return _("聖戦", "Crusade");
+               if (desc) return _("視界内の善良なモンスターをペットにしようとし、ならなかった場合及び善良でないモンスターを恐怖させる。さらに多数の加速された騎士を召喚し、ヒーロー、祝福、加速、対邪悪結界を得る。",
+                       "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.");
+
+               {
+                       if (cast)
+                       {
+                               int base = 25;
+                               int sp_sides = 20 + plev;
+                               int sp_base = plev;
+
+                               int i;
+                               crusade();
+                               for (i = 0; i < 12; i++)
+                               {
+                                       int attempt = 10;
+                                       POSITION my = 0, mx = 0;
+
+                                       while (attempt--)
+                                       {
+                                               scatter(&my, &mx, p_ptr->y, p_ptr->x, 4, 0);
+
+                                               /* Require empty grids */
+                                               if (cave_empty_bold2(my, mx)) break;
+                                       }
+                                       if (attempt < 0) continue;
+                                       summon_specific(-1, my, mx, plev, SUMMON_KNIGHTS, (PM_ALLOW_GROUP | PM_FORCE_PET | PM_HASTE), '\0');
+                               }
+                               set_hero(randint1(base) + base, FALSE);
+                               set_blessed(randint1(base) + base, FALSE);
+                               set_fast(randint1(sp_sides) + sp_base, FALSE);
+                               set_protevil(randint1(base) + base, FALSE);
+                               set_afraid(0);
+                       }
+               }
+               break;
+       }
+
+       return "";
+}
+