OSDN Git Service

[Refactor] #37353 悪魔領域処理を cmd-spell.c から realm-daemon.c/h へ分離。
authorDeskull <deskull@users.sourceforge.jp>
Thu, 13 Sep 2018 11:44:30 +0000 (20:44 +0900)
committerDeskull <deskull@users.sourceforge.jp>
Thu, 13 Sep 2018 11:44:30 +0000 (20:44 +0900)
Separate daemon realm process from cmd-spell.c to realm-daemon.c/h.

Hengband_vcs2015/Hengband/Hengband.vcxproj
Hengband_vcs2015/Hengband/Hengband.vcxproj.filters
src/cmd-spell.c
src/realm-daemon.c [new file with mode: 0644]
src/realm-daemon.h [new file with mode: 0644]

index f21c300..cca9a7a 100644 (file)
     <ClCompile Include="..\..\src\cmd-quaff.c" />\r
     <ClCompile Include="..\..\src\cmd-read.c" />\r
     <ClCompile Include="..\..\src\realm-craft.c" />\r
+    <ClCompile Include="..\..\src\realm-daemon.cpp" />\r
     <ClCompile Include="..\..\src\realm-death.c" />\r
     <ClCompile Include="..\..\src\realm-nature.c" />\r
     <ClCompile Include="..\..\src\realm-sorcery.c" />\r
     <ClInclude Include="..\..\src\realm-arcane.h" />\r
     <ClInclude Include="..\..\src\realm-chaos.h" />\r
     <ClInclude Include="..\..\src\realm-craft.h" />\r
+    <ClInclude Include="..\..\src\realm-daemon.h" />\r
     <ClInclude Include="..\..\src\realm-death.h" />\r
     <ClInclude Include="..\..\src\realm-life.h" />\r
     <ClInclude Include="..\..\src\realm-nature.h" />\r
index ddba364..6130e90 100644 (file)
     <ClCompile Include="..\..\src\realm-craft.c">\r
       <Filter>Source</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\src\realm-daemon.cpp">\r
+      <Filter>Source</Filter>\r
+    </ClCompile>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ClInclude Include="..\..\src\angband.h">\r
     <ClInclude Include="..\..\src\realm-craft.h">\r
       <Filter>Header</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\src\realm-daemon.h">\r
+      <Filter>Header</Filter>\r
+    </ClInclude>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ResourceCompile Include="..\..\src\angband.rc" />\r
index 0fd8d75..fc4e183 100644 (file)
@@ -13,6 +13,7 @@
 #include "realm-arcane.h"\r
 #include "realm-chaos.h"\r
 #include "realm-craft.h"\r
+#include "realm-daemon.h"\r
 #include "realm-death.h"\r
 #include "realm-life.h"\r
 #include "realm-nature.h"\r
@@ -236,623 +237,6 @@ void stop_singing(void)
        p_ptr->redraw |= (PR_STATUS);\r
 }\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_daemon_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
