OSDN Git Service

[Refactor] #37353 秘術領域処理を cmd-spell.c から realm-arcane.c/h へ分離。
authorDeskull <deskull@users.sourceforge.jp>
Wed, 12 Sep 2018 13:28:34 +0000 (22:28 +0900)
committerDeskull <deskull@users.sourceforge.jp>
Wed, 12 Sep 2018 13:28:34 +0000 (22:28 +0900)
Separate arcane process from cmd-spell.c to realm-arcane.c/h.

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

index b2b15f1..53e37bc 100644 (file)
     <ClInclude Include="..\..\src\cmd-item.h" />\r
     <ClInclude Include="..\..\src\cmd-magiceat.h" />\r
     <ClInclude Include="..\..\src\cmd-pet.h" />\r
+    <ClInclude Include="..\..\src\cmd-spell.h" />\r
     <ClInclude Include="..\..\src\cmd-zaprod.h" />\r
     <ClInclude Include="..\..\src\cmd-zapwand.h">\r
       <FileType>CppCode</FileType>\r
     <ClCompile Include="..\..\src\object2.c" />\r
     <ClCompile Include="..\..\src\racial.c" />\r
     <ClCompile Include="..\..\src\readdib.c" />\r
+    <ClCompile Include="..\..\src\realm-arcane.c" />\r
     <ClCompile Include="..\..\src\realm-hex.c" />\r
     <ClCompile Include="..\..\src\report.c" />\r
     <ClCompile Include="..\..\src\rooms-normal.c" />\r
     <ClInclude Include="..\..\src\kajitips.h" />\r
     <ClInclude Include="..\..\src\mindtips.h" />\r
     <ClInclude Include="..\..\src\readdib.h" />\r
+    <ClInclude Include="..\..\src\realm-arcane.h" />\r
     <ClInclude Include="..\..\src\rooms-normal.h" />\r
     <ClInclude Include="..\..\src\rooms-pitnest.h" />\r
     <ClInclude Include="..\..\src\rooms-vault.h" />\r
index 60e2fe5..ad18553 100644 (file)
     <ClCompile Include="..\..\src\realm-hex.c">\r
       <Filter>Source</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\src\realm-arcane.c">\r
+      <Filter>Source</Filter>\r
+    </ClCompile>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ClInclude Include="..\..\src\angband.h">\r
     <ClInclude Include="..\..\src\rooms-vault.h">\r
       <Filter>Header</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\src\realm-arcane.h">\r
+      <Filter>Header</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\src\cmd-spell.h">\r
+      <Filter>Header</Filter>\r
+    </ClInclude>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ResourceCompile Include="..\..\src\angband.rc" />\r
index 6636410..3191b89 100644 (file)
@@ -10,7 +10,7 @@
 #include "selfinfo.h"\r
 #include "cmd-quaff.h"\r
 #include "spells-summon.h"\r
-\r
+#include "realm-arcane.h"\r
 \r
 /*!\r
  * @brief\r
@@ -21,7 +21,7 @@
  * @param base 固定値\r
  * @return フォーマットに従い整形された文字列\r
  */\r
