From bc3e207b56e6f349ae254f0c2d2d6e343faae0ca Mon Sep 17 00:00:00 2001 From: Deskull Date: Thu, 13 Sep 2018 20:44:30 +0900 Subject: [PATCH] =?utf8?q?[Refactor]=20#37353=E3=80=80=E6=82=AA=E9=AD=94?= =?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-daemon.c/h=20=E3=81=B8=E5=88=86?= =?utf8?q?=E9=9B=A2=E3=80=82=20Separate=20daemon=20realm=20process=20from?= =?utf8?q?=20cmd-spell.c=20to=20realm-daemon.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 | 618 +------------------- src/realm-daemon.c | 621 +++++++++++++++++++++ src/realm-daemon.h | 2 + 5 files changed, 632 insertions(+), 617 deletions(-) create mode 100644 src/realm-daemon.c create mode 100644 src/realm-daemon.h diff --git a/Hengband_vcs2015/Hengband/Hengband.vcxproj b/Hengband_vcs2015/Hengband/Hengband.vcxproj index f21c3006b..cca9a7a2d 100644 --- a/Hengband_vcs2015/Hengband/Hengband.vcxproj +++ b/Hengband_vcs2015/Hengband/Hengband.vcxproj @@ -145,6 +145,7 @@ + @@ -259,6 +260,7 @@ + diff --git a/Hengband_vcs2015/Hengband/Hengband.vcxproj.filters b/Hengband_vcs2015/Hengband/Hengband.vcxproj.filters index ddba36451..6130e904e 100644 --- a/Hengband_vcs2015/Hengband/Hengband.vcxproj.filters +++ b/Hengband_vcs2015/Hengband/Hengband.vcxproj.filters @@ -280,6 +280,9 @@ Source + + Source + @@ -433,6 +436,9 @@ Header + + Header + diff --git a/src/cmd-spell.c b/src/cmd-spell.c index 0fd8d75ce..fc4e183b9 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-craft.h" +#include "realm-daemon.h" #include "realm-death.h" #include "realm-life.h" #include "realm-nature.h" @@ -236,623 +237,6 @@ void stop_singing(void) p_ptr->redraw |= (PR_STATUS); } - -/*! - * @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_daemon_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; - static const char s_dam[] = _("損傷:", "dam "); - - int dir; - int plev = p_ptr->lev; - - switch (spell) - { - case 0: - if (name) return _("マジック・ミサイル", "Magic Missile"); - if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic."); - - { - int dice = 3 + (plev - 1) / 5; - int sides = 4; - - if (info) return info_damage(dice, sides, 0); - - if (cast) - { - if (!get_aim_dir(&dir)) return NULL; - - fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides)); - } - } - break; - - case 1: - if (name) return _("無生命感知", "Detect Unlife"); - if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity."); - - { - int rad = DETECT_RAD_DEFAULT; - - if (info) return info_radius(rad); - - if (cast) - { - detect_monsters_nonliving(rad); - } - } - break; - - case 2: - if (name) return _("邪なる祝福", "Evil Bless"); - if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives bonus to hit and AC for a few turns."); - - { - int base = 12; - - if (info) return info_duration(base, base); - - if (cast) - { - set_blessed(randint1(base) + base, FALSE); - } - } - break; - - case 3: - if (name) return _("耐火炎", "Resist Fire"); - if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。", - "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances."); - - { - int base = 20; - - if (info) return info_duration(base, base); - - if (cast) - { - set_oppose_fire(randint1(base) + base, FALSE); - } - } - break; - - case 4: - if (name) return _("恐慌", "Horrify"); - if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster."); - - { - int power = plev; - - if (info) return info_power(power); - - if (cast) - { - if (!get_aim_dir(&dir)) return NULL; - - fear_monster(dir, power); - stun_monster(dir, power); - } - } - break; - - case 5: - if (name) return _("地獄の矢", "Nether Bolt"); - if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether."); - - { - int dice = 6 + (plev - 5) / 4; - int sides = 8; - - if (info) return info_damage(dice, sides, 0); - - if (cast) - { - if (!get_aim_dir(&dir)) return NULL; - - fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides)); - } - } - break; - - case 6: - if (name) return _("古代の死霊召喚", "Summon Manes"); - if (desc) return _("古代の死霊を召喚する。", "Summons a manes."); - - { - if (cast) - { - if (!summon_specific(-1, p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET))) - { - msg_print(_("古代の死霊は現れなかった。", "No Manes arrive.")); - } - } - } - break; - - case 7: - if (name) return _("地獄の焔", "Hellish Flame"); - if (desc) return _("邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。", - "Fires a ball of evil power. Hurts good monsters greatly."); - - { - int dice = 3; - int sides = 6; - int rad = (plev < 30) ? 2 : 3; - int base; - - if (p_ptr->pclass == CLASS_MAGE || - p_ptr->pclass == CLASS_HIGH_MAGE || - p_ptr->pclass == CLASS_SORCERER) - base = plev + plev / 2; - else - base = plev + plev / 4; - - - if (info) return info_damage(dice, sides, base); - - if (cast) - { - if (!get_aim_dir(&dir)) return NULL; - - fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides) + base, rad); - } - } - break; - - case 8: - if (name) return _("デーモン支配", "Dominate Demon"); - if (desc) return _("悪魔1体を魅了する。抵抗されると無効", "Attempts to charm a demon."); - - { - int power = plev; - - if (info) return info_power(power); - - if (cast) - { - if (!get_aim_dir(&dir)) return NULL; - - control_one_demon(dir, power); - } - } - break; - - case 9: - if (name) return _("ビジョン", "Vision"); - if (desc) return _("周辺の地形を感知する。", "Maps nearby area."); - - { - int rad = DETECT_RAD_MAP; - - if (info) return info_radius(rad); - - if (cast) - { - map_area(rad); - } - } - break; - - case 10: - if (name) return _("耐地獄", "Resist Nether"); - if (desc) return _("一定時間、地獄への耐性を得る。", "Gives resistance to nether for a while."); - - { - int base = 20; - - if (info) return info_duration(base, base); - - if (cast) - { - set_tim_res_nether(randint1(base) + base, FALSE); - } - } - break; - - case 11: - if (name) return _("プラズマ・ボルト", "Plasma bolt"); - if (desc) return _("プラズマのボルトもしくはビームを放つ。", "Fires a bolt or beam of plasma."); - - { - int dice = 11 + (plev - 5) / 4; - int sides = 8; - - if (info) return info_damage(dice, sides, 0); - - if (cast) - { - if (!get_aim_dir(&dir)) return NULL; - - fire_bolt_or_beam(beam_chance(), GF_PLASMA, dir, damroll(dice, sides)); - } - } - break; - - case 12: - if (name) return _("ファイア・ボール", "Fire Ball"); - if (desc) return _("炎の球を放つ。", "Fires a ball of fire."); - - { - HIT_POINT dam = plev + 55; - int rad = 2; - - if (info) return info_damage(0, 0, dam); - - if (cast) - { - if (!get_aim_dir(&dir)) return NULL; - - fire_ball(GF_FIRE, dir, dam, rad); - } - } - break; - - case 13: - if (name) return _("炎の刃", "Fire Branding"); - if (desc) return _("武器に炎の属性をつける。", "Makes current weapon fire branded."); - - { - if (cast) - { - brand_weapon(1); - } - } - break; - - case 14: - if (name) return _("地獄球", "Nether Ball"); - if (desc) return _("大きな地獄の球を放つ。", "Fires a huge ball of nether."); - - { - HIT_POINT dam = plev * 3 / 2 + 100; - int rad = plev / 20 + 2; - - if (info) return info_damage(0, 0, dam); - - if (cast) - { - if (!get_aim_dir(&dir)) return NULL; - - fire_ball(GF_NETHER, dir, dam, rad); - } - } - break; - - case 15: - if (name) return _("デーモン召喚", "Summon Demon"); - if (desc) return _("悪魔1体を召喚する。", "Summons a demon."); - - { - if (cast) - { - bool pet = !one_in_(3); - u32b flg = 0L; - - if (pet) flg |= PM_FORCE_PET; - else flg |= PM_NO_PET; - if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP; - - if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, plev*2/3+randint1(plev/2), SUMMON_DEMON, flg)) - { - msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone.")); - - if (pet) - { - msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'")); - } - else - { - msg_print(_("「卑しき者よ、我は汝の下僕にあらず! お前の魂を頂くぞ!」", - "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'")); - } - } - else - { - msg_print(_("悪魔は現れなかった。", "No demons arrive.")); - } - break; - } - } - break; - - case 16: - if (name) return _("悪魔の目", "Devilish Eye"); - if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while."); - - { - int base = 30; - int sides = 25; - - if (info) return info_duration(base, sides); - - if (cast) - { - set_tim_esp(randint1(sides) + base, FALSE); - } - } - break; - - case 17: - if (name) return _("悪魔のクローク", "Devil Cloak"); - if (desc) return _("恐怖を取り除き、一定時間、炎と冷気の耐性、炎のオーラを得る。耐性は装備による耐性に累積する。", - "Removes fear. Gives resistance to fire and cold, and aura of fire. These resistances can be added to which from equipment for more powerful resistances."); - - { - TIME_EFFECT base = 20; - - if (info) return info_duration(base, base); - - if (cast) - { - TIME_EFFECT dur = randint1(base) + base; - - set_oppose_fire(dur, FALSE); - set_oppose_cold(dur, FALSE); - set_tim_sh_fire(dur, FALSE); - set_afraid(0); - break; - } - } - break; - - case 18: - if (name) return _("溶岩流", "The Flow of Lava"); - if (desc) return _("自分を中心とした炎の球を作り出し、床を溶岩に変える。", - "Generates a ball of fire centered on you which transforms floors to magma."); - - { - HIT_POINT dam = (55 + plev) * 2; - int rad = 3; - - if (info) return info_damage(0, 0, dam/2); - - if (cast) - { - fire_ball(GF_FIRE, 0, dam, rad); - fire_ball_hide(GF_LAVA_FLOW, 0, 2 + randint1(2), rad); - } - } - break; - - case 19: - if (name) return _("プラズマ球", "Plasma Ball"); - if (desc) return _("プラズマの球を放つ。", "Fires a ball of plasma."); - - { - HIT_POINT dam = plev * 3 / 2 + 80; - int rad = 2 + plev / 40; - - if (info) return info_damage(0, 0, dam); - - if (cast) - { - if (!get_aim_dir(&dir)) return NULL; - - fire_ball(GF_PLASMA, dir, dam, rad); - } - } - break; - - case 20: - if (name) return _("悪魔変化", "Polymorph Demon"); - if (desc) return _("一定時間、悪魔に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔としての能力を得る。", - "Mimic a demon for a while. Loses abilities of original race and gets abilities as a demon."); - - { - int base = 10 + plev / 2; - - if (info) return info_duration(base, base); - - if (cast) - { - set_mimic(base + randint1(base), MIMIC_DEMON, FALSE); - } - } - break; - - case 21: - if (name) return _("地獄の波動", "Nather Wave"); - if (desc) return _("視界内の全てのモンスターにダメージを与える。善良なモンスターに特に大きなダメージを与える。", - "Damages all monsters in sight. Hurts good monsters greatly."); - - { - int sides1 = plev * 2; - int sides2 = plev * 2; - - if (info) return format("%sd%d+d%d", s_dam, sides1, sides2); - - if (cast) - { - dispel_monsters(randint1(sides1)); - dispel_good(randint1(sides2)); - } - } - break; - - case 22: - if (name) return _("サキュバスの接吻", "Kiss of Succubus"); - if (desc) return _("因果混乱の球を放つ。", "Fires a ball of nexus."); - - { - HIT_POINT dam = 100 + plev * 2; - int rad = 4; - - if (info) return info_damage(0, 0, dam); - - if (cast) - { - if (!get_aim_dir(&dir)) return NULL; - fire_ball(GF_NEXUS, dir, dam, rad); - } - } - break; - - case 23: - if (name) return _("破滅の手", "Doom Hand"); - if (desc) return _("破滅の手を放つ。食らったモンスターはそのときのHPの半分前後のダメージを受ける。", "Attempts to make a monster's HP almost half."); - - { - if (cast) - { - if (!get_aim_dir(&dir)) - return NULL; - else - msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!")); - - fire_ball_hide(GF_HAND_DOOM, dir, plev * 2, 0); - } - } - break; - - case 24: - if (name) return _("士気高揚", "Raise the Morale"); - if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while."); - - { - int base = 25; - - if (info) return info_duration(base, base); - - if (cast) - { - set_hero(randint1(base) + base, FALSE); - hp_player(10); - set_afraid(0); - } - } - break; - - case 25: - if (name) return _("不滅の肉体", "Immortal Body"); - if (desc) return _("一定時間、時間逆転への耐性を得る。", "Gives resistance to time for a while."); - - { - int base = 20; - - if (info) return info_duration(base, base); - - if (cast) - { - set_tim_res_time(randint1(base)+base, FALSE); - } - } - break; - - case 26: - if (name) return _("狂気の円環", "Insanity Circle"); - if (desc) return _("自分を中心としたカオスの球、混乱の球を発生させ、近くのモンスターを魅了する。", - "Generate balls of chaos, confusion and charm centered on you."); - - { - HIT_POINT dam = 50 + plev; - int power = 20 + plev; - int rad = 3 + plev / 20; - - if (info) return format("%s%d+%d", s_dam, dam/2, dam/2); - - if (cast) - { - fire_ball(GF_CHAOS, 0, dam, rad); - fire_ball(GF_CONFUSION, 0, dam, rad); - fire_ball(GF_CHARM, 0, power, rad); - } - } - break; - - case 27: - if (name) return _("ペット爆破", "Explode Pets"); - if (desc) return _("全てのペットを強制的に爆破させる。", "Makes all pets explode."); - - { - if (cast) - { - discharge_minion(); - } - } - break; - - case 28: - if (name) return _("グレーターデーモン召喚", "Summon Greater Demon"); - if (desc) return _("上級デーモンを召喚する。召喚するには人間('p','h','t'で表されるモンスター)の死体を捧げなければならない。", - "Summons greater demon. It need to sacrifice a corpse of human ('p','h' or 't')."); - - { - if (cast) - { - if (!cast_summon_greater_demon()) return NULL; - } - } - break; - - case 29: - if (name) return _("地獄嵐", "Nether Storm"); - if (desc) return _("超巨大な地獄の球を放つ。", "Generate a huge ball of nether."); - - { - HIT_POINT dam = plev * 15; - int rad = plev / 5; - - if (info) return info_damage(0, 0, dam); - - if (cast) - { - if (!get_aim_dir(&dir)) return NULL; - - fire_ball(GF_NETHER, dir, dam, rad); - } - } - break; - - case 30: - if (name) return _("血の呪い", "Bloody Curse"); - if (desc) return _("自分がダメージを受けることによって対象に呪いをかけ、ダメージを与え様々な効果を引き起こす。", - "Puts blood curse which damages and causes various effects on a monster. You also take damage."); - - { - HIT_POINT dam = 600; - int rad = 0; - - if (info) return info_damage(0, 0, dam); - - if (cast) - { - if (!get_aim_dir(&dir)) return NULL; - - fire_ball_hide(GF_BLOOD_CURSE, dir, dam, rad); - take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("血の呪い", "Blood curse"), -1); - } - } - break; - - case 31: - if (name) return _("魔王変化", "Polymorph Demonlord"); - if (desc) return _("悪魔の王に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔の王としての能力を得、壁を破壊しながら歩く。", - "Mimic a demon lord for a while. Loses abilities of original race and gets great abilities as a demon lord. Even hard walls can't stop your walking."); - - { - int base = 15; - - if (info) return info_duration(base, base); - - if (cast) - { - set_mimic(base + randint1(base), MIMIC_DEMON_LORD, FALSE); - } - } - break; - } - - return ""; -} - /*! * @brief 破邪領域魔法の各処理を行う * @param spell 魔法ID diff --git a/src/realm-daemon.c b/src/realm-daemon.c new file mode 100644 index 000000000..c26110905 --- /dev/null +++ b/src/realm-daemon.c @@ -0,0 +1,621 @@ + +#include "angband.h" +#include "cmd-spell.h" +#include "spells-summon.h" + +/*! +* @brief ˆ«–‚—̈斂–@‚ÌŠ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_daemon_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; + static const char s_dam[] = _("‘¹:", "dam "); + + int dir; + int plev = p_ptr->lev; + + switch (spell) + { + case 0: + if (name) return _("ƒ}ƒWƒbƒNEƒ~ƒTƒCƒ‹", "Magic Missile"); + if (desc) return _("Žã‚¢–‚–@‚Ì–î‚ð•ú‚B", "Fires a weak bolt of magic."); + + { + int dice = 3 + (plev - 1) / 5; + int sides = 4; + + if (info) return info_damage(dice, sides, 0); + + if (cast) + { + if (!get_aim_dir(&dir)) return NULL; + + fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides)); + } + } + break; + + case 1: + if (name) return _("–³¶–½Š´’m", "Detect Unlife"); + if (desc) return _("‹ß‚­‚̐¶–½‚Ì‚È‚¢ƒ‚ƒ“ƒXƒ^[‚ðŠ´’m‚·‚éB", "Detects all nonliving monsters in your vicinity."); + + { + int rad = DETECT_RAD_DEFAULT; + + if (info) return info_radius(rad); + + if (cast) + { + detect_monsters_nonliving(rad); + } + } + break; + + case 2: + if (name) return _("Ž×‚È‚éj•Ÿ", "Evil Bless"); + if (desc) return _("ˆê’莞ŠÔA–½’†—¦‚ÆAC‚Ƀ{[ƒiƒX‚𓾂éB", "Gives bonus to hit and AC for a few turns."); + + { + int base = 12; + + if (info) return info_duration(base, base); + + if (cast) + { + set_blessed(randint1(base) + base, FALSE); + } + } + break; + + case 3: + if (name) return _("‘ωΉŠ", "Resist Fire"); + if (desc) return _("ˆê’莞ŠÔA‰Š‚ւ̑ϐ«‚𓾂éB‘•”õ‚É‚æ‚é‘ϐ«‚ɗݐς·‚éB", + "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances."); + + { + int base = 20; + + if (info) return info_duration(base, base); + + if (cast) + { + set_oppose_fire(randint1(base) + base, FALSE); + } + } + break; + + case 4: + if (name) return _("‹°Q", "Horrify"); + if (desc) return _("ƒ‚ƒ“ƒXƒ^[1‘Ì‚ð‹°•|‚³‚¹AžNžO‚³‚¹‚éB’ïR‚³‚ê‚é‚Æ–³ŒøB", "Attempts to scare and stun a monster."); + + { + int power = plev; + + if (info) return info_power(power); + + if (cast) + { + if (!get_aim_dir(&dir)) return NULL; + + fear_monster(dir, power); + stun_monster(dir, power); + } + } + break; + + case 5: + if (name) return _("’n–‚Ì–î", "Nether Bolt"); + if (desc) return _("’n–‚̃{ƒ‹ƒg‚à‚µ‚­‚̓r[ƒ€‚ð•ú‚B", "Fires a bolt or beam of nether."); + + { + int dice = 6 + (plev - 5) / 4; + int sides = 8; + + if (info) return info_damage(dice, sides, 0); + + if (cast) + { + if (!get_aim_dir(&dir)) return NULL; + + fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides)); + } + } + break; + + case 6: + if (name) return _("ŒÃ‘ã‚ÌŽ€—쏢Š«", "Summon Manes"); + if (desc) return _("ŒÃ‘ã‚ÌŽ€—ì‚ð¢Š«‚·‚éB", "Summons a manes."); + + { + if (cast) + { + if (!summon_specific(-1, p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET))) + { + msg_print(_("ŒÃ‘ã‚ÌŽ€—ì‚ÍŒ»‚ê‚È‚©‚Á‚½B", "No Manes arrive.")); + } + } + } + break; + + case 7: + if (name) return _("’n–‚̉‹", "Hellish Flame"); + if (desc) return _("Ž×ˆ«‚È—Í‚ðŽ‚Âƒ{[ƒ‹‚ð•ú‚B‘P—ǂȃ‚ƒ“ƒXƒ^[‚É‚Í‘å‚«‚ȃ_ƒ[ƒW‚ð—^‚¦‚éB", + "Fires a ball of evil power. Hurts good monsters greatly."); + + { + int dice = 3; + int sides = 6; + int rad = (plev < 30) ? 2 : 3; + int base; + + if (p_ptr->pclass == CLASS_MAGE || + p_ptr->pclass == CLASS_HIGH_MAGE || + p_ptr->pclass == CLASS_SORCERER) + base = plev + plev / 2; + else + base = plev + plev / 4; + + + if (info) return info_damage(dice, sides, base); + + if (cast) + { + if (!get_aim_dir(&dir)) return NULL; + + fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides) + base, rad); + } + } + break; + + case 8: + if (name) return _("ƒf[ƒ‚ƒ“Žx”z", "Dominate Demon"); + if (desc) return _("ˆ«–‚1‘Ì‚ð–£—¹‚·‚éB’ïR‚³‚ê‚é‚Æ–³Œø", "Attempts to charm a demon."); + + { + int power = plev; + + if (info) return info_power(power); + + if (cast) + { + if (!get_aim_dir(&dir)) return NULL; + + control_one_demon(dir, power); + } + } + break; + + case 9: + if (name) return _("ƒrƒWƒ‡ƒ“", "Vision"); + 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 10: + if (name) return _("‘Ï’n–", "Resist Nether"); + if (desc) return _("ˆê’莞ŠÔA’n–‚ւ̑ϐ«‚𓾂éB", "Gives resistance to nether for a while."); + + { + int base = 20; + + if (info) return info_duration(base, base); + + if (cast) + { + set_tim_res_nether(randint1(base) + base, FALSE); + } + } + break; + + case 11: + if (name) return _("ƒvƒ‰ƒYƒ}Eƒ{ƒ‹ƒg", "Plasma bolt"); + if (desc) return _("ƒvƒ‰ƒYƒ}‚̃{ƒ‹ƒg‚à‚µ‚­‚̓r[ƒ€‚ð•ú‚B", "Fires a bolt or beam of plasma."); + + { + int dice = 11 + (plev - 5) / 4; + int sides = 8; + + if (info) return info_damage(dice, sides, 0); + + if (cast) + { + if (!get_aim_dir(&dir)) return NULL; + + fire_bolt_or_beam(beam_chance(), GF_PLASMA, dir, damroll(dice, sides)); + } + } + break; + + case 12: + if (name) return _("ƒtƒ@ƒCƒAEƒ{[ƒ‹", "Fire Ball"); + if (desc) return _("‰Š‚Ì‹…‚ð•ú‚B", "Fires a ball of fire."); + + { + HIT_POINT dam = plev + 55; + int rad = 2; + + if (info) return info_damage(0, 0, dam); + + if (cast) + { + if (!get_aim_dir(&dir)) return NULL; + + fire_ball(GF_FIRE, dir, dam, rad); + } + } + break; + + case 13: + if (name) return _("‰Š‚̐n", "Fire Branding"); + if (desc) return _("•Ší‚ɉŠ‚Ì‘®«‚ð‚‚¯‚éB", "Makes current weapon fire branded."); + + { + if (cast) + { + brand_weapon(1); + } + } + break; + + case 14: + if (name) return _("’n–‹…", "Nether Ball"); + if (desc) return _("‘å‚«‚È’n–‚Ì‹…‚ð•ú‚B", "Fires a huge ball of nether."); + + { + HIT_POINT dam = plev * 3 / 2 + 100; + int rad = plev / 20 + 2; + + if (info) return info_damage(0, 0, dam); + + if (cast) + { + if (!get_aim_dir(&dir)) return NULL; + + fire_ball(GF_NETHER, dir, dam, rad); + } + } + break; + + case 15: + if (name) return _("ƒf[ƒ‚ƒ“¢Š«", "Summon Demon"); + if (desc) return _("ˆ«–‚1‘Ì‚ð¢Š«‚·‚éB", "Summons a demon."); + + { + if (cast) + { + bool pet = !one_in_(3); + u32b flg = 0L; + + if (pet) flg |= PM_FORCE_PET; + else flg |= PM_NO_PET; + if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP; + + if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, plev * 2 / 3 + randint1(plev / 2), SUMMON_DEMON, flg)) + { + msg_print(_("—°‰©‚̈«L‚ª[–ž‚µ‚½B", "The area fills with a stench of sulphur and brimstone.")); + + if (pet) + { + msg_print(_("u‚²—p‚Å‚²‚´‚¢‚Ü‚·‚©A‚²Žål—lv", "'What is thy bidding... Master?'")); + } + else + { + msg_print(_("u”Ú‚µ‚«ŽÒ‚æA‰ä‚Í“ð‚̉º–l‚É‚ ‚炸I ‚¨‘O‚̍°‚𒸂­‚¼Iv", + "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'")); + } + } + else + { + msg_print(_("ˆ«–‚‚ÍŒ»‚ê‚È‚©‚Á‚½B", "No demons arrive.")); + } + break; + } + } + break; + + case 16: + if (name) return _("ˆ«–‚‚Ì–Ú", "Devilish Eye"); + if (desc) return _("ˆê’莞ŠÔAƒeƒŒƒpƒV[”\—͂𓾂éB", "Gives telepathy for a while."); + + { + int base = 30; + int sides = 25; + + if (info) return info_duration(base, sides); + + if (cast) + { + set_tim_esp(randint1(sides) + base, FALSE); + } + } + break; + + case 17: + if (name) return _("ˆ«–‚‚̃Nƒ[ƒN", "Devil Cloak"); + if (desc) return _("‹°•|‚ðŽæ‚菜‚«Aˆê’莞ŠÔA‰Š‚Æ—â‹C‚̑ϐ«A‰Š‚̃I[ƒ‰‚𓾂éB‘ϐ«‚Í‘•”õ‚É‚æ‚é‘ϐ«‚ɗݐς·‚éB", + "Removes fear. Gives resistance to fire and cold, and aura of fire. These resistances can be added to which from equipment for more powerful resistances."); + + { + TIME_EFFECT base = 20; + + if (info) return info_duration(base, base); + + if (cast) + { + TIME_EFFECT dur = randint1(base) + base; + + set_oppose_fire(dur, FALSE); + set_oppose_cold(dur, FALSE); + set_tim_sh_fire(dur, FALSE); + set_afraid(0); + break; + } + } + break; + + case 18: + if (name) return _("—nŠâ—¬", "The Flow of Lava"); + if (desc) return _("Ž©•ª‚𒆐S‚Æ‚µ‚½‰Š‚Ì‹…‚ðì‚èo‚µA°‚ð—nŠâ‚É•Ï‚¦‚éB", + "Generates a ball of fire centered on you which transforms floors to magma."); + + { + HIT_POINT dam = (55 + plev) * 2; + int rad = 3; + + if (info) return info_damage(0, 0, dam / 2); + + if (cast) + { + fire_ball(GF_FIRE, 0, dam, rad); + fire_ball_hide(GF_LAVA_FLOW, 0, 2 + randint1(2), rad); + } + } + break; + + case 19: + if (name) return _("ƒvƒ‰ƒYƒ}‹…", "Plasma Ball"); + if (desc) return _("ƒvƒ‰ƒYƒ}‚Ì‹…‚ð•ú‚B", "Fires a ball of plasma."); + + { + HIT_POINT dam = plev * 3 / 2 + 80; + int rad = 2 + plev / 40; + + if (info) return info_damage(0, 0, dam); + + if (cast) + { + if (!get_aim_dir(&dir)) return NULL; + + fire_ball(GF_PLASMA, dir, dam, rad); + } + } + break; + + case 20: + if (name) return _("ˆ«–‚•Ï‰»", "Polymorph Demon"); + if (desc) return _("ˆê’莞ŠÔAˆ«–‚‚ɕω»‚·‚éB•Ï‰»‚µ‚Ä‚¢‚éŠÔ‚Í–{—ˆ‚ÌŽí‘°‚Ì”\—Í‚ðŽ¸‚¢A‘ã‚í‚è‚Ɉ«–‚‚Æ‚µ‚Ä‚Ì”\—͂𓾂éB", + "Mimic a demon for a while. Loses abilities of original race and gets abilities as a demon."); + + { + int base = 10 + plev / 2; + + if (info) return info_duration(base, base); + + if (cast) + { + set_mimic(base + randint1(base), MIMIC_DEMON, FALSE); + } + } + break; + + case 21: + if (name) return _("’n–‚Ì”g“®", "Nather Wave"); + if (desc) return _("Ž‹ŠE“à‚Ì‘S‚Ẵ‚ƒ“ƒXƒ^[‚Ƀ_ƒ[ƒW‚ð—^‚¦‚éB‘P—ǂȃ‚ƒ“ƒXƒ^[‚É“Á‚É‘å‚«‚ȃ_ƒ[ƒW‚ð—^‚¦‚éB", + "Damages all monsters in sight. Hurts good monsters greatly."); + + { + int sides1 = plev * 2; + int sides2 = plev * 2; + + if (info) return format("%sd%d+d%d", s_dam, sides1, sides2); + + if (cast) + { + dispel_monsters(randint1(sides1)); + dispel_good(randint1(sides2)); + } + } + break; + + case 22: + if (name) return _("ƒTƒLƒ…ƒoƒX‚̐ڕ«", "Kiss of Succubus"); + if (desc) return _("ˆö‰Ê¬—‚Ì‹…‚ð•ú‚B", "Fires a ball of nexus."); + + { + HIT_POINT dam = 100 + plev * 2; + int rad = 4; + + if (info) return info_damage(0, 0, dam); + + if (cast) + { + if (!get_aim_dir(&dir)) return NULL; + fire_ball(GF_NEXUS, dir, dam, rad); + } + } + break; + + case 23: + if (name) return _("”j–Å‚ÌŽè", "Doom Hand"); + if (desc) return _("”j–Å‚ÌŽè‚ð•ú‚BH‚ç‚Á‚½ƒ‚ƒ“ƒXƒ^[‚Í‚»‚Ì‚Æ‚«‚ÌHP‚Ì”¼•ª‘OŒã‚̃_ƒ[ƒW‚ðŽó‚¯‚éB", "Attempts to make a monster's HP almost half."); + + { + if (cast) + { + if (!get_aim_dir(&dir)) + return NULL; + else + msg_print(_("<”j–Å‚ÌŽè>‚ð•ú‚Á‚½I", "You invoke the Hand of Doom!")); + + fire_ball_hide(GF_HAND_DOOM, dir, plev * 2, 0); + } + } + break; + + case 24: + if (name) return _("Žm‹C‚—g", "Raise the Morale"); + if (desc) return _("ˆê’莞ŠÔAƒq[ƒ[‹C•ª‚É‚È‚éB", "Removes fear, and gives bonus to hit and 10 more HP for a while."); + + { + int base = 25; + + if (info) return info_duration(base, base); + + if (cast) + { + set_hero(randint1(base) + base, FALSE); + hp_player(10); + set_afraid(0); + } + } + break; + + case 25: + if (name) return _("•s–Å‚Ì“÷‘Ì", "Immortal Body"); + if (desc) return _("ˆê’莞ŠÔAŽžŠÔ‹t“]‚ւ̑ϐ«‚𓾂éB", "Gives resistance to time for a while."); + + { + int base = 20; + + if (info) return info_duration(base, base); + + if (cast) + { + set_tim_res_time(randint1(base) + base, FALSE); + } + } + break; + + case 26: + if (name) return _("‹¶‹C‚̉~ŠÂ", "Insanity Circle"); + if (desc) return _("Ž©•ª‚𒆐S‚Æ‚µ‚½ƒJƒIƒX‚Ì‹…A¬—‚Ì‹…‚𔭐¶‚³‚¹A‹ß‚­‚̃‚ƒ“ƒXƒ^[‚ð–£—¹‚·‚éB", + "Generate balls of chaos, confusion and charm centered on you."); + + { + HIT_POINT dam = 50 + plev; + int power = 20 + plev; + int rad = 3 + plev / 20; + + if (info) return format("%s%d+%d", s_dam, dam / 2, dam / 2); + + if (cast) + { + fire_ball(GF_CHAOS, 0, dam, rad); + fire_ball(GF_CONFUSION, 0, dam, rad); + fire_ball(GF_CHARM, 0, power, rad); + } + } + break; + + case 27: + if (name) return _("ƒyƒbƒg”š”j", "Explode Pets"); + if (desc) return _("‘S‚Ẵyƒbƒg‚ð‹­§“I‚É”š”j‚³‚¹‚éB", "Makes all pets explode."); + + { + if (cast) + { + discharge_minion(); + } + } + break; + + case 28: + if (name) return _("ƒOƒŒ[ƒ^[ƒf[ƒ‚ƒ“¢Š«", "Summon Greater Demon"); + if (desc) return _("ã‹‰ƒf[ƒ‚ƒ“‚ð¢Š«‚·‚éB¢Š«‚·‚é‚ɂ͐lŠÔ('p','h','t'‚Å•\‚³‚ê‚郂ƒ“ƒXƒ^[)‚ÌŽ€‘Ì‚ð•ù‚°‚È‚¯‚ê‚΂Ȃç‚È‚¢B", + "Summons greater demon. It need to sacrifice a corpse of human ('p','h' or 't')."); + + { + if (cast) + { + if (!cast_summon_greater_demon()) return NULL; + } + } + break; + + case 29: + if (name) return _("’n–—’", "Nether Storm"); + if (desc) return _("’´‹‘å‚È’n–‚Ì‹…‚ð•ú‚B", "Generate a huge ball of nether."); + + { + HIT_POINT dam = plev * 15; + int rad = plev / 5; + + if (info) return info_damage(0, 0, dam); + + if (cast) + { + if (!get_aim_dir(&dir)) return NULL; + + fire_ball(GF_NETHER, dir, dam, rad); + } + } + break; + + case 30: + if (name) return _("ŒŒ‚ÌŽô‚¢", "Bloody Curse"); + if (desc) return _("Ž©•ª‚ªƒ_ƒ[ƒW‚ðŽó‚¯‚邱‚Æ‚É‚æ‚Á‚đΏۂɎô‚¢‚ð‚©‚¯Aƒ_ƒ[ƒW‚ð—^‚¦—lX‚ÈŒø‰Ê‚ðˆø‚«‹N‚±‚·B", + "Puts blood curse which damages and causes various effects on a monster. You also take damage."); + + { + HIT_POINT dam = 600; + int rad = 0; + + if (info) return info_damage(0, 0, dam); + + if (cast) + { + if (!get_aim_dir(&dir)) return NULL; + + fire_ball_hide(GF_BLOOD_CURSE, dir, dam, rad); + take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("ŒŒ‚ÌŽô‚¢", "Blood curse"), -1); + } + } + break; + + case 31: + if (name) return _("–‚‰¤•Ï‰»", "Polymorph Demonlord"); + if (desc) return _("ˆ«–‚‚̉¤‚ɕω»‚·‚éB•Ï‰»‚µ‚Ä‚¢‚éŠÔ‚Í–{—ˆ‚ÌŽí‘°‚Ì”\—Í‚ðŽ¸‚¢A‘ã‚í‚è‚Ɉ«–‚‚̉¤‚Æ‚µ‚Ä‚Ì”\—͂𓾁A•Ç‚ð”j‰ó‚µ‚È‚ª‚ç•à‚­B", + "Mimic a demon lord for a while. Loses abilities of original race and gets great abilities as a demon lord. Even hard walls can't stop your walking."); + + { + int base = 15; + + if (info) return info_duration(base, base); + + if (cast) + { + set_mimic(base + randint1(base), MIMIC_DEMON_LORD, FALSE); + } + } + break; + } + + return ""; +} + diff --git a/src/realm-daemon.h b/src/realm-daemon.h new file mode 100644 index 000000000..26c093934 --- /dev/null +++ b/src/realm-daemon.h @@ -0,0 +1,2 @@ +extern cptr do_daemon_spell(SPELL_IDX spell, BIT_FLAGS mode); + -- 2.11.0