From d3563beb1f318b82a024ef990d333a910d4ab698 Mon Sep 17 00:00:00 2001 From: Deskull Date: Thu, 13 Sep 2018 20:03:26 +0900 Subject: [PATCH] =?utf8?q?[Refactor]=20#37353=E3=80=80=E4=BB=99=E8=A1=93?= =?utf8?q?=E9=A0=98=E5=9F=9F=E5=87=A6=E7=90=86=E3=82=92=20cmd-spell.c=20?= =?utf8?q?=E3=81=8B=E3=82=89=20realm-sorcery.c/h=20=E3=81=B8=E5=88=86?= =?utf8?q?=E9=9B=A2=E3=80=82=20Separate=20life=20realm=20process=20from=20?= =?utf8?q?cmd-spell.c=20to=20realm-sorcery.c/h.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- Hengband_vcs2015/Hengband/Hengband.vcxproj | 2 + Hengband_vcs2015/Hengband/Hengband.vcxproj.filters | 6 + src/cmd-spell.c | 547 +------------------- src/realm-sorcery.c | 550 +++++++++++++++++++++ src/realm-sorcery.h | 1 + 5 files changed, 560 insertions(+), 546 deletions(-) create mode 100644 src/realm-sorcery.c create mode 100644 src/realm-sorcery.h diff --git a/Hengband_vcs2015/Hengband/Hengband.vcxproj b/Hengband_vcs2015/Hengband/Hengband.vcxproj index f5ec8e368..661b6e460 100644 --- a/Hengband_vcs2015/Hengband/Hengband.vcxproj +++ b/Hengband_vcs2015/Hengband/Hengband.vcxproj @@ -144,6 +144,7 @@ + @@ -254,6 +255,7 @@ + diff --git a/Hengband_vcs2015/Hengband/Hengband.vcxproj.filters b/Hengband_vcs2015/Hengband/Hengband.vcxproj.filters index 4b16375c8..9da686ce2 100644 --- a/Hengband_vcs2015/Hengband/Hengband.vcxproj.filters +++ b/Hengband_vcs2015/Hengband/Hengband.vcxproj.filters @@ -265,6 +265,9 @@ Source + + Source + @@ -403,6 +406,9 @@ Header + + Header + diff --git a/src/cmd-spell.c b/src/cmd-spell.c index fa4f25683..9e55c68ae 100644 --- a/src/cmd-spell.c +++ b/src/cmd-spell.c @@ -13,6 +13,7 @@ #include "realm-arcane.h" #include "realm-chaos.h" #include "realm-life.h" +#include "realm-sorcery.h" /*! * @brief @@ -233,552 +234,6 @@ void stop_singing(void) -/*! - * @brief 仙術領域魔法の各処理を行う - * @param spell 魔法ID - * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST) - * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。 - */ -static cptr do_sorcery_spell(SPELL_IDX spell, BIT_FLAGS mode) -{ - bool name = (mode == SPELL_NAME) ? TRUE : FALSE; - bool desc = (mode == SPELL_DESC) ? TRUE : FALSE; - bool info = (mode == SPELL_INFO) ? TRUE : FALSE; - bool cast = (mode == SPELL_CAST) ? TRUE : FALSE; - - int dir; - int plev = p_ptr->lev; - - switch (spell) - { - case 0: - if (name) return _("モンスター感知", "Detect Monsters"); - if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible."); - - { - int rad = DETECT_RAD_DEFAULT; - - if (info) return info_radius(rad); - - if (cast) - { - detect_monsters_normal(rad); - } - } - break; - - case 1: - if (name) return _("ショート・テレポート", "Phase Door"); - if (desc) return _("近距離のテレポートをする。", "Teleport short distance."); - - { - POSITION range = 10; - - if (info) return info_range(range); - - if (cast) - { - teleport_player(range, 0L); - } - } - break; - - case 2: - if (name) return _("罠と扉感知", "Detect Doors and Traps"); - if (desc) return _("近くの全ての扉と罠を感知する。", "Detects traps, doors, and stairs in your vicinity."); - - { - int rad = DETECT_RAD_DEFAULT; - - if (info) return info_radius(rad); - - if (cast) - { - detect_traps(rad, TRUE); - detect_doors(rad); - detect_stairs(rad); - } - } - break; - - case 3: - if (name) return _("ライト・エリア", "Light Area"); - if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently."); - - { - int dice = 2; - int sides = plev / 2; - int rad = plev / 10 + 1; - - if (info) return info_damage(dice, sides, 0); - - if (cast) - { - lite_area(damroll(dice, sides), rad); - } - } - break; - - case 4: - if (name) return _("パニック・モンスター", "Confuse Monster"); - if (desc) return _("モンスター1体を混乱させる。抵抗されると無効。", "Attempts to confuse a monster."); - - { - int power = (plev * 3) / 2; - - if (info) return info_power(power); - - if (cast) - { - if (!get_aim_dir(&dir)) return NULL; - - confuse_monster(dir, power); - } - } - break; - - case 5: - if (name) return _("テレポート", "Teleport"); - if (desc) return _("遠距離のテレポートをする。", "Teleport long distance."); - - { - POSITION range = plev * 5; - - if (info) return info_range(range); - - if (cast) - { - teleport_player(range, 0L); - } - } - break; - - case 6: - if (name) return _("スリープ・モンスター", "Sleep Monster"); - if (desc) return _("モンスター1体を眠らせる。抵抗されると無効。", "Attempts to sleep a monster."); - - { - int power = plev; - - if (info) return info_power(power); - - if (cast) - { - if (!get_aim_dir(&dir)) return NULL; - - sleep_monster(dir, plev); - } - } - break; - - case 7: - if (name) return _("魔力充填", "Recharging"); - if (desc) return _("杖/魔法棒の充填回数を増やすか、充填中のロッドの充填時間を減らす。", "Recharges staffs, wands or rods."); - - { - int power = plev * 4; - - if (info) return info_power(power); - - if (cast) - { - if (!recharge(power)) return NULL; - } - } - break; - - case 8: - if (name) return _("魔法の地図", "Magic Mapping"); - if (desc) return _("周辺の地形を感知する。", "Maps nearby area."); - - { - int rad = DETECT_RAD_MAP; - - if (info) return info_radius(rad); - - if (cast) - { - map_area(rad); - } - } - break; - - case 9: - if (name) return _("鑑定", "Identify"); - if (desc) return _("アイテムを識別する。", "Identifies an item."); - - { - if (cast) - { - if (!ident_spell(FALSE)) return NULL; - } - } - break; - - case 10: - if (name) return _("スロウ・モンスター", "Slow Monster"); - if (desc) return _("モンスター1体を減速さる。抵抗されると無効。", "Attempts to slow a monster."); - - { - int power = plev; - - if (info) return info_power(power); - - if (cast) - { - if (!get_aim_dir(&dir)) return NULL; - - slow_monster(dir, plev); - } - } - break; - - case 11: - if (name) return _("周辺スリープ", "Mass Sleep"); - if (desc) return _("視界内の全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep all monsters in sight."); - - { - int power = plev; - - if (info) return info_power(power); - - if (cast) - { - sleep_monsters(plev); - } - } - break; - - case 12: - if (name) return _("テレポート・モンスター", "Teleport Away"); - if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted."); - - { - int power = plev; - - if (info) return info_power(power); - - if (cast) - { - if (!get_aim_dir(&dir)) return NULL; - - fire_beam(GF_AWAY_ALL, dir, power); - } - } - break; - - case 13: - if (name) return _("スピード", "Haste Self"); - if (desc) return _("一定時間、加速する。", "Hastes you for a while."); - - { - int base = plev; - int sides = 20 + plev; - - if (info) return info_duration(base, sides); - - if (cast) - { - set_fast(randint1(sides) + base, FALSE); - } - } - break; - - case 14: - if (name) return _("真・感知", "Detection True"); - if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。", - "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity."); - - { - int rad = DETECT_RAD_DEFAULT; - - if (info) return info_radius(rad); - - if (cast) - { - detect_all(rad); - } - } - break; - - case 15: - if (name) return _("真・鑑定", "Identify True"); - if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item."); - - { - if (cast) - { - if (!identify_fully(FALSE)) return NULL; - } - } - break; - - case 16: - if (name) return _("物体と財宝感知", "Detect items and Treasure"); - if (desc) return _("近くの全てのアイテムと財宝を感知する。", "Detects all treasures and items in your vicinity."); - - { - int rad = DETECT_RAD_DEFAULT; - - if (info) return info_radius(rad); - - if (cast) - { - detect_objects_normal(rad); - detect_treasure(rad); - detect_objects_gold(rad); - } - } - break; - - case 17: - if (name) return _("チャーム・モンスター", "Charm Monster"); - if (desc) return _("モンスター1体を魅了する。抵抗されると無効。", "Attempts to charm a monster."); - - { - int power = plev; - - if (info) return info_power(power); - - if (cast) - { - if (!get_aim_dir(&dir)) return NULL; - - charm_monster(dir, power); - } - } - break; - - case 18: - if (name) return _("精神感知", "Sense Minds"); - if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while."); - - { - int base = 25; - int sides = 30; - - if (info) return info_duration(base, sides); - - if (cast) - { - set_tim_esp(randint1(sides) + base, FALSE); - } - } - break; - - case 19: - if (name) return _("街移動", "Teleport to town"); - if (desc) return _("街へ移動する。地上にいるときしか使えない。", "Teleport to a town which you choose in a moment. Can only be used outdoors."); - - { - if (cast) - { - if (!tele_town()) return NULL; - } - } - break; - - case 20: - if (name) return _("自己分析", "Self Knowledge"); - if (desc) return _("現在の自分の状態を完全に知る。", - "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats."); - - { - if (cast) - { - self_knowledge(); - } - } - break; - - case 21: - if (name) return _("テレポート・レベル", "Teleport Level"); - if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment."); - - { - if (cast) - { - if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL; - teleport_level(0); - } - } - break; - - case 22: - if (name) return _("帰還の呪文", "Word of Recall"); - if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。", - "Recalls player from dungeon to town, or from town to the deepest level of dungeon."); - - { - int base = 15; - int sides = 20; - - if (info) return info_delay(base, sides); - - if (cast) - { - if (!word_of_recall()) return NULL; - } - } - break; - - case 23: - if (name) return _("次元の扉", "Dimension Door"); - if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleport to given location."); - - { - POSITION range = plev / 2 + 10; - - if (info) return info_range(range); - - if (cast) - { - msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination.")); - if (!dimension_door()) return NULL; - } - } - break; - - case 24: - if (name) return _("調査", "Probing"); - if (desc) return _("モンスターの属性、残り体力、最大体力、スピード、正体を知る。", - "Proves all monsters' alignment, HP, speed and their true character."); - - { - if (cast) - { - probing(); - } - } - break; - - case 25: - if (name) return _("爆発のルーン", "Explosive Rune"); - if (desc) return _("自分のいる床の上に、モンスターが通ると爆発してダメージを与えるルーンを描く。", - "Sets a glyph under you. The glyph will explode when a monster moves on it."); - - { - int dice = 7; - int sides = 7; - int base = plev; - - if (info) return info_damage(dice, sides, base); - - if (cast) - { - explosive_rune(); - } - } - break; - - case 26: - if (name) return _("念動力", "Telekinesis"); - if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you."); - - { - int weight = plev * 15; - - if (info) return info_weight(weight); - - if (cast) - { - if (!get_aim_dir(&dir)) return NULL; - - fetch(dir, weight, FALSE); - } - } - break; - - case 27: - if (name) return _("千里眼", "Clairvoyance"); - if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。さらに、一定時間テレパシー能力を得る。", - "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while."); - - { - int base = 25; - int sides = 30; - - if (info) return info_duration(base, sides); - - if (cast) - { - chg_virtue(V_KNOWLEDGE, 1); - chg_virtue(V_ENLIGHTEN, 1); - - wiz_lite(FALSE); - - if (!p_ptr->telepathy) - { - set_tim_esp(randint1(sides) + base, FALSE); - } - } - } - break; - - case 28: - if (name) return _("魅了の視線", "Charm monsters"); - if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight."); - - { - int power = plev * 2; - - if (info) return info_power(power); - - if (cast) - { - charm_monsters(power); - } - } - break; - - case 29: - if (name) return _("錬金術", "Alchemy"); - if (desc) return _("アイテム1つをお金に変える。", "Turns an item into 1/3 of its value in gold."); - - { - if (cast) - { - if (!alchemy()) return NULL; - } - } - break; - - case 30: - if (name) return _("怪物追放", "Banishment"); - if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted."); - - { - int power = plev * 4; - - if (info) return info_power(power); - - if (cast) - { - banish_monsters(power); - } - } - break; - - case 31: - if (name) return _("無傷の球", "Globe of Invulnerability"); - if (desc) return _("一定時間、ダメージを受けなくなるバリアを張る。切れた瞬間に少しターンを消費するので注意。", - "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks or duration time is exceeded."); - - { - int base = 4; - - if (info) return info_duration(base, base); - - if (cast) - { - set_invuln(randint1(base) + base, FALSE); - } - } - break; - } - - return ""; -} /*! diff --git a/src/realm-sorcery.c b/src/realm-sorcery.c new file mode 100644 index 000000000..fc1239957 --- /dev/null +++ b/src/realm-sorcery.c @@ -0,0 +1,550 @@ +#include "angband.h" +#include "cmd-spell.h" +#include "selfinfo.h" + +/*! +* @brief åp—̈斂–@‚ÌŠeˆ—‚ðs‚¤ +* @param spell –‚–@ID +* @param mode ˆ—“à—e (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST) +* @return SPELL_NAME / SPELL_DESC / SPELL_INFO Žž‚É‚Í•¶Žš—ñƒ|ƒCƒ“ƒ^‚ð•Ô‚·BSPELL_CASTŽž‚ÍNULL•¶Žš—ñ‚ð•Ô‚·B +*/ +cptr do_sorcery_spell(SPELL_IDX spell, BIT_FLAGS mode) +{ + bool name = (mode == SPELL_NAME) ? TRUE : FALSE; + bool desc = (mode == SPELL_DESC) ? TRUE : FALSE; + bool info = (mode == SPELL_INFO) ? TRUE : FALSE; + bool cast = (mode == SPELL_CAST) ? TRUE : FALSE; + + int dir; + int plev = p_ptr->lev; + + switch (spell) + { + case 0: + if (name) return _("ƒ‚ƒ“ƒXƒ^[Š´’m", "Detect Monsters"); + if (desc) return _("‹ß‚­‚Ì‘S‚Ä‚ÌŒ©‚¦‚郂ƒ“ƒXƒ^[‚ðŠ´’m‚·‚éB", "Detects all monsters in your vicinity unless invisible."); + + { + int rad = DETECT_RAD_DEFAULT; + + if (info) return info_radius(rad); + + if (cast) + { + detect_monsters_normal(rad); + } + } + break; + + case 1: + if (name) return _("ƒVƒ‡[ƒgEƒeƒŒƒ|[ƒg", "Phase Door"); + if (desc) return _("‹ß‹——£‚̃eƒŒƒ|[ƒg‚ð‚·‚éB", "Teleport short distance."); + + { + POSITION range = 10; + + if (info) return info_range(range); + + if (cast) + { + teleport_player(range, 0L); + } + } + break; + + case 2: + if (name) return _("ã©‚Æ”àŠ´’m", "Detect Doors and Traps"); + if (desc) return _("‹ß‚­‚Ì‘S‚Ä‚Ì”à‚Æã©‚ðŠ´’m‚·‚éB", "Detects traps, doors, and stairs in your vicinity."); + + { + int rad = DETECT_RAD_DEFAULT; + + if (info) return info_radius(rad); + + if (cast) + { + detect_traps(rad, TRUE); + detect_doors(rad); + detect_stairs(rad); + } + } + break; + + case 3: + if (name) return _("ƒ‰ƒCƒgEƒGƒŠƒA", "Light Area"); + if (desc) return _("ŒõŒ¹‚ªÆ‚炵‚Ä‚¢‚é”͈͂©•”‰®‘S‘Ì‚ð‰i‹v‚É–¾‚é‚­‚·‚éB", "Lights up nearby area and the inside of a room permanently."); + + { + int dice = 2; + int sides = plev / 2; + int rad = plev / 10 + 1; + + if (info) return info_damage(dice, sides, 0); + + if (cast) + { + lite_area(damroll(dice, sides), rad); + } + } + break; + + case 4: + if (name) return _("ƒpƒjƒbƒNEƒ‚ƒ“ƒXƒ^[", "Confuse Monster"); + if (desc) return _("ƒ‚ƒ“ƒXƒ^[1‘Ì‚ð¬—‚³‚¹‚éB’ïR‚³‚ê‚é‚Æ–³ŒøB", "Attempts to confuse a monster."); + + { + int power = (plev * 3) / 2; + + if (info) return info_power(power); + + if (cast) + { + if (!get_aim_dir(&dir)) return NULL; + + confuse_monster(dir, power); + } + } + break; + + case 5: + if (name) return _("ƒeƒŒƒ|[ƒg", "Teleport"); + if (desc) return _("‰“‹——£‚̃eƒŒƒ|[ƒg‚ð‚·‚éB", "Teleport long distance."); + + { + POSITION range = plev * 5; + + if (info) return info_range(range); + + if (cast) + { + teleport_player(range, 0L); + } + } + break; + + case 6: + if (name) return _("ƒXƒŠ[ƒvEƒ‚ƒ“ƒXƒ^[", "Sleep Monster"); + if (desc) return _("ƒ‚ƒ“ƒXƒ^[1‘̂𖰂点‚éB’ïR‚³‚ê‚é‚Æ–³ŒøB", "Attempts to sleep a monster."); + + { + int power = plev; + + if (info) return info_power(power); + + if (cast) + { + if (!get_aim_dir(&dir)) return NULL; + + sleep_monster(dir, plev); + } + } + break; + + case 7: + if (name) return _("–‚—͏[“U", "Recharging"); + if (desc) return _("ñ/–‚–@–_‚̏[“U‰ñ”‚𑝂₷‚©A[“U’†‚̃ƒbƒh‚̏[“UŽžŠÔ‚ðŒ¸‚ç‚·B", "Recharges staffs, wands or rods."); + + { + int power = plev * 4; + + if (info) return info_power(power); + + if (cast) + { + if (!recharge(power)) return NULL; + } + } + break; + + case 8: + if (name) return _("–‚–@‚Ì’n}", "Magic Mapping"); + if (desc) return _("Žü•Ó‚Ì’nŒ`‚ðŠ´’m‚·‚éB", "Maps nearby area."); + + { + int rad = DETECT_RAD_MAP; + + if (info) return info_radius(rad); + + if (cast) + { + map_area(rad); + } + } + break; + + case 9: + if (name) return _("ŠÓ’è", "Identify"); + if (desc) return _("ƒAƒCƒeƒ€‚ðŽ¯•Ê‚·‚éB", "Identifies an item."); + + { + if (cast) + { + if (!ident_spell(FALSE)) return NULL; + } + } + break; + + case 10: + if (name) return _("ƒXƒƒEEƒ‚ƒ“ƒXƒ^[", "Slow Monster"); + if (desc) return _("ƒ‚ƒ“ƒXƒ^[1‘Ì‚ðŒ¸‘¬‚³‚éB’ïR‚³‚ê‚é‚Æ–³ŒøB", "Attempts to slow a monster."); + + { + int power = plev; + + if (info) return info_power(power); + + if (cast) + { + if (!get_aim_dir(&dir)) return NULL; + + slow_monster(dir, plev); + } + } + break; + + case 11: + if (name) return _("Žü•ÓƒXƒŠ[ƒv", "Mass Sleep"); + if (desc) return _("Ž‹ŠE“à‚Ì‘S‚Ẵ‚ƒ“ƒXƒ^[‚𖰂点‚éB’ïR‚³‚ê‚é‚Æ–³ŒøB", "Attempts to sleep all monsters in sight."); + + { + int power = plev; + + if (info) return info_power(power); + + if (cast) + { + sleep_monsters(plev); + } + } + break; + + case 12: + if (name) return _("ƒeƒŒƒ|[ƒgEƒ‚ƒ“ƒXƒ^[", "Teleport Away"); + if (desc) return _("ƒ‚ƒ“ƒXƒ^[‚ðƒeƒŒƒ|[ƒg‚³‚¹‚éƒr[ƒ€‚ð•ú‚B’ïR‚³‚ê‚é‚Æ–³ŒøB", "Teleports all monsters on the line away unless resisted."); + + { + int power = plev; + + if (info) return info_power(power); + + if (cast) + { + if (!get_aim_dir(&dir)) return NULL; + + fire_beam(GF_AWAY_ALL, dir, power); + } + } + break; + + case 13: + if (name) return _("ƒXƒs[ƒh", "Haste Self"); + if (desc) return _("ˆê’莞ŠÔA‰Á‘¬‚·‚éB", "Hastes you for a while."); + + { + int base = plev; + int sides = 20 + plev; + + if (info) return info_duration(base, sides); + + if (cast) + { + set_fast(randint1(sides) + base, FALSE); + } + } + break; + + case 14: + if (name) return _("^EŠ´’m", "Detection True"); + if (desc) return _("‹ß‚­‚Ì‘S‚Ẵ‚ƒ“ƒXƒ^[A㩁A”àAŠK’iAà•óA‚»‚µ‚ăAƒCƒeƒ€‚ðŠ´’m‚·‚éB", + "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity."); + + { + int rad = DETECT_RAD_DEFAULT; + + if (info) return info_radius(rad); + + if (cast) + { + detect_all(rad); + } + } + break; + + case 15: + if (name) return _("^EŠÓ’è", "Identify True"); + if (desc) return _("ƒAƒCƒeƒ€‚ÌŽ‚”\—Í‚ðŠ®‘S‚É’m‚éB", "*Identifies* an item."); + + { + if (cast) + { + if (!identify_fully(FALSE)) return NULL; + } + } + break; + + case 16: + if (name) return _("•¨‘̂ƍà•óŠ´’m", "Detect items and Treasure"); + if (desc) return _("‹ß‚­‚Ì‘S‚ẴAƒCƒeƒ€‚ƍà•ó‚ðŠ´’m‚·‚éB", "Detects all treasures and items in your vicinity."); + + { + int rad = DETECT_RAD_DEFAULT; + + if (info) return info_radius(rad); + + if (cast) + { + detect_objects_normal(rad); + detect_treasure(rad); + detect_objects_gold(rad); + } + } + break; + + case 17: + if (name) return _("ƒ`ƒƒ[ƒ€Eƒ‚ƒ“ƒXƒ^[", "Charm Monster"); + if (desc) return _("ƒ‚ƒ“ƒXƒ^[1‘Ì‚ð–£—¹‚·‚éB’ïR‚³‚ê‚é‚Æ–³ŒøB", "Attempts to charm a monster."); + + { + int power = plev; + + if (info) return info_power(power); + + if (cast) + { + if (!get_aim_dir(&dir)) return NULL; + + charm_monster(dir, power); + } + } + break; + + case 18: + if (name) return _("¸_Š´’m", "Sense Minds"); + if (desc) return _("ˆê’莞ŠÔAƒeƒŒƒpƒV[”\—͂𓾂éB", "Gives telepathy for a while."); + + { + int base = 25; + int sides = 30; + + if (info) return info_duration(base, sides); + + if (cast) + { + set_tim_esp(randint1(sides) + base, FALSE); + } + } + break; + + case 19: + if (name) return _("ŠXˆÚ“®", "Teleport to town"); + if (desc) return _("ŠX‚ÖˆÚ“®‚·‚éB’nã‚É‚¢‚é‚Æ‚«‚µ‚©Žg‚¦‚È‚¢B", "Teleport to a town which you choose in a moment. Can only be used outdoors."); + + { + if (cast) + { + if (!tele_town()) return NULL; + } + } + break; + + case 20: + if (name) return _("Ž©ŒÈ•ªÍ", "Self Knowledge"); + if (desc) return _("Œ»Ý‚ÌŽ©•ª‚̏ó‘Ô‚ðŠ®‘S‚É’m‚éB", + "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats."); + + { + if (cast) + { + self_knowledge(); + } + } + break; + + case 21: + if (name) return _("ƒeƒŒƒ|[ƒgEƒŒƒxƒ‹", "Teleport Level"); + if (desc) return _("uŽž‚ɏォ‰º‚ÌŠK‚ɃeƒŒƒ|[ƒg‚·‚éB", "Teleport to up or down stairs in a moment."); + + { + if (cast) + { + if (!get_check(_("–{“–‚É‘¼‚ÌŠK‚ɃeƒŒƒ|[ƒg‚µ‚Ü‚·‚©H", "Are you sure? (Teleport Level)"))) return NULL; + teleport_level(0); + } + } + break; + + case 22: + if (name) return _("‹AŠÒ‚ÌŽô•¶", "Word of Recall"); + if (desc) return _("’nã‚É‚¢‚é‚Æ‚«‚̓_ƒ“ƒWƒ‡ƒ“‚̍Ő[ŠK‚ցAƒ_ƒ“ƒWƒ‡ƒ“‚É‚¢‚é‚Æ‚«‚Í’nã‚ւƈړ®‚·‚éB", + "Recalls player from dungeon to town, or from town to the deepest level of dungeon."); + + { + int base = 15; + int sides = 20; + + if (info) return info_delay(base, sides); + + if (cast) + { + if (!word_of_recall()) return NULL; + } + } + break; + + case 23: + if (name) return _("ŽŸŒ³‚Ì”à", "Dimension Door"); + if (desc) return _("’Z‹——£“à‚ÌŽw’肵‚½êŠ‚ɃeƒŒƒ|[ƒg‚·‚éB", "Teleport to given location."); + + { + POSITION range = plev / 2 + 10; + + if (info) return info_range(range); + + if (cast) + { + msg_print(_("ŽŸŒ³‚Ì”à‚ªŠJ‚¢‚½B–Ú“I’n‚ð‘I‚ñ‚ʼnº‚³‚¢B", "You open a dimensional gate. Choose a destination.")); + if (!dimension_door()) return NULL; + } + } + break; + + case 24: + if (name) return _("’²¸", "Probing"); + if (desc) return _("ƒ‚ƒ“ƒXƒ^[‚Ì‘®«AŽc‚è‘̗́AÅ‘å‘̗́AƒXƒs[ƒhA³‘Ì‚ð’m‚éB", + "Proves all monsters' alignment, HP, speed and their true character."); + + { + if (cast) + { + probing(); + } + } + break; + + case 25: + if (name) return _("”š”­‚̃‹[ƒ“", "Explosive Rune"); + if (desc) return _("Ž©•ª‚Ì‚¢‚鏰‚̏ã‚ɁAƒ‚ƒ“ƒXƒ^[‚ª’Ê‚é‚Æ”š”­‚µ‚ă_ƒ[ƒW‚ð—^‚¦‚郋[ƒ“‚ð•`‚­B", + "Sets a glyph under you. The glyph will explode when a monster moves on it."); + + { + int dice = 7; + int sides = 7; + int base = plev; + + if (info) return info_damage(dice, sides, base); + + if (cast) + { + explosive_rune(); + } + } + break; + + case 26: + if (name) return _("”O“®—Í", "Telekinesis"); + if (desc) return _("ƒAƒCƒeƒ€‚ðŽ©•ª‚Ì‘«Œ³‚ÖˆÚ“®‚³‚¹‚éB", "Pulls a distant item close to you."); + + { + int weight = plev * 15; + + if (info) return info_weight(weight); + + if (cast) + { + if (!get_aim_dir(&dir)) return NULL; + + fetch(dir, weight, FALSE); + } + } + break; + + case 27: + if (name) return _("ç—¢Šá", "Clairvoyance"); + if (desc) return _("‚»‚ÌŠK‘S‘Ì‚ð‰i‹v‚ɏƂ炵Aƒ_ƒ“ƒWƒ‡ƒ““à‚·‚ׂẴAƒCƒeƒ€‚ðŠ´’m‚·‚éB‚³‚ç‚ɁAˆê’莞ŠÔƒeƒŒƒpƒV[”\—͂𓾂éB", + "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while."); + + { + int base = 25; + int sides = 30; + + if (info) return info_duration(base, sides); + + if (cast) + { + chg_virtue(V_KNOWLEDGE, 1); + chg_virtue(V_ENLIGHTEN, 1); + + wiz_lite(FALSE); + + if (!p_ptr->telepathy) + { + set_tim_esp(randint1(sides) + base, FALSE); + } + } + } + break; + + case 28: + if (name) return _("–£—¹‚ÌŽ‹ü", "Charm monsters"); + if (desc) return _("Ž‹ŠE“à‚Ì‘S‚Ẵ‚ƒ“ƒXƒ^[‚ð–£—¹‚·‚éB’ïR‚³‚ê‚é‚Æ–³ŒøB", "Attempts to charm all monsters in sight."); + + { + int power = plev * 2; + + if (info) return info_power(power); + + if (cast) + { + charm_monsters(power); + } + } + break; + + case 29: + if (name) return _("˜B‹àp", "Alchemy"); + if (desc) return _("ƒAƒCƒeƒ€1‚Â‚ð‚¨‹à‚É•Ï‚¦‚éB", "Turns an item into 1/3 of its value in gold."); + + { + if (cast) + { + if (!alchemy()) return NULL; + } + } + break; + + case 30: + if (name) return _("‰ö•¨’Ç•ú", "Banishment"); + if (desc) return _("Ž‹ŠE“à‚Ì‘S‚Ẵ‚ƒ“ƒXƒ^[‚ðƒeƒŒƒ|[ƒg‚³‚¹‚éB’ïR‚³‚ê‚é‚Æ–³ŒøB", "Teleports all monsters in sight away unless resisted."); + + { + int power = plev * 4; + + if (info) return info_power(power); + + if (cast) + { + banish_monsters(power); + } + } + break; + + case 31: + if (name) return _("–³‚Ì‹…", "Globe of Invulnerability"); + if (desc) return _("ˆê’莞ŠÔAƒ_ƒ[ƒW‚ðŽó‚¯‚È‚­‚È‚éƒoƒŠƒA‚𒣂éBØ‚ꂽuŠÔ‚ɏ­‚µƒ^[ƒ“‚ðÁ”ï‚·‚é‚Ì‚Å’ˆÓB", + "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks or duration time is exceeded."); + + { + int base = 4; + + if (info) return info_duration(base, base); + + if (cast) + { + set_invuln(randint1(base) + base, FALSE); + } + } + break; + } + + return ""; +} diff --git a/src/realm-sorcery.h b/src/realm-sorcery.h new file mode 100644 index 000000000..f77e6d8a6 --- /dev/null +++ b/src/realm-sorcery.h @@ -0,0 +1 @@ +extern cptr do_sorcery_spell(SPELL_IDX spell, BIT_FLAGS mode); -- 2.11.0