-static cptr info_string_dice(cptr str, int dice, int sides, int base)\r
+cptr info_string_dice(cptr str, int dice, int sides, int base)\r
 {\r
        /* Fix value */\r
        if (!dice)\r
@@ -44,7 +44,7 @@ static cptr info_string_dice(cptr str, int dice, int sides, int base)
  * @param base 固定値\r
  * @return フォーマットに従い整形された文字列\r
  */\r
-static cptr info_damage(int dice, int sides, int base)\r
+cptr info_damage(int dice, int sides, int base)\r
 {\r
        return info_string_dice(_("損傷:", "dam "), dice, sides, base);\r
 }\r
@@ -55,7 +55,7 @@ static cptr info_damage(int dice, int sides, int base)
  * @param sides ダイス目\r
  * @return フォーマットに従い整形された文字列\r
  */\r
-static cptr info_duration(int base, int sides)\r
+cptr info_duration(int base, int sides)\r
 {\r
        return format(_("期間:%d+1d%d", "dur %d+1d%d"), base, sides);\r
 }\r
@@ -65,7 +65,7 @@ static cptr info_duration(int base, int sides)
  * @param range 効果範囲\r
  * @return フォーマットに従い整形された文字列\r
  */\r
-static cptr info_range(POSITION range)\r
+cptr info_range(POSITION range)\r
 {\r
        return format(_("範囲:%d", "range %d"), range);\r
 }\r
@@ -77,7 +77,7 @@ static cptr info_range(POSITION range)
  * @param base 固定値\r
  * @return フォーマットに従い整形された文字列\r
  */\r
-static cptr info_heal(int dice, int sides, int base)\r
+cptr info_heal(int dice, int sides, int base)\r
 {\r
        return info_string_dice(_("回復:", "heal "), dice, sides, base);\r
 }\r
@@ -88,7 +88,7 @@ static cptr info_heal(int dice, int sides, int base)
  * @param sides ダイス目\r
  * @return フォーマットに従い整形された文字列\r
  */\r
-static cptr info_delay(int base, int sides)\r
+cptr info_delay(int base, int sides)\r
 {\r
        return format(_("遅延:%d+1d%d", "delay %d+1d%d"), base, sides);\r
 }\r
@@ -99,7 +99,7 @@ static cptr info_delay(int base, int sides)
  * @param dam 固定値\r
  * @return フォーマットに従い整形された文字列\r
  */\r
-static cptr info_multi_damage(HIT_POINT dam)\r
+cptr info_multi_damage(HIT_POINT dam)\r
 {\r
        return format(_("損傷:各%d", "dam %d each"), dam);\r
 }\r
@@ -111,7 +111,7 @@ static cptr info_multi_damage(HIT_POINT dam)
  * @param sides ダイス目\r
  * @return フォーマットに従い整形された文字列\r
  */\r
-static cptr info_multi_damage_dice(int dice, int sides)\r
+cptr info_multi_damage_dice(int dice, int sides)\r
 {\r
        return format(_("損傷:各%dd%d", "dam %dd%d each"), dice, sides);\r
 }\r
@@ -121,7 +121,7 @@ static cptr info_multi_damage_dice(int dice, int sides)
  * @param power 固定値\r
  * @return フォーマットに従い整形された文字列\r
  */\r
-static cptr info_power(int power)\r
+cptr info_power(int power)\r
 {\r
        return format(_("効力:%d", "power %d"), power);\r
 }\r
@@ -136,7 +136,7 @@ static cptr info_power(int power)
 /*\r
  * Generate power info string such as "power 1d100"\r
  */\r
-static cptr info_power_dice(int dice, int sides)\r
+cptr info_power_dice(int dice, int sides)\r
 {\r
        return format(_("効力:%dd%d", "power %dd%d"), dice, sides);\r
 }\r
@@ -147,7 +147,7 @@ static cptr info_power_dice(int dice, int sides)
  * @param rad 効果半径\r
  * @return フォーマットに従い整形された文字列\r
  */\r
-static cptr info_radius(int rad)\r
+cptr info_radius(int rad)\r
 {\r
        return format(_("半径:%d", "rad %d"), rad);\r
 }\r
@@ -158,7 +158,7 @@ static cptr info_radius(int rad)
  * @param weight 最大重量\r
  * @return フォーマットに従い整形された文字列\r
  */\r
-static cptr info_weight(int weight)\r
+cptr info_weight(int weight)\r
 {\r
 #ifdef JP\r
        return format("最大重量:%d.%dkg", lbtokg1(weight), lbtokg2(weight));\r
@@ -3841,567 +3841,6 @@ static cptr do_trump_spell(SPELL_IDX spell, BIT_FLAGS mode)
 \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_arcane_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 _("電撃", "Zap");\r
-               if (desc) return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");\r
-    \r
-               {\r
-                       int dice = 3 + (plev - 1) / 5;\r
-                       int sides = 3;\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 _("魔法の施錠", "Wizard Lock");\r
-               if (desc) return _("扉に鍵をかける。", "Locks a door.");\r
-    \r
-               {\r
-                       if (cast)\r
-                       {\r
-                               if (!get_aim_dir(&dir)) return NULL;\r
-\r
-                               wizard_lock(dir);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 2:\r
-               if (name) return _("透明体感知", "Detect Invisibility");\r
-               if (desc) return _("近くの透明なモンスターを感知する。", "Detects all invisible 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_invis(rad);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 3:\r
-               if (name) return _("モンスター感知", "Detect Monsters");\r
-               if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");\r
-    \r
-               {\r
-                       int rad = DETECT_RAD_DEFAULT;\r
-\r
-                       if (info) return info_radius(rad);\r
-\r
-                       if (cast)\r
-                       {\r
-                               detect_monsters_normal(rad);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 4:\r
-               if (name) return _("ショート・テレポート", "Blink");\r
-               if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");\r
-    \r
-               {\r
-                       POSITION range = 10;\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 5:\r
-               if (name) return _("ライト・エリア", "Light Area");\r
-               if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");\r
-    \r
-               {\r
-                       int dice = 2;\r
-                       int sides = plev / 2;\r
-                       int rad = plev / 10 + 1;\r
-\r
-                       if (info) return info_damage(dice, sides, 0);\r
-\r
-                       if (cast)\r
-                       {\r
-                               lite_area(damroll(dice, sides), rad);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 6:\r
-               if (name) return _("罠と扉 破壊", "Trap & Door Destruction");\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 7:\r
-               if (name) return _("軽傷の治癒", "Cure Light Wounds");\r
-               if (desc) return _("怪我と体力を少し回復させる。", "Heals cut and HP a little.");\r
-    \r
-               {\r
-                       int dice = 2;\r
-                       int sides = 8;\r
-\r
-                       if (info) return info_heal(dice, sides, 0);\r
-\r
-                       if (cast)\r
-                       {\r
-                               hp_player(damroll(dice, sides));\r
-                               set_cut(p_ptr->cut - 10);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 8:\r
-               if (name) return _("罠と扉 感知", "Detect Doors & Traps");\r
-               if (desc) return _("近くの全ての罠と扉と階段を感知する。", "Detects traps, doors, and stairs 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_traps(rad, TRUE);\r
-                               detect_doors(rad);\r
-                               detect_stairs(rad);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 9:\r
-               if (name) return _("燃素", "Phlogiston");\r
-               if (desc) return _("光源に燃料を補給する。", "Adds more turns of light to a lantern or torch.");\r
-    \r
-               {\r
-                       if (cast)\r
-                       {\r
-                               phlogiston();\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 10:\r
-               if (name) return _("財宝感知", "Detect Treasure");\r
-               if (desc) return _("近くの財宝を感知する。", "Detects all treasures 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_treasure(rad);\r
-                               detect_objects_gold(rad);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 11:\r
-               if (name) return _("魔法 感知", "Detect Enchantment");\r
-               if (desc) return _("近くの魔法がかかったアイテムを感知する。", "Detects all magical items 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_objects_magic(rad);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 12:\r
-               if (name) return _("アイテム感知", "Detect Objects");\r
-               if (desc) return _("近くの全てのアイテムを感知する。", "Detects all items 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_objects_normal(rad);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 13:\r
-               if (name) return _("解毒", "Cure Poison");\r
-               if (desc) return _("毒を体内から完全に取り除く。", "Cures poison status.");\r
-    \r
-               {\r
-                       if (cast)\r
-                       {\r
-                               set_poisoned(0);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 14:\r
-               if (name) return _("耐冷", "Resist Cold");\r
-               if (desc) return _("一定時間、冷気への耐性を得る。装備による耐性に累積する。", "Gives resistance to cold. This resistance can be added to which from equipment for more powerful resistance.");\r
-    \r
-               {\r
-                       int base = 20;\r
-\r
-                       if (info) return info_duration(base, base);\r
-\r
-                       if (cast)\r
-                       {\r
-                               set_oppose_cold(randint1(base) + base, FALSE);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 15:\r
-               if (name) return _("耐火", "Resist Fire");\r
-               if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。", \r
-                       "Gives resistance to fire. This resistance can be added to which from equipment for more powerful resistance.");\r
-    \r
-               {\r
-                       int base = 20;\r
-\r
-                       if (info) return info_duration(base, base);\r
-\r
-                       if (cast)\r
-                       {\r
-                               set_oppose_fire(randint1(base) + base, FALSE);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 16:\r
-               if (name) return _("耐電", "Resist Lightning");\r
-               if (desc) return _("一定時間、電撃への耐性を得る。装備による耐性に累積する。", \r
-                       "Gives resistance to electricity. This resistance can be added to which from equipment for more powerful resistance.");\r
-    \r
-               {\r
-                       int base = 20;\r
-\r
-                       if (info) return info_duration(base, base);\r
-\r
-                       if (cast)\r
-                       {\r
-                               set_oppose_elec(randint1(base) + base, FALSE);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 17:\r
-               if (name) return _("耐酸", "Resist Acid");\r
-               if (desc) return _("一定時間、酸への耐性を得る。装備による耐性に累積する。", \r
-                       "Gives resistance to acid. This resistance can be added to which from equipment for more powerful resistance.");\r
-    \r
-               {\r
-                       int base = 20;\r
-\r
-                       if (info) return info_duration(base, base);\r
-\r
-                       if (cast)\r
-                       {\r
-                               set_oppose_acid(randint1(base) + base, FALSE);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 18:\r
-               if (name) return _("重傷の治癒", "Cure Medium Wounds");\r
-               if (desc) return _("怪我と体力を中程度回復させる。", "Heals cut and HP more.");\r
-    \r
-               {\r
-                       int dice = 4;\r
-                       int sides = 8;\r
-\r
-                       if (info) return info_heal(dice, sides, 0);\r
-\r
-                       if (cast)\r
-                       {\r
-                               hp_player(damroll(dice, sides));\r
-                               set_cut((p_ptr->cut / 2) - 50);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 19:\r
-               if (name) return _("テレポート", "Teleport");\r
-               if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");\r
-    \r
-               {\r
-                       POSITION range = plev * 5;\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 20:\r
-               if (name) return _("鑑定", "Identify");\r
-               if (desc) return _("アイテムを識別する。", "Identifies an item.");\r
-    \r
-               {\r
-                       if (cast)\r
-                       {\r
-                               if (!ident_spell(FALSE)) return NULL;\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 21:\r
-               if (name) return _("岩石溶解", "Stone to Mud");\r
-               if (desc) return _("壁を溶かして床にする。", "Turns one rock square to mud.");\r
-    \r
-               {\r
-                       int dice = 1;\r
-                       int sides = 30;\r
-                       int base = 20;\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
-                               wall_to_mud(dir, 20 + randint1(30));\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 22:\r
-               if (name) return _("閃光", "Ray of Light");\r
-               if (desc) return _("光線を放つ。光りを嫌うモンスターに効果がある。", "Fires a beam of light which damages to light-sensitive monsters.");\r
-    \r
-               {\r
-                       int dice = 6;\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
-                               msg_print(_("光線が放たれた。", "A line of light appears."));\r
-                               lite_line(dir, damroll(6, 8));\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 23:\r
-               if (name) return _("空腹充足", "Satisfy Hunger");\r
-               if (desc) return _("満腹にする。", "Satisfies hunger.");\r
-    \r
-               {\r
-                       if (cast)\r
-                       {\r
-                               set_food(PY_FOOD_MAX - 1);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 24:\r
-               if (name) return _("透明視認", "See Invisible");\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 25:\r
-               if (name) return _("エレメンタル召喚", "Conjure Elemental");\r
-               if (desc) return _("1体のエレメンタルを召喚する。", "Summons an elemental.");\r
-    \r
-               {\r
-                       if (cast)\r
-                       {\r
-                               if (!summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_ELEMENTAL, (PM_ALLOW_GROUP | PM_FORCE_PET)))\r
-                               {\r
-                                       msg_print(_("エレメンタルは現れなかった。", "No Elementals arrive."));\r
-                               }\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 26:\r
-               if (name) return _("テレポート・レベル", "Teleport Level");\r
-               if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");\r
-    \r
-               {\r
-                       if (cast)\r
-                       {\r
-                               if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;\r
-                               teleport_level(0);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 27:\r
-               if (name) return _("テレポート・モンスター", "Teleport Away");\r
-               if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");\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
-                               fire_beam(GF_AWAY_ALL, dir, power);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 28:\r
-               if (name) return _("元素の球", "Elemental Ball");\r
-               if (desc) return _("炎、電撃、冷気、酸のどれかの球を放つ。", "Fires a ball of some elements.");\r
-    \r
-               {\r
-                       HIT_POINT dam = 75 + plev;\r
-                       int rad = 2;\r
-\r
-                       if (info) return info_damage(0, 0, dam);\r
-\r
-                       if (cast)\r
-                       {\r
-                               int type;\r
-\r
-                               if (!get_aim_dir(&dir)) return NULL;\r
-\r
-                               switch (randint1(4))\r
-                               {\r
-                                       case 1:  type = GF_FIRE;break;\r
-                                       case 2:  type = GF_ELEC;break;\r
-                                       case 3:  type = GF_COLD;break;\r
-                                       default: type = GF_ACID;break;\r
-                               }\r
-\r
-                               fire_ball(type, dir, dam, rad);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 29:\r
-               if (name) return _("全感知", "Detection");\r
-               if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。", \r
-                       "Detects all monsters, traps, doors, stairs, treasures and items 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_all(rad);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 30:\r
-               if (name) return _("帰還の呪文", "Word of Recall");\r
-               if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。", \r
-                       "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");\r
-    \r
-               {\r
-                       int base = 15;\r
-                       int sides = 20;\r
-\r
-                       if (info) return info_delay(base, sides);\r
-\r
-                       if (cast)\r
-                       {\r
-                               if (!word_of_recall()) return NULL;\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 31:\r
-               if (name) return _("千里眼", "Clairvoyance");\r
-               if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。さらに、一定時間テレパシー能力を得る。", \r
-                       "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");\r
-    \r
-               {\r
-                       int base = 25;\r
-                       int sides = 30;\r
-\r
-                       if (info) return info_duration(base, sides);\r
-\r
-                       if (cast)\r
-                       {\r
-                               chg_virtue(V_KNOWLEDGE, 1);\r
-                               chg_virtue(V_ENLIGHTEN, 1);\r
-\r
-                               wiz_lite(FALSE);\r
-\r
-                               if (!p_ptr->telepathy)\r
-                               {\r
-                                       set_tim_esp(randint1(sides) + base, FALSE);\r
-                               }\r
-                       }\r
-               }\r
-               break;\r
-       }\r
-\r
-       return "";\r
-}\r
-\r
-/*!\r
  * @brief 匠領域魔法の各処理を行う\r
  * @param spell 魔法ID\r
  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)\r
diff --git a/src/cmd-spell.h b/src/cmd-spell.h
new file mode 100644 (file)
index 0000000..2eca914
--- /dev/null
@@ -0,0 +1,13 @@
+\r
+extern cptr info_string_dice(cptr str, int dice, int sides, int base);\r
+extern cptr info_damage(int dice, int sides, int base);\r
+extern cptr info_duration(int base, int sides);\r
+extern cptr info_range(POSITION range);\r
+extern cptr info_heal(int dice, int sides, int base);\r
+extern cptr info_delay(int base, int sides);\r
+extern cptr info_multi_damage(HIT_POINT dam);\r
+extern cptr info_multi_damage_dice(int dice, int sides);\r
+extern cptr info_power(int power);\r
+extern cptr info_power_dice(int dice, int sides);\r
+extern cptr info_radius(int rad);\r
+extern cptr info_weight(int weight);\r
diff --git a/src/realm-arcane.c b/src/realm-arcane.c
new file mode 100644 (file)
index 0000000..06db633
--- /dev/null
@@ -0,0 +1,563 @@
+#include "angband.h"\r
+#include "cmd-spell.h"\r
+\r
+/*!\r
+* @brief \94é\8fp\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_arcane_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 _("\93d\8c\82", "Zap");\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 = 3;\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 _("\96\82\96@\82Ì\8e{\8fù", "Wizard Lock");\r
+               if (desc) return _("\94à\82É\8c®\82ð\82©\82¯\82é\81B", "Locks a door.");\r
+\r
+               {\r
+                       if (cast)\r
+                       {\r
+                               if (!get_aim_dir(&dir)) return NULL;\r
+\r
+                               wizard_lock(dir);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 2:\r
+               if (name) return _("\93§\96¾\91Ì\8a´\92m", "Detect Invisibility");\r
+               if (desc) return _("\8bß\82­\82Ì\93§\96¾\82È\83\82\83\93\83X\83^\81[\82ð\8a´\92m\82·\82é\81B", "Detects all invisible 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_invis(rad);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 3:\r
+               if (name) return _("\83\82\83\93\83X\83^\81[\8a´\92m", "Detect Monsters");\r
+               if (desc) return _("\8bß\82­\82Ì\91S\82Ä\82Ì\8c©\82¦\82é\83\82\83\93\83X\83^\81[\82ð\8a´\92m\82·\82é\81B", "Detects all monsters in your vicinity unless invisible.");\r
+\r
+               {\r
+                       int rad = DETECT_RAD_DEFAULT;\r
+\r
+                       if (info) return info_radius(rad);\r
+\r
+                       if (cast)\r
+                       {\r
+                               detect_monsters_normal(rad);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 4:\r
+               if (name) return _("\83V\83\87\81[\83g\81E\83e\83\8c\83|\81[\83g", "Blink");\r
+               if (desc) return _("\8bß\8b\97\97£\82Ì\83e\83\8c\83|\81[\83g\82ð\82·\82é\81B", "Teleport short distance.");\r
+\r
+               {\r
+                       POSITION range = 10;\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 5:\r
+               if (name) return _("\83\89\83C\83g\81E\83G\83\8a\83A", "Light Area");\r
+               if (desc) return _("\8cõ\8c¹\82ª\8fÆ\82ç\82µ\82Ä\82¢\82é\94Í\88Í\82©\95\94\89®\91S\91Ì\82ð\89i\8bv\82É\96¾\82é\82­\82·\82é\81B", "Lights up nearby area and the inside of a room permanently.");\r
+\r
+               {\r
+                       int dice = 2;\r
+                       int sides = plev / 2;\r
+                       int rad = plev / 10 + 1;\r
+\r
+                       if (info) return info_damage(dice, sides, 0);\r
+\r
+                       if (cast)\r
+                       {\r
+                               lite_area(damroll(dice, sides), rad);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 6:\r
+               if (name) return _("ã©\82Æ\94à \94j\89ó", "Trap & Door Destruction");\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 7:\r
+               if (name) return _("\8cy\8f\9d\82Ì\8e¡\96ü", "Cure Light Wounds");\r
+               if (desc) return _("\89ö\89ä\82Æ\91Ì\97Í\82ð\8f­\82µ\89ñ\95\9c\82³\82¹\82é\81B", "Heals cut and HP a little.");\r
+\r
+               {\r
+                       int dice = 2;\r
+                       int sides = 8;\r
+\r
+                       if (info) return info_heal(dice, sides, 0);\r
+\r
+                       if (cast)\r
+                       {\r
+                               hp_player(damroll(dice, sides));\r
+                               set_cut(p_ptr->cut - 10);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 8:\r
+               if (name) return _("ã©\82Æ\94à \8a´\92m", "Detect Doors & Traps");\r
+               if (desc) return _("\8bß\82­\82Ì\91S\82Ä\82Ìã©\82Æ\94à\82Æ\8aK\92i\82ð\8a´\92m\82·\82é\81B", "Detects traps, doors, and stairs 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_traps(rad, TRUE);\r
+                               detect_doors(rad);\r
+                               detect_stairs(rad);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 9:\r
+               if (name) return _("\94R\91f", "Phlogiston");\r
+               if (desc) return _("\8cõ\8c¹\82É\94R\97¿\82ð\95â\8b\8b\82·\82é\81B", "Adds more turns of light to a lantern or torch.");\r
+\r
+               {\r
+                       if (cast)\r
+                       {\r
+                               phlogiston();\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 10:\r
+               if (name) return _("\8dà\95ó\8a´\92m", "Detect Treasure");\r
+               if (desc) return _("\8bß\82­\82Ì\8dà\95ó\82ð\8a´\92m\82·\82é\81B", "Detects all treasures 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_treasure(rad);\r
+                               detect_objects_gold(rad);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 11:\r
+               if (name) return _("\96\82\96\8a´\92m", "Detect Enchantment");\r
+               if (desc) return _("\8bß\82­\82Ì\96\82\96@\82ª\82©\82©\82Á\82½\83A\83C\83e\83\80\82ð\8a´\92m\82·\82é\81B", "Detects all magical items 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_objects_magic(rad);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 12:\r
+               if (name) return _("\83A\83C\83e\83\80\8a´\92m", "Detect Objects");\r
+               if (desc) return _("\8bß\82­\82Ì\91S\82Ä\82Ì\83A\83C\83e\83\80\82ð\8a´\92m\82·\82é\81B", "Detects all items 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_objects_normal(rad);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 13:\r
+               if (name) return _("\89ð\93Å", "Cure Poison");\r
+               if (desc) return _("\93Å\82ð\91Ì\93à\82©\82ç\8a®\91S\82É\8eæ\82è\8f\9c\82­\81B", "Cures poison status.");\r
+\r
+               {\r
+                       if (cast)\r
+                       {\r
+                               set_poisoned(0);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 14:\r
+               if (name) return _("\91Ï\97â", "Resist Cold");\r
+               if (desc) return _("\88ê\92è\8e\9e\8aÔ\81A\97â\8bC\82Ö\82Ì\91Ï\90«\82ð\93¾\82é\81B\91\95\94õ\82É\82æ\82é\91Ï\90«\82É\97Ý\90Ï\82·\82é\81B", "Gives resistance to cold. This resistance can be added to which from equipment for more powerful resistance.");\r
+\r
+               {\r
+                       int base = 20;\r
+\r
+                       if (info) return info_duration(base, base);\r
+\r
+                       if (cast)\r
+                       {\r
+                               set_oppose_cold(randint1(base) + base, FALSE);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 15:\r
+               if (name) return _("\91Ï\89Î", "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. This resistance can be added to which from equipment for more powerful resistance.");\r
+\r
+               {\r
+                       int base = 20;\r
+\r
+                       if (info) return info_duration(base, base);\r
+\r
+                       if (cast)\r
+                       {\r
+                               set_oppose_fire(randint1(base) + base, FALSE);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 16:\r
+               if (name) return _("\91Ï\93d", "Resist Lightning");\r
+               if (desc) return _("\88ê\92è\8e\9e\8aÔ\81A\93d\8c\82\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 electricity. This resistance can be added to which from equipment for more powerful resistance.");\r
+\r
+               {\r
+                       int base = 20;\r
+\r
+                       if (info) return info_duration(base, base);\r
+\r
+                       if (cast)\r
+                       {\r
+                               set_oppose_elec(randint1(base) + base, FALSE);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 17:\r
+               if (name) return _("\91Ï\8e_", "Resist Acid");\r
+               if (desc) return _("\88ê\92è\8e\9e\8aÔ\81A\8e_\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 acid. This resistance can be added to which from equipment for more powerful resistance.");\r
+\r
+               {\r
+                       int base = 20;\r
+\r
+                       if (info) return info_duration(base, base);\r
+\r
+                       if (cast)\r
+                       {\r
+                               set_oppose_acid(randint1(base) + base, FALSE);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 18:\r
+               if (name) return _("\8fd\8f\9d\82Ì\8e¡\96ü", "Cure Medium Wounds");\r
+               if (desc) return _("\89ö\89ä\82Æ\91Ì\97Í\82ð\92\86\92ö\93x\89ñ\95\9c\82³\82¹\82é\81B", "Heals cut and HP more.");\r
+\r
+               {\r
+                       int dice = 4;\r
+                       int sides = 8;\r
+\r
+                       if (info) return info_heal(dice, sides, 0);\r
+\r
+                       if (cast)\r
+                       {\r
+                               hp_player(damroll(dice, sides));\r
+                               set_cut((p_ptr->cut / 2) - 50);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 19:\r
+               if (name) return _("\83e\83\8c\83|\81[\83g", "Teleport");\r
+               if (desc) return _("\89\93\8b\97\97£\82Ì\83e\83\8c\83|\81[\83g\82ð\82·\82é\81B", "Teleport long distance.");\r
+\r
+               {\r
+                       POSITION range = plev * 5;\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 20:\r
+               if (name) return _("\8aÓ\92è", "Identify");\r
+               if (desc) return _("\83A\83C\83e\83\80\82ð\8e¯\95Ê\82·\82é\81B", "Identifies an item.");\r
+\r
+               {\r
+                       if (cast)\r
+                       {\r
+                               if (!ident_spell(FALSE)) return NULL;\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 21:\r
+               if (name) return _("\8aâ\90Î\97n\89ð", "Stone to Mud");\r
+               if (desc) return _("\95Ç\82ð\97n\82©\82µ\82Ä\8f°\82É\82·\82é\81B", "Turns one rock square to mud.");\r
+\r
+               {\r
+                       int dice = 1;\r
+                       int sides = 30;\r
+                       int base = 20;\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
+                               wall_to_mud(dir, 20 + randint1(30));\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 22:\r
+               if (name) return _("\91M\8cõ", "Ray of Light");\r
+               if (desc) return _("\8cõ\90ü\82ð\95ú\82Â\81B\8cõ\82è\82ð\8c\99\82¤\83\82\83\93\83X\83^\81[\82É\8cø\89Ê\82ª\82 \82é\81B", "Fires a beam of light which damages to light-sensitive monsters.");\r
+\r
+               {\r
+                       int dice = 6;\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
+                               msg_print(_("\8cõ\90ü\82ª\95ú\82½\82ê\82½\81B", "A line of light appears."));\r
+                               lite_line(dir, damroll(6, 8));\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 23:\r
+               if (name) return _("\8bó\95 \8f[\91«", "Satisfy Hunger");\r
+               if (desc) return _("\96\9e\95 \82É\82·\82é\81B", "Satisfies hunger.");\r
+\r
+               {\r
+                       if (cast)\r
+                       {\r
+                               set_food(PY_FOOD_MAX - 1);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 24:\r
+               if (name) return _("\93§\96¾\8e\8b\94F", "See Invisible");\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 25:\r
+               if (name) return _("\83G\83\8c\83\81\83\93\83^\83\8b\8f¢\8a«", "Conjure Elemental");\r
+               if (desc) return _("1\91Ì\82Ì\83G\83\8c\83\81\83\93\83^\83\8b\82ð\8f¢\8a«\82·\82é\81B", "Summons an elemental.");\r
+\r
+               {\r
+                       if (cast)\r
+                       {\r
+                               if (!summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_ELEMENTAL, (PM_ALLOW_GROUP | PM_FORCE_PET)))\r
+                               {\r
+                                       msg_print(_("\83G\83\8c\83\81\83\93\83^\83\8b\82Í\8c»\82ê\82È\82©\82Á\82½\81B", "No Elementals arrive."));\r
+                               }\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 26:\r
+               if (name) return _("\83e\83\8c\83|\81[\83g\81E\83\8c\83x\83\8b", "Teleport Level");\r
+               if (desc) return _("\8fu\8e\9e\82É\8fã\82©\89º\82Ì\8aK\82É\83e\83\8c\83|\81[\83g\82·\82é\81B", "Teleport to up or down stairs in a moment.");\r
+\r
+               {\r
+                       if (cast)\r
+                       {\r
+                               if (!get_check(_("\96{\93\96\82É\91¼\82Ì\8aK\82É\83e\83\8c\83|\81[\83g\82µ\82Ü\82·\82©\81H", "Are you sure? (Teleport Level)"))) return NULL;\r
+                               teleport_level(0);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 27:\r
+               if (name) return _("\83e\83\8c\83|\81[\83g\81E\83\82\83\93\83X\83^\81[", "Teleport Away");\r
+               if (desc) return _("\83\82\83\93\83X\83^\81[\82ð\83e\83\8c\83|\81[\83g\82³\82¹\82é\83r\81[\83\80\82ð\95ú\82Â\81B\92ï\8dR\82³\82ê\82é\82Æ\96³\8cø\81B", "Teleports all monsters on the line away unless resisted.");\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
+                               fire_beam(GF_AWAY_ALL, dir, power);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 28:\r
+               if (name) return _("\8c³\91f\82Ì\8b\85", "Elemental Ball");\r
+               if (desc) return _("\89\8a\81A\93d\8c\82\81A\97â\8bC\81A\8e_\82Ì\82Ç\82ê\82©\82Ì\8b\85\82ð\95ú\82Â\81B", "Fires a ball of some elements.");\r
+\r
+               {\r
+                       HIT_POINT dam = 75 + plev;\r
+                       int rad = 2;\r
+\r
+                       if (info) return info_damage(0, 0, dam);\r
+\r
+                       if (cast)\r
+                       {\r
+                               int type;\r
+\r
+                               if (!get_aim_dir(&dir)) return NULL;\r
+\r
+                               switch (randint1(4))\r
+                               {\r
+                               case 1:  type = GF_FIRE; break;\r
+                               case 2:  type = GF_ELEC; break;\r
+                               case 3:  type = GF_COLD; break;\r
+                               default: type = GF_ACID; break;\r
+                               }\r
+\r
+                               fire_ball(type, dir, dam, rad);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 29:\r
+               if (name) return _("\91S\8a´\92m", "Detection");\r
+               if (desc) return _("\8bß\82­\82Ì\91S\82Ä\82Ì\83\82\83\93\83X\83^\81[\81Aã©\81A\94à\81A\8aK\92i\81A\8dà\95ó\81A\82»\82µ\82Ä\83A\83C\83e\83\80\82ð\8a´\92m\82·\82é\81B",\r
+                       "Detects all monsters, traps, doors, stairs, treasures and items 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_all(rad);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 30:\r
+               if (name) return _("\8bA\8aÒ\82Ì\8eô\95¶", "Word of Recall");\r
+               if (desc) return _("\92n\8fã\82É\82¢\82é\82Æ\82«\82Í\83_\83\93\83W\83\87\83\93\82Ì\8dÅ\90[\8aK\82Ö\81A\83_\83\93\83W\83\87\83\93\82É\82¢\82é\82Æ\82«\82Í\92n\8fã\82Ö\82Æ\88Ú\93®\82·\82é\81B",\r
+                       "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");\r
+\r
+               {\r
+                       int base = 15;\r
+                       int sides = 20;\r
+\r
+                       if (info) return info_delay(base, sides);\r
+\r
+                       if (cast)\r
+                       {\r
+                               if (!word_of_recall()) return NULL;\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 31:\r
+               if (name) return _("\90ç\97¢\8aá", "Clairvoyance");\r
+               if (desc) return _("\82»\82Ì\8aK\91S\91Ì\82ð\89i\8bv\82É\8fÆ\82ç\82µ\81A\83_\83\93\83W\83\87\83\93\93à\82·\82×\82Ä\82Ì\83A\83C\83e\83\80\82ð\8a´\92m\82·\82é\81B\82³\82ç\82É\81A\88ê\92è\8e\9e\8aÔ\83e\83\8c\83p\83V\81[\94\\97Í\82ð\93¾\82é\81B",\r
+                       "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");\r
+\r
+               {\r
+                       int base = 25;\r
+                       int sides = 30;\r
+\r
+                       if (info) return info_duration(base, sides);\r
+\r
+                       if (cast)\r
+                       {\r
+                               chg_virtue(V_KNOWLEDGE, 1);\r
+                               chg_virtue(V_ENLIGHTEN, 1);\r
+\r
+                               wiz_lite(FALSE);\r
+\r
+                               if (!p_ptr->telepathy)\r
+                               {\r
+                                       set_tim_esp(randint1(sides) + base, FALSE);\r
+                               }\r
+                       }\r
+               }\r
+               break;\r
+       }\r
+\r
+       return "";\r
+}\r
diff --git a/src/realm-arcane.h b/src/realm-arcane.h
new file mode 100644 (file)
index 0000000..1633a7c
--- /dev/null
@@ -0,0 +1 @@
+extern cptr do_arcane_spell(SPELL_IDX spell, BIT_FLAGS mode);\r