OSDN Git Service

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

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

index f5ec8e3..661b6e4 100644 (file)
     <ClCompile Include="..\..\src\cmd-pet.c" />\r
     <ClCompile Include="..\..\src\cmd-quaff.c" />\r
     <ClCompile Include="..\..\src\cmd-read.c" />\r
+    <ClCompile Include="..\..\src\realm-sorcery.c" />\r
     <ClCompile Include="..\..\src\cmd-usestaff.c" />\r
     <ClCompile Include="..\..\src\cmd-zaprod.c" />\r
     <ClCompile Include="..\..\src\cmd-zapwand.c" />\r
     <ClInclude Include="..\..\src\realm-arcane.h" />\r
     <ClInclude Include="..\..\src\realm-chaos.h" />\r
     <ClInclude Include="..\..\src\realm-life.h" />\r
+    <ClInclude Include="..\..\src\realm-sorcery.h" />\r
     <ClInclude Include="..\..\src\rooms-normal.h" />\r
     <ClInclude Include="..\..\src\rooms-pitnest.h" />\r
     <ClInclude Include="..\..\src\rooms-vault.h" />\r
index 4b16375..9da686c 100644 (file)
     <ClCompile Include="..\..\src\realm-life.c">\r
       <Filter>Source</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\src\realm-sorcery.c">\r
+      <Filter>Source</Filter>\r
+    </ClCompile>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ClInclude Include="..\..\src\angband.h">\r
     <ClInclude Include="..\..\src\realm-life.h">\r
       <Filter>Header</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\src\realm-sorcery.h">\r
+      <Filter>Header</Filter>\r
+    </ClInclude>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ResourceCompile Include="..\..\src\angband.rc" />\r
index fa4f256..9e55c68 100644 (file)
@@ -13,6 +13,7 @@
 #include "realm-arcane.h"\r
 #include "realm-chaos.h"\r
 #include "realm-life.h"\r
