#include "realm-arcane.h"\r
#include "realm-chaos.h"\r
#include "realm-craft.h"\r
+#include "realm-crusade.h"\r
#include "realm-daemon.h"\r
#include "realm-death.h"\r
#include "realm-life.h"\r
}\r
\r
/*!\r
- * @brief 破邪領域魔法の各処理を行う\r
- * @param spell 魔法ID\r
- * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)\r
- * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。\r
- */\r
-static 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 _("懲罰", "Punishment");\r
- if (desc) return _("電撃のボルトもしくはビームを放つ。", "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 _("邪悪存在感知", "Detect Evil");\r
- if (desc) return _("近くの邪悪なモンスターを感知する。", "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 _("恐怖除去", "Remove Fear");\r
- if (desc) return _("恐怖を取り除く。", "Removes fear.");\r
- \r
- {\r
- if (cast)\r
- {\r
- set_afraid(0);\r
- }\r
- }\r
- break;\r
-\r
- case 3:\r
- if (name) return _("威圧", "Scare Monster");\r
- if (desc) return _("モンスター1体を恐怖させる。抵抗されると無効。", "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 _("聖域", "Sanctuary");\r
- if (desc) return _("隣接した全てのモンスターを眠らせる。抵抗されると無効。", "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 _("入口", "Portal");\r
- if (desc) return _("中距離のテレポートをする。", "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 _("スターダスト", "Star Dust");\r
- if (desc) return _("ターゲット付近に閃光のボルトを連射する。", "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 _("身体浄化", "Purify");\r
- if (desc) return _("傷、毒、朦朧から全快する。", "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 _("邪悪飛ばし", "Scatter Evil");\r
- if (desc) return _("邪悪なモンスター1体をテレポートさせる。抵抗されると無効。", "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 _("聖なる光球", "Holy Orb");\r
- if (desc) return _("聖なる力をもつ宝珠を放つ。邪悪なモンスターに対して大きなダメージを与えるが、善良なモンスターには効果がない。", \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 _("悪魔払い", "Exorcism");\r
- if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与え、邪悪なモンスターを恐怖させる。", \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 _("解呪", "Remove Curse");\r
- if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");\r
- \r
- {\r
- if (cast)\r
- {\r
- if (remove_curse())\r
- {\r
- msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));\r
- }\r
- }\r
- }\r
- break;\r
-\r
- case 12:\r
- if (name) return _("透明視認", "Sense Unseen");\r
- if (desc) return _("一定時間、透明なものが見えるようになる。", "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 _("対邪悪結界", "Protection from Evil");\r
- if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "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 _("裁きの雷", "Judgment Thunder");\r
- if (desc) return _("強力な電撃のボルトを放つ。", "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 _("聖なる御言葉", "Holy Word");\r
- if (desc) return _("視界内の邪悪な存在に大きなダメージを与え、体力を回復し、毒、恐怖、朦朧状態、負傷から全快する。",\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(_("損:1d%d/回%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 _("開かれた道", "Unbarring Ways");\r
- if (desc) return _("一直線上の全ての罠と扉を破壊する。", "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 _("封魔", "Arrest");\r
- if (desc) return _("邪悪なモンスターの動きを止める。", "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 _("聖なるオーラ", "Holy Aura");\r
- if (desc) return _("一定時間、邪悪なモンスターを傷つける聖なるオーラを得る。",\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 _("アンデッド&悪魔退散", "Dispel Undead & Demons");\r
- if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与える。", "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 _("邪悪退散", "Dispel Evil");\r
- if (desc) return _("視界内の全ての邪悪なモンスターにダメージを与える。", "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 _("聖なる刃", "Holy Blade");\r
- if (desc) return _("通常の武器に滅邪の属性をつける。", "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 _("スターバースト", "Star Burst");\r
- if (desc) return _("巨大な閃光の球を放つ。", "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 _("天使召喚", "Summon Angel");\r
- if (desc) return _("天使を1体召喚する。", "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(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));\r
- }\r
- else\r
- {\r
- msg_print(_("「我は汝の下僕にあらず! 悪行者よ、悔い改めよ!」", "Mortal! Repent of thy impiousness."));\r
- }\r
- }\r
- }\r
- }\r
- break;\r
-\r
- case 24:\r
- if (name) return _("士気高揚", "Heroism");\r
- if (desc) return _("一定時間、ヒーロー気分になる。", "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 _("呪い退散", "Dispel Curse");\r
- if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");\r
- \r
- {\r
- if (cast)\r
- {\r
- if (remove_all_curse())\r
- {\r
- msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));\r
- }\r
- }\r
- }\r
- break;\r
-\r
- case 26:\r
- if (name) return _("邪悪追放", "Banish Evil");\r
- if (desc) return _("視界内の全ての邪悪なモンスターをテレポートさせる。抵抗されると無効。", \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(_("神聖な力が邪悪を打ち払った!", "The holy power banishes evil!"));\r
- }\r
- }\r
- }\r
- break;\r
-\r
- case 27:\r
- if (name) return _("ハルマゲドン", "Armageddon");\r
- if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "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 _("目には目を", "An Eye for an Eye");\r
- if (desc) return _("一定時間、自分がダメージを受けたときに攻撃を行ったモンスターに対して同等のダメージを与える。", \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 _("神の怒り", "Wrath of the God");\r
- if (desc) return _("ターゲットの周囲に分解の球を多数落とす。", "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 _("神威", "Divine Intervention");\r
- if (desc) return _("隣接するモンスターに聖なるダメージを与え、視界内のモンスターにダメージ、減速、朦朧、混乱、恐怖、眠りを与える。さらに体力を回復する。", \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(_("回%d/損%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 _("聖戦", "Crusade");\r
- if (desc) return _("視界内の善良なモンスターをペットにしようとし、ならなかった場合及び善良でないモンスターを恐怖させる。さらに多数の加速された騎士を召喚し、ヒーロー、祝福、加速、対邪悪結界を得る。", \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
-\r
-/*!\r
* @brief 歌の各処理を行う\r
* @param spell 歌ID\r
* @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP)\r