-       static const char s_dam[] = _("損傷:", "dam ");\r
-\r
-       int dir;\r
-       int plev = p_ptr->lev;\r
-\r
-       switch (spell)\r
-       {\r
-       case 0:\r
-               if (name) return _("マジック・ミサイル", "Magic Missile");\r
-               if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");\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_MISSILE, dir, damroll(dice, sides));\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 1:\r
-               if (name) return _("無生命感知", "Detect Unlife");\r
-               if (desc) return _("近くの生命のないモンスターを感知する。", "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 2:\r
-               if (name) return _("邪なる祝福", "Evil Bless");\r
-               if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives bonus to hit and AC for a few turns.");\r
-    \r
-               {\r
-                       int base = 12;\r
-\r
-                       if (info) return info_duration(base, base);\r
-\r
-                       if (cast)\r
-                       {\r
-                               set_blessed(randint1(base) + base, FALSE);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 3:\r
-               if (name) return _("耐火炎", "Resist Fire");\r
-               if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。", \r
-                       "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");\r
-    \r
-               {\r
-                       int base = 20;\r
-\r
-                       if (info) return info_duration(base, base);\r
-\r
-                       if (cast)\r
-                       {\r
-                               set_oppose_fire(randint1(base) + base, FALSE);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 4:\r
-               if (name) return _("恐慌", "Horrify");\r
-               if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "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 5:\r
-               if (name) return _("地獄の矢", "Nether Bolt");\r
-               if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");\r
-    \r
-               {\r
-                       int dice = 6 + (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 6:\r
-               if (name) return _("古代の死霊召喚", "Summon Manes");\r
-               if (desc) return _("古代の死霊を召喚する。", "Summons a manes.");\r
-    \r
-               {\r
-                       if (cast)\r
-                       {\r
-                               if (!summon_specific(-1, p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET)))\r
-                               {\r
-                                       msg_print(_("古代の死霊は現れなかった。", "No Manes arrive."));\r
-                               }\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 7:\r
-               if (name) return _("地獄の焔", "Hellish Flame");\r
-               if (desc) return _("邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",\r
-                       "Fires a ball of evil power. Hurts good monsters greatly.");\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_MAGE ||\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_HELL_FIRE, dir, damroll(dice, sides) + base, rad);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 8:\r
-               if (name) return _("デーモン支配", "Dominate Demon");\r
-               if (desc) return _("悪魔1体を魅了する。抵抗されると無効", "Attempts to charm a demon.");\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_demon(dir, power);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 9:\r
-               if (name) return _("ビジョン", "Vision");\r
-               if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");\r
-    \r
-               {\r
-                       int rad = DETECT_RAD_MAP;\r
-\r
-                       if (info) return info_radius(rad);\r
-\r
-                       if (cast)\r
-                       {\r
-                               map_area(rad);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 10:\r
-               if (name) return _("耐地獄", "Resist Nether");\r
-               if (desc) return _("一定時間、地獄への耐性を得る。", "Gives resistance to nether 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_res_nether(randint1(base) + base, FALSE);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 11:\r
-               if (name) return _("プラズマ・ボルト", "Plasma bolt");\r
-               if (desc) return _("プラズマのボルトもしくはビームを放つ。", "Fires a bolt or beam of plasma.");\r
-    \r
-               {\r
-                       int dice = 11 + (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_PLASMA, dir, damroll(dice, sides));\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 12:\r
-               if (name) return _("ファイア・ボール", "Fire Ball");\r
-               if (desc) return _("炎の球を放つ。", "Fires a ball of fire.");\r
-    \r
-               {\r
-                       HIT_POINT dam = plev + 55;\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_FIRE, dir, dam, rad);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 13:\r
-               if (name) return _("炎の刃", "Fire Branding");\r
-               if (desc) return _("武器に炎の属性をつける。", "Makes current weapon fire branded.");\r
-    \r
-               {\r
-                       if (cast)\r
-                       {\r
-                               brand_weapon(1);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 14:\r
-               if (name) return _("地獄球", "Nether Ball");\r
-               if (desc) return _("大きな地獄の球を放つ。", "Fires a huge ball of nether.");\r
-    \r
-               {\r
-                       HIT_POINT dam = plev * 3 / 2 + 100;\r
-                       int rad = plev / 20 + 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_NETHER, dir, dam, rad);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 15:\r
-               if (name) return _("デーモン召喚", "Summon Demon");\r
-               if (desc) return _("悪魔1体を召喚する。", "Summons a demon.");\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*2/3+randint1(plev/2), SUMMON_DEMON, flg))\r
-                               {\r
-                                       msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));\r
-\r
-                                       if (pet)\r
-                                       {\r
-                                               msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));\r
-                                       }\r
-                                       else\r
-                                       {\r
-                                               msg_print(_("「卑しき者よ、我は汝の下僕にあらず! お前の魂を頂くぞ!」",\r
-                                                                       "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));\r
-                                       }\r
-                               }\r
-                               else\r
-                               {\r
-                                       msg_print(_("悪魔は現れなかった。", "No demons arrive."));\r
-                               }\r
-                               break;\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 16:\r
-               if (name) return _("悪魔の目", "Devilish Eye");\r
-               if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");\r
-    \r
-               {\r
-                       int base = 30;\r
-                       int sides = 25;\r
-\r
-                       if (info) return info_duration(base, sides);\r
-\r
-                       if (cast)\r
-                       {\r
-                               set_tim_esp(randint1(sides) + base, FALSE);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 17:\r
-               if (name) return _("悪魔のクローク", "Devil Cloak");\r
-               if (desc) return _("恐怖を取り除き、一定時間、炎と冷気の耐性、炎のオーラを得る。耐性は装備による耐性に累積する。", \r
-                       "Removes fear. Gives resistance to fire and cold, and aura of fire. These resistances can be added to which from equipment for more powerful resistances.");\r
-    \r
-               {\r
-                       TIME_EFFECT base = 20;\r
-\r
-                       if (info) return info_duration(base, base);\r
-\r
-                       if (cast)\r
-                       {\r
-                               TIME_EFFECT dur = randint1(base) + base;\r
-                                       \r
-                               set_oppose_fire(dur, FALSE);\r
-                               set_oppose_cold(dur, FALSE);\r
-                               set_tim_sh_fire(dur, FALSE);\r
-                               set_afraid(0);\r
-                               break;\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 18:\r
-               if (name) return _("溶岩流", "The Flow of Lava");\r
-               if (desc) return _("自分を中心とした炎の球を作り出し、床を溶岩に変える。", \r
-                       "Generates a ball of fire centered on you which transforms floors to magma.");\r
-    \r
-               {\r
-                       HIT_POINT dam = (55 + plev) * 2;\r
-                       int rad = 3;\r
-\r
-                       if (info) return info_damage(0, 0, dam/2);\r
-\r
-                       if (cast)\r
-                       {\r
-                               fire_ball(GF_FIRE, 0, dam, rad);\r
-                               fire_ball_hide(GF_LAVA_FLOW, 0, 2 + randint1(2), rad);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 19:\r
-               if (name) return _("プラズマ球", "Plasma Ball");\r
-               if (desc) return _("プラズマの球を放つ。", "Fires a ball of plasma.");\r
-    \r
-               {\r
-                       HIT_POINT dam = plev * 3 / 2 + 80;\r
-                       int rad = 2 + plev / 40;\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_PLASMA, dir, dam, rad);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 20:\r
-               if (name) return _("悪魔変化", "Polymorph Demon");\r
-               if (desc) return _("一定時間、悪魔に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔としての能力を得る。", \r
-                       "Mimic a demon for a while. Loses abilities of original race and gets abilities as a demon.");\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_DEMON, FALSE);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 21:\r
-               if (name) return _("地獄の波動", "Nather Wave");\r
-               if (desc) return _("視界内の全てのモンスターにダメージを与える。善良なモンスターに特に大きなダメージを与える。", \r
-                       "Damages all monsters in sight. Hurts good monsters greatly.");\r
-    \r
-               {\r
-                       int sides1 = plev * 2;\r
-                       int sides2 = plev * 2;\r
-\r
-                       if (info) return format("%sd%d+d%d", s_dam, sides1, sides2);\r
-\r
-                       if (cast)\r
-                       {\r
-                               dispel_monsters(randint1(sides1));\r
-                               dispel_good(randint1(sides2));\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 22:\r
-               if (name) return _("サキュバスの接吻", "Kiss of Succubus");\r
-               if (desc) return _("因果混乱の球を放つ。", "Fires a ball of nexus.");\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
-                               fire_ball(GF_NEXUS, dir, dam, rad);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 23:\r
-               if (name) return _("破滅の手", "Doom Hand");\r
-               if (desc) return _("破滅の手を放つ。食らったモンスターはそのときのHPの半分前後のダメージを受ける。", "Attempts to make a monster's HP almost half.");\r
-    \r
-               {\r
-                       if (cast)\r
-                       {\r
-                               if (!get_aim_dir(&dir))\r
-                                       return NULL;\r
-                               else \r
-                                       msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));\r
-                               \r
-                               fire_ball_hide(GF_HAND_DOOM, dir, plev * 2, 0);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 24:\r
-               if (name) return _("士気高揚", "Raise the Morale");\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 _("不滅の肉体", "Immortal Body");\r
-               if (desc) return _("一定時間、時間逆転への耐性を得る。", "Gives resistance to time 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_res_time(randint1(base)+base, FALSE);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 26:\r
-               if (name) return _("狂気の円環", "Insanity Circle");\r
-               if (desc) return _("自分を中心としたカオスの球、混乱の球を発生させ、近くのモンスターを魅了する。", \r
-                       "Generate balls of chaos, confusion and charm centered on you.");\r
-    \r
-               {\r
-                       HIT_POINT dam = 50 + plev;\r
-                       int power = 20 + plev;\r
-                       int rad = 3 + plev / 20;\r
-\r
-                       if (info) return format("%s%d+%d", s_dam, dam/2, dam/2);\r
-\r
-                       if (cast)\r
-                       {\r
-                               fire_ball(GF_CHAOS, 0, dam, rad);\r
-                               fire_ball(GF_CONFUSION, 0, dam, rad);\r
-                               fire_ball(GF_CHARM, 0, power, rad);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 27:\r
-               if (name) return _("ペット爆破", "Explode Pets");\r
-               if (desc) return _("全てのペットを強制的に爆破させる。", "Makes all pets explode.");\r
-    \r
-               {\r
-                       if (cast)\r
-                       {\r
-                               discharge_minion();\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 28:\r
-               if (name) return _("グレーターデーモン召喚", "Summon Greater Demon");\r
-               if (desc) return _("上級デーモンを召喚する。召喚するには人間('p','h','t'で表されるモンスター)の死体を捧げなければならない。", \r
-                       "Summons greater demon. It need to sacrifice a corpse of human ('p','h' or 't').");\r
-    \r
-               {\r
-                       if (cast)\r
-                       {\r
-                               if (!cast_summon_greater_demon()) return NULL;\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 29:\r
-               if (name) return _("地獄嵐", "Nether Storm");\r
-               if (desc) return _("超巨大な地獄の球を放つ。", "Generate a huge ball of nether.");\r
-    \r
-               {\r
-                       HIT_POINT dam = plev * 15;\r
-                       int rad = 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
-\r
-                               fire_ball(GF_NETHER, dir, dam, rad);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 30:\r
-               if (name) return _("血の呪い", "Bloody Curse");\r
-               if (desc) return _("自分がダメージを受けることによって対象に呪いをかけ、ダメージを与え様々な効果を引き起こす。",\r
-                       "Puts blood curse which damages and causes various effects on a monster. You also take damage.");\r
-    \r
-               {\r
-                       HIT_POINT dam = 600;\r
-                       int rad = 0;\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_hide(GF_BLOOD_CURSE, dir, dam, rad);\r
-                               take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("血の呪い", "Blood curse"), -1);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 31:\r
-               if (name) return _("魔王変化", "Polymorph Demonlord");\r
-               if (desc) return _("悪魔の王に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔の王としての能力を得、壁を破壊しながら歩く。",\r
-                       "Mimic a demon lord for a while. Loses abilities of original race and gets great abilities as a demon lord. Even hard walls can't stop your walking.");\r
-    \r
-               {\r
-                       int base = 15;\r
-\r
-                       if (info) return info_duration(base, base);\r
-\r
-                       if (cast)\r
-                       {\r
-                               set_mimic(base + randint1(base), MIMIC_DEMON_LORD, FALSE);\r
-                       }\r
-               }\r
-               break;\r
-       }\r
-\r
-       return "";\r
-}\r
-\r
 /*!\r
  * @brief 破邪領域魔法の各処理を行う\r
  * @param spell 魔法ID\r
diff --git a/src/realm-daemon.c b/src/realm-daemon.c
new file mode 100644 (file)
index 0000000..c261109
--- /dev/null
@@ -0,0 +1,621 @@
+\r
+#include "angband.h"\r
+#include "cmd-spell.h"\r
+#include "spells-summon.h"\r
+\r
+/*!\r
+* @brief \88«\96\82\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_daemon_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
+       static const char s_dam[] = _("\91¹\8f\9d:", "dam ");\r
+\r
+       int dir;\r
+       int plev = p_ptr->lev;\r
+\r
+       switch (spell)\r
+       {\r
+       case 0:\r
+               if (name) return _("\83}\83W\83b\83N\81E\83~\83T\83C\83\8b", "Magic Missile");\r
+               if (desc) return _("\8eã\82¢\96\82\96@\82Ì\96î\82ð\95ú\82Â\81B", "Fires a weak bolt of magic.");\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_MISSILE, dir, damroll(dice, sides));\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 1:\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 2:\r
+               if (name) return _("\8e×\82È\82é\8fj\95\9f", "Evil Bless");\r
+               if (desc) return _("\88ê\92è\8e\9e\8aÔ\81A\96½\92\86\97¦\82ÆAC\82É\83{\81[\83i\83X\82ð\93¾\82é\81B", "Gives bonus to hit and AC for a few turns.");\r
+\r
+               {\r
+                       int base = 12;\r
+\r
+                       if (info) return info_duration(base, base);\r
+\r
+                       if (cast)\r
+                       {\r
+                               set_blessed(randint1(base) + base, FALSE);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 3:\r
+               if (name) return _("\91Ï\89Î\89\8a", "Resist Fire");\r
+               if (desc) return _("\88ê\92è\8e\9e\8aÔ\81A\89\8a\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 fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");\r
+\r
+               {\r
+                       int base = 20;\r
+\r
+                       if (info) return info_duration(base, base);\r
+\r
+                       if (cast)\r
+                       {\r
+                               set_oppose_fire(randint1(base) + base, FALSE);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 4:\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 5:\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 = 6 + (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 6:\r
+               if (name) return _("\8cÃ\91ã\82Ì\8e\80\97ì\8f¢\8a«", "Summon Manes");\r
+               if (desc) return _("\8cÃ\91ã\82Ì\8e\80\97ì\82ð\8f¢\8a«\82·\82é\81B", "Summons a manes.");\r
+\r
+               {\r
+                       if (cast)\r
+                       {\r
+                               if (!summon_specific(-1, p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET)))\r
+                               {\r
+                                       msg_print(_("\8cÃ\91ã\82Ì\8e\80\97ì\82Í\8c»\82ê\82È\82©\82Á\82½\81B", "No Manes arrive."));\r
+                               }\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 7:\r
+               if (name) return _("\92n\8d\96\82Ì\89\8b", "Hellish Flame");\r
+               if (desc) return _("\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 ball of evil power. Hurts good monsters greatly.");\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_MAGE ||\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_HELL_FIRE, dir, damroll(dice, sides) + base, rad);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 8:\r
+               if (name) return _("\83f\81[\83\82\83\93\8ex\94z", "Dominate Demon");\r
+               if (desc) return _("\88«\96\821\91Ì\82ð\96£\97¹\82·\82é\81B\92ï\8dR\82³\82ê\82é\82Æ\96³\8cø", "Attempts to charm a demon.");\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_demon(dir, power);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 9:\r
+               if (name) return _("\83r\83W\83\87\83\93", "Vision");\r
+               if (desc) return _("\8eü\95Ó\82Ì\92n\8c`\82ð\8a´\92m\82·\82é\81B", "Maps nearby area.");\r
+\r
+               {\r
+                       int rad = DETECT_RAD_MAP;\r
+\r
+                       if (info) return info_radius(rad);\r
+\r
+                       if (cast)\r
+                       {\r
+                               map_area(rad);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 10:\r
+               if (name) return _("\91Ï\92n\8d\96", "Resist Nether");\r
+               if (desc) return _("\88ê\92è\8e\9e\8aÔ\81A\92n\8d\96\82Ö\82Ì\91Ï\90«\82ð\93¾\82é\81B", "Gives resistance to nether 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_res_nether(randint1(base) + base, FALSE);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 11:\r
+               if (name) return _("\83v\83\89\83Y\83}\81E\83{\83\8b\83g", "Plasma bolt");\r
+               if (desc) return _("\83v\83\89\83Y\83}\82Ì\83{\83\8b\83g\82à\82µ\82­\82Í\83r\81[\83\80\82ð\95ú\82Â\81B", "Fires a bolt or beam of plasma.");\r
+\r
+               {\r
+                       int dice = 11 + (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_PLASMA, dir, damroll(dice, sides));\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 12:\r
+               if (name) return _("\83t\83@\83C\83A\81E\83{\81[\83\8b", "Fire Ball");\r
+               if (desc) return _("\89\8a\82Ì\8b\85\82ð\95ú\82Â\81B", "Fires a ball of fire.");\r
+\r
+               {\r
+                       HIT_POINT dam = plev + 55;\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_FIRE, dir, dam, rad);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 13:\r
+               if (name) return _("\89\8a\82Ì\90n", "Fire Branding");\r
+               if (desc) return _("\95\90\8aí\82É\89\8a\82Ì\91®\90«\82ð\82Â\82¯\82é\81B", "Makes current weapon fire branded.");\r
+\r
+               {\r
+                       if (cast)\r
+                       {\r
+                               brand_weapon(1);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 14:\r
+               if (name) return _("\92n\8d\96\8b\85", "Nether Ball");\r
+               if (desc) return _("\91å\82«\82È\92n\8d\96\82Ì\8b\85\82ð\95ú\82Â\81B", "Fires a huge ball of nether.");\r
+\r
+               {\r
+                       HIT_POINT dam = plev * 3 / 2 + 100;\r
+                       int rad = plev / 20 + 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_NETHER, dir, dam, rad);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 15:\r
+               if (name) return _("\83f\81[\83\82\83\93\8f¢\8a«", "Summon Demon");\r
+               if (desc) return _("\88«\96\821\91Ì\82ð\8f¢\8a«\82·\82é\81B", "Summons a demon.");\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 * 2 / 3 + randint1(plev / 2), SUMMON_DEMON, flg))\r
+                               {\r
+                                       msg_print(_("\97°\89©\82Ì\88«\8fL\82ª\8f[\96\9e\82µ\82½\81B", "The area fills with a stench of sulphur and brimstone."));\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\94Ú\82µ\82«\8eÒ\82æ\81A\89ä\82Í\93ð\82Ì\89º\96l\82É\82 \82ç\82¸\81\82¨\91O\82Ì\8d°\82ð\92¸\82­\82¼\81I\81v",\r
+                                                       "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       msg_print(_("\88«\96\82\82Í\8c»\82ê\82È\82©\82Á\82½\81B", "No demons arrive."));\r
+                               }\r
+                               break;\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 16:\r
+               if (name) return _("\88«\96\82\82Ì\96Ú", "Devilish Eye");\r
+               if (desc) return _("\88ê\92è\8e\9e\8aÔ\81A\83e\83\8c\83p\83V\81[\94\\97Í\82ð\93¾\82é\81B", "Gives telepathy for a while.");\r
+\r
+               {\r
+                       int base = 30;\r
+                       int sides = 25;\r
+\r
+                       if (info) return info_duration(base, sides);\r
+\r
+                       if (cast)\r
+                       {\r
+                               set_tim_esp(randint1(sides) + base, FALSE);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 17:\r
+               if (name) return _("\88«\96\82\82Ì\83N\83\8d\81[\83N", "Devil Cloak");\r
+               if (desc) return _("\8b°\95|\82ð\8eæ\82è\8f\9c\82«\81A\88ê\92è\8e\9e\8aÔ\81A\89\8a\82Æ\97â\8bC\82Ì\91Ï\90«\81A\89\8a\82Ì\83I\81[\83\89\82ð\93¾\82é\81B\91Ï\90«\82Í\91\95\94õ\82É\82æ\82é\91Ï\90«\82É\97Ý\90Ï\82·\82é\81B",\r
+                       "Removes fear. Gives resistance to fire and cold, and aura of fire. These resistances can be added to which from equipment for more powerful resistances.");\r
+\r
+               {\r
+                       TIME_EFFECT base = 20;\r
+\r
+                       if (info) return info_duration(base, base);\r
+\r
+                       if (cast)\r
+                       {\r
+                               TIME_EFFECT dur = randint1(base) + base;\r
+\r
+                               set_oppose_fire(dur, FALSE);\r
+                               set_oppose_cold(dur, FALSE);\r
+                               set_tim_sh_fire(dur, FALSE);\r
+                               set_afraid(0);\r
+                               break;\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 18:\r
+               if (name) return _("\97n\8aâ\97¬", "The Flow of Lava");\r
+               if (desc) return _("\8e©\95ª\82ð\92\86\90S\82Æ\82µ\82½\89\8a\82Ì\8b\85\82ð\8dì\82è\8fo\82µ\81A\8f°\82ð\97n\8aâ\82É\95Ï\82¦\82é\81B",\r
+                       "Generates a ball of fire centered on you which transforms floors to magma.");\r
+\r
+               {\r
+                       HIT_POINT dam = (55 + plev) * 2;\r
+                       int rad = 3;\r
+\r
+                       if (info) return info_damage(0, 0, dam / 2);\r
+\r
+                       if (cast)\r
+                       {\r
+                               fire_ball(GF_FIRE, 0, dam, rad);\r
+                               fire_ball_hide(GF_LAVA_FLOW, 0, 2 + randint1(2), rad);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 19:\r
+               if (name) return _("\83v\83\89\83Y\83}\8b\85", "Plasma Ball");\r
+               if (desc) return _("\83v\83\89\83Y\83}\82Ì\8b\85\82ð\95ú\82Â\81B", "Fires a ball of plasma.");\r
+\r
+               {\r
+                       HIT_POINT dam = plev * 3 / 2 + 80;\r
+                       int rad = 2 + plev / 40;\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_PLASMA, dir, dam, rad);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 20:\r
+               if (name) return _("\88«\96\82\95Ï\89»", "Polymorph Demon");\r
+               if (desc) return _("\88ê\92è\8e\9e\8aÔ\81A\88«\96\82\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É\88«\96\82\82Æ\82µ\82Ä\82Ì\94\\97Í\82ð\93¾\82é\81B",\r
+                       "Mimic a demon for a while. Loses abilities of original race and gets abilities as a demon.");\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_DEMON, FALSE);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 21:\r
+               if (name) return _("\92n\8d\96\82Ì\94g\93®", "Nather Wave");\r
+               if (desc) return _("\8e\8b\8aE\93à\82Ì\91S\82Ä\82Ì\83\82\83\93\83X\83^\81[\82É\83_\83\81\81[\83W\82ð\97^\82¦\82é\81B\91P\97Ç\82È\83\82\83\93\83X\83^\81[\82É\93Á\82É\91å\82«\82È\83_\83\81\81[\83W\82ð\97^\82¦\82é\81B",\r
+                       "Damages all monsters in sight. Hurts good monsters greatly.");\r
+\r
+               {\r
+                       int sides1 = plev * 2;\r
+                       int sides2 = plev * 2;\r
+\r
+                       if (info) return format("%sd%d+d%d", s_dam, sides1, sides2);\r
+\r
+                       if (cast)\r
+                       {\r
+                               dispel_monsters(randint1(sides1));\r
+                               dispel_good(randint1(sides2));\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 22:\r
+               if (name) return _("\83T\83L\83\85\83o\83X\82Ì\90Ú\95«", "Kiss of Succubus");\r
+               if (desc) return _("\88ö\89Ê\8d¬\97\90\82Ì\8b\85\82ð\95ú\82Â\81B", "Fires a ball of nexus.");\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
+                               fire_ball(GF_NEXUS, dir, dam, rad);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 23:\r
+               if (name) return _("\94j\96Å\82Ì\8eè", "Doom Hand");\r
+               if (desc) return _("\94j\96Å\82Ì\8eè\82ð\95ú\82Â\81B\90H\82ç\82Á\82½\83\82\83\93\83X\83^\81[\82Í\82»\82Ì\82Æ\82«\82ÌHP\82Ì\94¼\95ª\91O\8cã\82Ì\83_\83\81\81[\83W\82ð\8eó\82¯\82é\81B", "Attempts to make a monster's HP almost half.");\r
+\r
+               {\r
+                       if (cast)\r
+                       {\r
+                               if (!get_aim_dir(&dir))\r
+                                       return NULL;\r
+                               else\r
+                                       msg_print(_("<\94j\96Å\82Ì\8eè>\82ð\95ú\82Á\82½\81I", "You invoke the Hand of Doom!"));\r
+\r
+                               fire_ball_hide(GF_HAND_DOOM, dir, plev * 2, 0);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 24:\r
+               if (name) return _("\8em\8bC\8d\82\97g", "Raise the Morale");\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 _("\95s\96Å\82Ì\93÷\91Ì", "Immortal Body");\r
+               if (desc) return _("\88ê\92è\8e\9e\8aÔ\81A\8e\9e\8aÔ\8bt\93]\82Ö\82Ì\91Ï\90«\82ð\93¾\82é\81B", "Gives resistance to time 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_res_time(randint1(base) + base, FALSE);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 26:\r
+               if (name) return _("\8b\8bC\82Ì\89~\8aÂ", "Insanity Circle");\r
+               if (desc) return _("\8e©\95ª\82ð\92\86\90S\82Æ\82µ\82½\83J\83I\83X\82Ì\8b\85\81A\8d¬\97\90\82Ì\8b\85\82ð\94­\90\82³\82¹\81A\8bß\82­\82Ì\83\82\83\93\83X\83^\81[\82ð\96£\97¹\82·\82é\81B",\r
+                       "Generate balls of chaos, confusion and charm centered on you.");\r
+\r
+               {\r
+                       HIT_POINT dam = 50 + plev;\r
+                       int power = 20 + plev;\r
+                       int rad = 3 + plev / 20;\r
+\r
+                       if (info) return format("%s%d+%d", s_dam, dam / 2, dam / 2);\r
+\r
+                       if (cast)\r
+                       {\r
+                               fire_ball(GF_CHAOS, 0, dam, rad);\r
+                               fire_ball(GF_CONFUSION, 0, dam, rad);\r
+                               fire_ball(GF_CHARM, 0, power, rad);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 27:\r
+               if (name) return _("\83y\83b\83g\94\9a\94j", "Explode Pets");\r
+               if (desc) return _("\91S\82Ä\82Ì\83y\83b\83g\82ð\8b­\90§\93I\82É\94\9a\94j\82³\82¹\82é\81B", "Makes all pets explode.");\r
+\r
+               {\r
+                       if (cast)\r
+                       {\r
+                               discharge_minion();\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 28:\r
+               if (name) return _("\83O\83\8c\81[\83^\81[\83f\81[\83\82\83\93\8f¢\8a«", "Summon Greater Demon");\r
+               if (desc) return _("\8fã\8b\89\83f\81[\83\82\83\93\82ð\8f¢\8a«\82·\82é\81B\8f¢\8a«\82·\82é\82É\82Í\90l\8aÔ('p','h','t'\82Å\95\\82³\82ê\82é\83\82\83\93\83X\83^\81[)\82Ì\8e\80\91Ì\82ð\95ù\82°\82È\82¯\82ê\82Î\82È\82ç\82È\82¢\81B",\r
+                       "Summons greater demon. It need to sacrifice a corpse of human ('p','h' or 't').");\r
+\r
+               {\r
+                       if (cast)\r
+                       {\r
+                               if (!cast_summon_greater_demon()) return NULL;\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 29:\r
+               if (name) return _("\92n\8d\96\97\92", "Nether Storm");\r
+               if (desc) return _("\92´\8b\90\91å\82È\92n\8d\96\82Ì\8b\85\82ð\95ú\82Â\81B", "Generate a huge ball of nether.");\r
+\r
+               {\r
+                       HIT_POINT dam = plev * 15;\r
+                       int rad = 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
+\r
+                               fire_ball(GF_NETHER, dir, dam, rad);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 30:\r
+               if (name) return _("\8c\8c\82Ì\8eô\82¢", "Bloody Curse");\r
+               if (desc) return _("\8e©\95ª\82ª\83_\83\81\81[\83W\82ð\8eó\82¯\82é\82±\82Æ\82É\82æ\82Á\82Ä\91Î\8fÛ\82É\8eô\82¢\82ð\82©\82¯\81A\83_\83\81\81[\83W\82ð\97^\82¦\97l\81X\82È\8cø\89Ê\82ð\88ø\82«\8bN\82±\82·\81B",\r
+                       "Puts blood curse which damages and causes various effects on a monster. You also take damage.");\r
+\r
+               {\r
+                       HIT_POINT dam = 600;\r
+                       int rad = 0;\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_hide(GF_BLOOD_CURSE, dir, dam, rad);\r
+                               take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("\8c\8c\82Ì\8eô\82¢", "Blood curse"), -1);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 31:\r
+               if (name) return _("\96\82\89¤\95Ï\89»", "Polymorph Demonlord");\r
+               if (desc) return _("\88«\96\82\82Ì\89¤\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É\88«\96\82\82Ì\89¤\82Æ\82µ\82Ä\82Ì\94\\97Í\82ð\93¾\81A\95Ç\82ð\94j\89ó\82µ\82È\82ª\82ç\95à\82­\81B",\r
+                       "Mimic a demon lord for a while. Loses abilities of original race and gets great abilities as a demon lord. Even hard walls can't stop your walking.");\r
+\r
+               {\r
+                       int base = 15;\r
+\r
+                       if (info) return info_duration(base, base);\r
+\r
+                       if (cast)\r
+                       {\r
+                               set_mimic(base + randint1(base), MIMIC_DEMON_LORD, FALSE);\r
+                       }\r
+               }\r
+               break;\r
+       }\r
+\r
+       return "";\r
+}\r
+\r
diff --git a/src/realm-daemon.h b/src/realm-daemon.h
new file mode 100644 (file)
index 0000000..26c0939
--- /dev/null
@@ -0,0 +1,2 @@
+extern cptr do_daemon_spell(SPELL_IDX spell, BIT_FLAGS mode);\r
+\r