+#include "realm-sorcery.h"\r
 \r
 /*!\r
  * @brief\r
@@ -233,552 +234,6 @@ void stop_singing(void)
 \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_sorcery_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 _("モンスター感知", "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 1:\r
-               if (name) return _("ショート・テレポート", "Phase Door");\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 2:\r
-               if (name) return _("罠と扉感知", "Detect Doors and 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 3:\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 4:\r
-               if (name) return _("パニック・モンスター", "Confuse Monster");\r
-               if (desc) return _("モンスター1体を混乱させる。抵抗されると無効。", "Attempts to confuse a monster.");\r
-    \r
-               {\r
-                       int power = (plev * 3) / 2;\r
-\r
-                       if (info) return info_power(power);\r
-\r
-                       if (cast)\r
-                       {\r
-                               if (!get_aim_dir(&dir)) return NULL;\r
-\r
-                               confuse_monster(dir, power);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 5:\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 6:\r
-               if (name) return _("スリープ・モンスター", "Sleep Monster");\r
-               if (desc) return _("モンスター1体を眠らせる。抵抗されると無効。", "Attempts to sleep a monster.");\r
-    \r
-               {\r
-                       int power = plev;\r
-\r
-                       if (info) return info_power(power);\r
-\r
-                       if (cast)\r
-                       {\r
-                               if (!get_aim_dir(&dir)) return NULL;\r
-\r
-                               sleep_monster(dir, plev);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 7:\r
-               if (name) return _("魔力充填", "Recharging");\r
-               if (desc) return _("杖/魔法棒の充填回数を増やすか、充填中のロッドの充填時間を減らす。", "Recharges staffs, wands or rods.");\r
-    \r
-               {\r
-                       int power = plev * 4;\r
-\r
-                       if (info) return info_power(power);\r
-\r
-                       if (cast)\r
-                       {\r
-                               if (!recharge(power)) return NULL;\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 8:\r
-               if (name) return _("魔法の地図", "Magic Mapping");\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 9:\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 10:\r
-               if (name) return _("スロウ・モンスター", "Slow Monster");\r
-               if (desc) return _("モンスター1体を減速さる。抵抗されると無効。", "Attempts to slow 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
-                               slow_monster(dir, plev);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 11:\r
-               if (name) return _("周辺スリープ", "Mass Sleep");\r
-               if (desc) return _("視界内の全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep all monsters in sight.");\r
-    \r
-               {\r
-                       int power = plev;\r
-\r
-                       if (info) return info_power(power);\r
-\r
-                       if (cast)\r
-                       {\r
-                               sleep_monsters(plev);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 12:\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 13:\r
-               if (name) return _("スピード", "Haste Self");\r
-               if (desc) return _("一定時間、加速する。", "Hastes you for a while.");\r
-    \r
-               {\r
-                       int base = plev;\r
-                       int sides = 20 + plev;\r
-\r
-                       if (info) return info_duration(base, sides);\r
-\r
-                       if (cast)\r
-                       {\r
-                               set_fast(randint1(sides) + base, FALSE);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 14:\r
-               if (name) return _("真・感知", "Detection True");\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 15:\r
-               if (name) return _("真・鑑定", "Identify True");\r
-               if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");\r
-    \r
-               {\r
-                       if (cast)\r
-                       {\r
-                               if (!identify_fully(FALSE)) return NULL;\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 16:\r
-               if (name) return _("物体と財宝感知", "Detect items and Treasure");\r
-               if (desc) return _("近くの全てのアイテムと財宝を感知する。", "Detects all 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_objects_normal(rad);\r
-                               detect_treasure(rad);\r
-                               detect_objects_gold(rad);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 17:\r
-               if (name) return _("チャーム・モンスター", "Charm Monster");\r
-               if (desc) return _("モンスター1体を魅了する。抵抗されると無効。", "Attempts to charm 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
-                               charm_monster(dir, power);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 18:\r
-               if (name) return _("精神感知", "Sense Minds");\r
-               if (desc) return _("一定時間、テレパシー能力を得る。", "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
-                               set_tim_esp(randint1(sides) + base, FALSE);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 19:\r
-               if (name) return _("街移動", "Teleport to town");\r
-               if (desc) return _("街へ移動する。地上にいるときしか使えない。", "Teleport to a town which you choose in a moment. Can only be used outdoors.");\r
-    \r
-               {\r
-                       if (cast)\r
-                       {\r
-                               if (!tele_town()) return NULL;\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 20:\r
-               if (name) return _("自己分析", "Self Knowledge");\r
-               if (desc) return _("現在の自分の状態を完全に知る。",\r
-                       "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");\r
-    \r
-               {\r
-                       if (cast)\r
-                       {\r
-                               self_knowledge();\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 21:\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 22:\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 23:\r
-               if (name) return _("次元の扉", "Dimension Door");\r
-               if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleport to given location.");\r
-    \r
-               {\r
-                       POSITION range = plev / 2 + 10;\r
-\r
-                       if (info) return info_range(range);\r
-\r
-                       if (cast)\r
-                       {\r
-                               msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));\r
-                               if (!dimension_door()) return NULL;\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 24:\r
-               if (name) return _("調査", "Probing");\r
-               if (desc) return _("モンスターの属性、残り体力、最大体力、スピード、正体を知る。",\r
-                       "Proves all monsters' alignment, HP, speed and their true character.");\r
-    \r
-               {\r
-                       if (cast)\r
-                       {\r
-                               probing();\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 25:\r
-               if (name) return _("爆発のルーン", "Explosive Rune");\r
-               if (desc) return _("自分のいる床の上に、モンスターが通ると爆発してダメージを与えるルーンを描く。", \r
-                       "Sets a glyph under you. The glyph will explode when a monster moves on it.");\r
-    \r
-               {\r
-                       int dice = 7;\r
-                       int sides = 7;\r
-                       int base = plev;\r
-\r
-                       if (info) return info_damage(dice, sides, base);\r
-\r
-                       if (cast)\r
-                       {\r
-                               explosive_rune();\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 26:\r
-               if (name) return _("念動力", "Telekinesis");\r
-               if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");\r
-    \r
-               {\r
-                       int weight = plev * 15;\r
-\r
-                       if (info) return info_weight(weight);\r
-\r
-                       if (cast)\r
-                       {\r
-                               if (!get_aim_dir(&dir)) return NULL;\r
-\r
-                               fetch(dir, weight, FALSE);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 27:\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
-       case 28:\r
-               if (name) return _("魅了の視線", "Charm monsters");\r
-               if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");\r
-    \r
-               {\r
-                       int power = plev * 2;\r
-\r
-                       if (info) return info_power(power);\r
-\r
-                       if (cast)\r
-                       {\r
-                               charm_monsters(power);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 29:\r
-               if (name) return _("錬金術", "Alchemy");\r
-               if (desc) return _("アイテム1つをお金に変える。", "Turns an item into 1/3 of its value in gold.");\r
-    \r
-               {\r
-                       if (cast)\r
-                       {\r
-                               if (!alchemy()) return NULL;\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 30:\r
-               if (name) return _("怪物追放", "Banishment");\r
-               if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");\r
-    \r
-               {\r
-                       int power = plev * 4;\r
-\r
-                       if (info) return info_power(power);\r
-\r
-                       if (cast)\r
-                       {\r
-                               banish_monsters(power);\r
-                       }\r
-               }\r
-               break;\r
-\r
-       case 31:\r
-               if (name) return _("無傷の球", "Globe of Invulnerability");\r
-               if (desc) return _("一定時間、ダメージを受けなくなるバリアを張る。切れた瞬間に少しターンを消費するので注意。",\r
-                       "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks or duration time is exceeded.");\r
-    \r
-               {\r
-                       int base = 4;\r
-\r
-                       if (info) return info_duration(base, base);\r
-\r
-                       if (cast)\r
-                       {\r
-                               set_invuln(randint1(base) + base, FALSE);\r
-                       }\r
-               }\r
-               break;\r
-       }\r
-\r
-       return "";\r
-}\r
 \r
 \r
 /*!\r
diff --git a/src/realm-sorcery.c b/src/realm-sorcery.c
new file mode 100644 (file)
index 0000000..fc12399
--- /dev/null
@@ -0,0 +1,550 @@
+#include "angband.h"\r
+#include "cmd-spell.h"\r
+#include "selfinfo.h"\r
+\r
+/*!\r
+* @brief \90å\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_sorcery_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 _("\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 1:\r
+               if (name) return _("\83V\83\87\81[\83g\81E\83e\83\8c\83|\81[\83g", "Phase Door");\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 2:\r
+               if (name) return _("ã©\82Æ\94à\8a´\92m", "Detect Doors and Traps");\r
+               if (desc) return _("\8bß\82­\82Ì\91S\82Ä\82Ì\94à\82Æã©\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 3:\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 4:\r
+               if (name) return _("\83p\83j\83b\83N\81E\83\82\83\93\83X\83^\81[", "Confuse Monster");\r
+               if (desc) return _("\83\82\83\93\83X\83^\81[1\91Ì\82ð\8d¬\97\90\82³\82¹\82é\81B\92ï\8dR\82³\82ê\82é\82Æ\96³\8cø\81B", "Attempts to confuse a monster.");\r
+\r
+               {\r
+                       int power = (plev * 3) / 2;\r
+\r
+                       if (info) return info_power(power);\r
+\r
+                       if (cast)\r
+                       {\r
+                               if (!get_aim_dir(&dir)) return NULL;\r
+\r
+                               confuse_monster(dir, power);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 5:\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 6:\r
+               if (name) return _("\83X\83\8a\81[\83v\81E\83\82\83\93\83X\83^\81[", "Sleep Monster");\r
+               if (desc) return _("\83\82\83\93\83X\83^\81[1\91Ì\82ð\96°\82ç\82¹\82é\81B\92ï\8dR\82³\82ê\82é\82Æ\96³\8cø\81B", "Attempts to sleep a monster.");\r
+\r
+               {\r
+                       int power = plev;\r
+\r
+                       if (info) return info_power(power);\r
+\r
+                       if (cast)\r
+                       {\r
+                               if (!get_aim_dir(&dir)) return NULL;\r
+\r
+                               sleep_monster(dir, plev);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 7:\r
+               if (name) return _("\96\82\97Í\8f[\93U", "Recharging");\r
+               if (desc) return _("\8fñ/\96\82\96@\96_\82Ì\8f[\93U\89ñ\90\94\82ð\91\9d\82â\82·\82©\81A\8f[\93U\92\86\82Ì\83\8d\83b\83h\82Ì\8f[\93U\8e\9e\8aÔ\82ð\8c¸\82ç\82·\81B", "Recharges staffs, wands or rods.");\r
+\r
+               {\r
+                       int power = plev * 4;\r
+\r
+                       if (info) return info_power(power);\r
+\r
+                       if (cast)\r
+                       {\r
+                               if (!recharge(power)) return NULL;\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 8:\r
+               if (name) return _("\96\82\96@\82Ì\92n\90}", "Magic Mapping");\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 9:\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 10:\r
+               if (name) return _("\83X\83\8d\83E\81E\83\82\83\93\83X\83^\81[", "Slow Monster");\r
+               if (desc) return _("\83\82\83\93\83X\83^\81[1\91Ì\82ð\8c¸\91¬\82³\82é\81B\92ï\8dR\82³\82ê\82é\82Æ\96³\8cø\81B", "Attempts to slow 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
+                               slow_monster(dir, plev);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 11:\r
+               if (name) return _("\8eü\95Ó\83X\83\8a\81[\83v", "Mass Sleep");\r
+               if (desc) return _("\8e\8b\8aE\93à\82Ì\91S\82Ä\82Ì\83\82\83\93\83X\83^\81[\82ð\96°\82ç\82¹\82é\81B\92ï\8dR\82³\82ê\82é\82Æ\96³\8cø\81B", "Attempts to sleep all monsters in sight.");\r
+\r
+               {\r
+                       int power = plev;\r
+\r
+                       if (info) return info_power(power);\r
+\r
+                       if (cast)\r
+                       {\r
+                               sleep_monsters(plev);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 12:\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 13:\r
+               if (name) return _("\83X\83s\81[\83h", "Haste Self");\r
+               if (desc) return _("\88ê\92è\8e\9e\8aÔ\81A\89Á\91¬\82·\82é\81B", "Hastes you for a while.");\r
+\r
+               {\r
+                       int base = plev;\r
+                       int sides = 20 + plev;\r
+\r
+                       if (info) return info_duration(base, sides);\r
+\r
+                       if (cast)\r
+                       {\r
+                               set_fast(randint1(sides) + base, FALSE);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 14:\r
+               if (name) return _("\90^\81E\8a´\92m", "Detection True");\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 15:\r
+               if (name) return _("\90^\81E\8aÓ\92è", "Identify True");\r
+               if (desc) return _("\83A\83C\83e\83\80\82Ì\8e\9d\82Â\94\\97Í\82ð\8a®\91S\82É\92m\82é\81B", "*Identifies* an item.");\r
+\r
+               {\r
+                       if (cast)\r
+                       {\r
+                               if (!identify_fully(FALSE)) return NULL;\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 16:\r
+               if (name) return _("\95¨\91Ì\82Æ\8dà\95ó\8a´\92m", "Detect items and Treasure");\r
+               if (desc) return _("\8bß\82­\82Ì\91S\82Ä\82Ì\83A\83C\83e\83\80\82Æ\8dà\95ó\82ð\8a´\92m\82·\82é\81B", "Detects all 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_objects_normal(rad);\r
+                               detect_treasure(rad);\r
+                               detect_objects_gold(rad);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 17:\r
+               if (name) return _("\83`\83\83\81[\83\80\81E\83\82\83\93\83X\83^\81[", "Charm Monster");\r
+               if (desc) return _("\83\82\83\93\83X\83^\81[1\91Ì\82ð\96£\97¹\82·\82é\81B\92ï\8dR\82³\82ê\82é\82Æ\96³\8cø\81B", "Attempts to charm 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
+                               charm_monster(dir, power);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 18:\r
+               if (name) return _("\90¸\90_\8a´\92m", "Sense Minds");\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 = 25;\r
+                       int sides = 30;\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 19:\r
+               if (name) return _("\8aX\88Ú\93®", "Teleport to town");\r
+               if (desc) return _("\8aX\82Ö\88Ú\93®\82·\82é\81B\92n\8fã\82É\82¢\82é\82Æ\82«\82µ\82©\8eg\82¦\82È\82¢\81B", "Teleport to a town which you choose in a moment. Can only be used outdoors.");\r
+\r
+               {\r
+                       if (cast)\r
+                       {\r
+                               if (!tele_town()) return NULL;\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 20:\r
+               if (name) return _("\8e©\8cÈ\95ª\90Í", "Self Knowledge");\r
+               if (desc) return _("\8c»\8dÝ\82Ì\8e©\95ª\82Ì\8fó\91Ô\82ð\8a®\91S\82É\92m\82é\81B",\r
+                       "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");\r
+\r
+               {\r
+                       if (cast)\r
+                       {\r
+                               self_knowledge();\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 21:\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 22:\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 23:\r
+               if (name) return _("\8e\9f\8c³\82Ì\94à", "Dimension Door");\r
+               if (desc) return _("\92Z\8b\97\97£\93à\82Ì\8ew\92è\82µ\82½\8fê\8f\8a\82É\83e\83\8c\83|\81[\83g\82·\82é\81B", "Teleport to given location.");\r
+\r
+               {\r
+                       POSITION range = plev / 2 + 10;\r
+\r
+                       if (info) return info_range(range);\r
+\r
+                       if (cast)\r
+                       {\r
+                               msg_print(_("\8e\9f\8c³\82Ì\94à\82ª\8aJ\82¢\82½\81B\96Ú\93I\92n\82ð\91I\82ñ\82Å\89º\82³\82¢\81B", "You open a dimensional gate. Choose a destination."));\r
+                               if (!dimension_door()) return NULL;\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 24:\r
+               if (name) return _("\92²\8d¸", "Probing");\r
+               if (desc) return _("\83\82\83\93\83X\83^\81[\82Ì\91®\90«\81A\8ec\82è\91Ì\97Í\81A\8dÅ\91å\91Ì\97Í\81A\83X\83s\81[\83h\81A\90³\91Ì\82ð\92m\82é\81B",\r
+                       "Proves all monsters' alignment, HP, speed and their true character.");\r
+\r
+               {\r
+                       if (cast)\r
+                       {\r
+                               probing();\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 25:\r
+               if (name) return _("\94\9a\94­\82Ì\83\8b\81[\83\93", "Explosive Rune");\r
+               if (desc) return _("\8e©\95ª\82Ì\82¢\82é\8f°\82Ì\8fã\82É\81A\83\82\83\93\83X\83^\81[\82ª\92Ê\82é\82Æ\94\9a\94­\82µ\82Ä\83_\83\81\81[\83W\82ð\97^\82¦\82é\83\8b\81[\83\93\82ð\95`\82­\81B",\r
+                       "Sets a glyph under you. The glyph will explode when a monster moves on it.");\r
+\r
+               {\r
+                       int dice = 7;\r
+                       int sides = 7;\r
+                       int base = plev;\r
+\r
+                       if (info) return info_damage(dice, sides, base);\r
+\r
+                       if (cast)\r
+                       {\r
+                               explosive_rune();\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 26:\r
+               if (name) return _("\94O\93®\97Í", "Telekinesis");\r
+               if (desc) return _("\83A\83C\83e\83\80\82ð\8e©\95ª\82Ì\91«\8c³\82Ö\88Ú\93®\82³\82¹\82é\81B", "Pulls a distant item close to you.");\r
+\r
+               {\r
+                       int weight = plev * 15;\r
+\r
+                       if (info) return info_weight(weight);\r
+\r
+                       if (cast)\r
+                       {\r
+                               if (!get_aim_dir(&dir)) return NULL;\r
+\r
+                               fetch(dir, weight, FALSE);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 27:\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
+       case 28:\r
+               if (name) return _("\96£\97¹\82Ì\8e\8b\90ü", "Charm monsters");\r
+               if (desc) return _("\8e\8b\8aE\93à\82Ì\91S\82Ä\82Ì\83\82\83\93\83X\83^\81[\82ð\96£\97¹\82·\82é\81B\92ï\8dR\82³\82ê\82é\82Æ\96³\8cø\81B", "Attempts to charm all monsters in sight.");\r
+\r
+               {\r
+                       int power = plev * 2;\r
+\r
+                       if (info) return info_power(power);\r
+\r
+                       if (cast)\r
+                       {\r
+                               charm_monsters(power);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 29:\r
+               if (name) return _("\98B\8bà\8fp", "Alchemy");\r
+               if (desc) return _("\83A\83C\83e\83\801\82Â\82ð\82¨\8bà\82É\95Ï\82¦\82é\81B", "Turns an item into 1/3 of its value in gold.");\r
+\r
+               {\r
+                       if (cast)\r
+                       {\r
+                               if (!alchemy()) return NULL;\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 30:\r
+               if (name) return _("\89ö\95¨\92Ç\95ú", "Banishment");\r
+               if (desc) return _("\8e\8b\8aE\93à\82Ì\91S\82Ä\82Ì\83\82\83\93\83X\83^\81[\82ð\83e\83\8c\83|\81[\83g\82³\82¹\82é\81B\92ï\8dR\82³\82ê\82é\82Æ\96³\8cø\81B", "Teleports all monsters in sight away unless resisted.");\r
+\r
+               {\r
+                       int power = plev * 4;\r
+\r
+                       if (info) return info_power(power);\r
+\r
+                       if (cast)\r
+                       {\r
+                               banish_monsters(power);\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 31:\r
+               if (name) return _("\96³\8f\9d\82Ì\8b\85", "Globe of Invulnerability");\r
+               if (desc) return _("\88ê\92è\8e\9e\8aÔ\81A\83_\83\81\81[\83W\82ð\8eó\82¯\82È\82­\82È\82é\83o\83\8a\83A\82ð\92£\82é\81B\90Ø\82ê\82½\8fu\8aÔ\82É\8f­\82µ\83^\81[\83\93\82ð\8fÁ\94ï\82·\82é\82Ì\82Å\92\8d\88Ó\81B",\r
+                       "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks or duration time is exceeded.");\r
+\r
+               {\r
+                       int base = 4;\r
+\r
+                       if (info) return info_duration(base, base);\r
+\r
+                       if (cast)\r
+                       {\r
+                               set_invuln(randint1(base) + base, FALSE);\r
+                       }\r
+               }\r
+               break;\r
+       }\r
+\r
+       return "";\r
+}\r
diff --git a/src/realm-sorcery.h b/src/realm-sorcery.h
new file mode 100644 (file)
index 0000000..f77e6d8
--- /dev/null
@@ -0,0 +1 @@
+extern cptr do_sorcery_spell(SPELL_IDX spell, BIT_FLAGS mode);\r