From: Deskull Date: Wed, 12 Sep 2018 14:45:30 +0000 (+0900) Subject: [Refactor] #37353 カオス領域処理を cmd-spell.c から realm-chaos.c/h へ分離。 X-Git-Url: http://git.osdn.net/view?p=hengband%2Fhengband.git;a=commitdiff_plain;h=b17ba37877ff78e6066eaafca300bb3450834821 [Refactor] #37353 カオス領域処理を cmd-spell.c から realm-chaos.c/h へ分離。 Separate chaos realm process from cmd-spell.c to realm-chaos.c/h. --- diff --git a/Hengband_vcs2015/Hengband/Hengband.vcxproj b/Hengband_vcs2015/Hengband/Hengband.vcxproj index 53e37bc86..854447d4e 100644 --- a/Hengband_vcs2015/Hengband/Hengband.vcxproj +++ b/Hengband_vcs2015/Hengband/Hengband.vcxproj @@ -196,6 +196,7 @@ + @@ -250,6 +251,7 @@ + diff --git a/Hengband_vcs2015/Hengband/Hengband.vcxproj.filters b/Hengband_vcs2015/Hengband/Hengband.vcxproj.filters index ad185532a..04bc8b7ad 100644 --- a/Hengband_vcs2015/Hengband/Hengband.vcxproj.filters +++ b/Hengband_vcs2015/Hengband/Hengband.vcxproj.filters @@ -259,6 +259,9 @@ Source + + Source + @@ -391,6 +394,9 @@ Header + + Header + diff --git a/src/cmd-spell.c b/src/cmd-spell.c index 3191b894d..938609b5b 100644 --- a/src/cmd-spell.c +++ b/src/cmd-spell.c @@ -11,6 +11,7 @@ #include "cmd-quaff.h" #include "spells-summon.h" #include "realm-arcane.h" +#include "realm-chaos.h" /*! * @brief @@ -1910,617 +1911,6 @@ static cptr do_nature_spell(SPELL_IDX spell, BIT_FLAGS mode) } -/*! - * @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_chaos_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 "); - static const char s_random[] = _("ランダム", "random"); - - 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 _("トラップ/ドア破壊", "Trap / Door Destruction"); - if (desc) return _("隣接する罠と扉を破壊する。", "Destroys all traps in adjacent squares."); - - { - int rad = 1; - - if (info) return info_radius(rad); - - if (cast) - { - destroy_doors_touch(); - } - } - break; - - case 2: - if (name) return _("閃光", "Flash of Light"); - 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 3: - if (name) return _("混乱の手", "Touch of Confusion"); - if (desc) return _("相手を混乱させる攻撃をできるようにする。", "Attempts to confuse the next monster that you hit."); - - { - if (cast) - { - if (!(p_ptr->special_attack & ATTACK_CONFUSE)) - { - msg_print(_("あなたの手は光り始めた。", "Your hands start glowing.")); - p_ptr->special_attack |= ATTACK_CONFUSE; - p_ptr->redraw |= (PR_STATUS); - } - } - } - break; - - case 4: - if (name) return _("魔力炸裂", "Mana Burst"); - if (desc) return _("魔法の球を放つ。", "Fires a ball of magic."); - - { - int dice = 3; - int sides = 5; - 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_MISSILE, dir, damroll(dice, sides) + base, rad); - - /* - * Shouldn't actually use GF_MANA, as - * it will destroy all items on the - * floor - */ - } - } - break; - - case 5: - if (name) return _("ファイア・ボルト", "Fire Bolt"); - if (desc) return _("炎のボルトもしくはビームを放つ。", "Fires a bolt or beam of fire."); - - { - int dice = 8 + (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_FIRE, dir, damroll(dice, sides)); - } - } - break; - - case 6: - if (name) return _("力の拳", "Fist of Force"); - if (desc) return _("ごく小さな分解の球を放つ。", "Fires a tiny ball of disintegration."); - - { - int dice = 8 + ((plev - 5) / 4); - int sides = 8; - - if (info) return info_damage(dice, sides, 0); - - if (cast) - { - if (!get_aim_dir(&dir)) return NULL; - - fire_ball(GF_DISINTEGRATE, dir, damroll(dice, sides), 0); - } - } - break; - - case 7: - if (name) return _("テレポート", "Teleport Self"); - if (desc) return _("遠距離のテレポートをする。", "Teleport long distance."); - - { - POSITION range = plev * 5; - - if (info) return info_range(range); - - if (cast) - { - teleport_player(range, 0L); - } - } - break; - - case 8: - if (name) return _("ワンダー", "Wonder"); - if (desc) return _("モンスターにランダムな効果を与える。", "Fires something with random effects."); - - { - if (info) return s_random; - - if (cast) - { - - if (!get_aim_dir(&dir)) return NULL; - - cast_wonder(dir); - } - } - break; - - case 9: - if (name) return _("カオス・ボルト", "Chaos Bolt"); - if (desc) return _("カオスのボルトもしくはビームを放つ。", "Fires a bolt or ball of chaos."); - - { - int dice = 10 + (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_CHAOS, dir, damroll(dice, sides)); - } - } - break; - - case 10: - if (name) return _("ソニック・ブーム", "Sonic Boom"); - if (desc) return _("自分を中心とした轟音の球を発生させる。", "Generates a ball of sound centered on you."); - - { - HIT_POINT dam = 60 + plev; - int rad = plev / 10 + 2; - - if (info) return info_damage(0, 0, dam/2); - - if (cast) - { - msg_print(_("ドーン!部屋が揺れた!", "BOOM! Shake the room!")); - project(0, rad, p_ptr->y, p_ptr->x, dam, GF_SOUND, PROJECT_KILL | PROJECT_ITEM, -1); - } - } - break; - - case 11: - if (name) return _("破滅の矢", "Doom Bolt"); - if (desc) return _("純粋な魔力のビームを放つ。", "Fires a beam of pure mana."); - - { - 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_beam(GF_MANA, 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 _("テレポート・アウェイ", "Teleport Other"); - 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 14: - if (name) return _("破壊の言葉", "Word of Destruction"); - if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroy everything in nearby area."); - - { - int base = 12; - int sides = 4; - - if (cast) - { - destroy_area(p_ptr->y, p_ptr->x, base + randint1(sides), FALSE); - } - } - break; - - case 15: - if (name) return _("ログルス発動", "Invoke Logrus"); - if (desc) return _("巨大なカオスの球を放つ。", "Fires a huge ball of chaos."); - - { - HIT_POINT dam = plev * 2 + 99; - int rad = plev / 5; - - if (info) return info_damage(0, 0, dam); - - if (cast) - { - if (!get_aim_dir(&dir)) return NULL; - - fire_ball(GF_CHAOS, dir, dam, rad); - } - } - break; - - case 16: - if (name) return _("他者変容", "Polymorph Other"); - if (desc) return _("モンスター1体を変身させる。抵抗されると無効。", "Attempts to polymorph a monster."); - - { - int power = plev; - - if (info) return info_power(power); - - if (cast) - { - if (!get_aim_dir(&dir)) return NULL; - - poly_monster(dir, plev); - } - } - break; - - case 17: - if (name) return _("連鎖稲妻", "Chain Lightning"); - if (desc) return _("全方向に対して電撃のビームを放つ。", "Fires lightning beams in all directions."); - - { - int dice = 5 + plev / 10; - int sides = 8; - - if (info) return info_damage(dice, sides, 0); - - if (cast) - { - for (dir = 0; dir <= 9; dir++) - fire_beam(GF_ELEC, dir, damroll(dice, sides)); - } - } - break; - - case 18: - if (name) return _("魔力封入", "Arcane Binding"); - if (desc) return _("杖/魔法棒の充填回数を増やすか、充填中のロッドの充填時間を減らす。", "Recharges staffs, wands or rods."); - - { - int power = 90; - - if (info) return info_power(power); - - if (cast) - { - if (!recharge(power)) return NULL; - } - } - break; - - case 19: - if (name) return _("原子分解", "Disintegrate"); - if (desc) return _("巨大な分解の球を放つ。", "Fires a huge ball of disintegration."); - - { - HIT_POINT dam = plev + 70; - int rad = 3 + plev / 40; - - if (info) return info_damage(0, 0, dam); - - if (cast) - { - if (!get_aim_dir(&dir)) return NULL; - - fire_ball(GF_DISINTEGRATE, dir, dam, rad); - } - } - break; - - case 20: - if (name) return _("現実変容", "Alter Reality"); - if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level."); - - { - int base = 15; - int sides = 20; - - if (info) return info_delay(base, sides); - - if (cast) - { - alter_reality(); - } - } - break; - - case 21: - if (name) return _("マジック・ロケット", "Magic Rocket"); - if (desc) return _("ロケットを発射する。", "Fires a magic rocket."); - - { - HIT_POINT dam = 120 + plev * 2; - int rad = 2; - - if (info) return info_damage(0, 0, dam); - - if (cast) - { - if (!get_aim_dir(&dir)) return NULL; - - msg_print(_("ロケット発射!", "You launch a rocket!")); - fire_rocket(GF_ROCKET, dir, dam, rad); - } - } - break; - - case 22: - if (name) return _("混沌の刃", "Chaos Branding"); - if (desc) return _("武器にカオスの属性をつける。", "Makes current weapon a Chaotic weapon."); - - { - if (cast) - { - brand_weapon(2); - } - } - break; - - case 23: - if (name) return _("悪魔召喚", "Summon Demon"); - if (desc) return _("悪魔を1体召喚する。", "Summons a demon."); - - { - if (cast) - { - u32b flg = 0L; - bool pet = !one_in_(3); - - 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 * 3) / 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!'")); - } - } - } - } - break; - - case 24: - if (name) return _("重力光線", "Beam of Gravity"); - if (desc) return _("重力のビームを放つ。", "Fires a beam of gravity."); - - { - int dice = 9 + (plev - 5) / 4; - int sides = 8; - - if (info) return info_damage(dice, sides, 0); - - if (cast) - { - if (!get_aim_dir(&dir)) return NULL; - - fire_beam(GF_GRAVITY, dir, damroll(dice, sides)); - } - } - break; - - case 25: - if (name) return _("流星群", "Meteor Swarm"); - if (desc) return _("自分の周辺に隕石を落とす。", "Makes meteor balls fall down to nearby random locations."); - - { - HIT_POINT dam = plev * 2; - int rad = 2; - - if (info) return info_multi_damage(dam); - - if (cast) - { - cast_meteor(dam, rad); - } - } - break; - - case 26: - if (name) return _("焔の一撃", "Flame Strike"); - if (desc) return _("自分を中心とした超巨大な炎の球を発生させる。", "Generate a huge ball of fire centered on you."); - - { - HIT_POINT dam = 300 + 3 * plev; - int rad = 8; - - if (info) return info_damage(0, 0, dam/2); - - if (cast) - { - fire_ball(GF_FIRE, 0, dam, rad); - } - } - break; - - case 27: - if (name) return _("混沌召来", "Call Chaos"); - if (desc) return _("ランダムな属性の球やビームを発生させる。", "Generate random kind of balls or beams."); - - { - if (info) return format("%s150 / 250", s_dam); - - if (cast) - { - call_chaos(); - } - } - break; - - case 28: - if (name) return _("自己変容", "Polymorph Self"); - if (desc) return _("自分を変身させようとする。", "Polymorphs yourself."); - - { - if (cast) - { - if (!get_check(_("変身します。よろしいですか?", "You will polymorph yourself. Are you sure? "))) return NULL; - do_poly_self(); - } - } - break; - - case 29: - if (name) return _("魔力の嵐", "Mana Storm"); - if (desc) return _("非常に強力で巨大な純粋な魔力の球を放つ。", "Fires an extremely powerful huge ball of pure mana."); - - { - HIT_POINT dam = 300 + plev * 4; - int rad = 4; - - if (info) return info_damage(0, 0, dam); - - if (cast) - { - if (!get_aim_dir(&dir)) return NULL; - - fire_ball(GF_MANA, dir, dam, rad); - } - } - break; - - case 30: - if (name) return _("ログルスのブレス", "Breathe Logrus"); - if (desc) return _("非常に強力なカオスの球を放つ。", "Fires an extremely powerful ball of chaos."); - - { - HIT_POINT dam = p_ptr->chp; - int rad = 2; - - if (info) return info_damage(0, 0, dam); - - if (cast) - { - if (!get_aim_dir(&dir)) return NULL; - - fire_ball(GF_CHAOS, dir, dam, rad); - } - } - break; - - case 31: - if (name) return _("虚無召来", "Call the Void"); - if (desc) return _("自分に周囲に向かって、ロケット、純粋な魔力の球、放射性廃棄物の球を放つ。ただし、壁に隣接して使用すると広範囲を破壊する。", - "Fires rockets, mana balls and nuclear waste balls in all directions each unless you are not adjacent to any walls. Otherwise *destroys* huge area."); - - { - if (info) return format("%s3 * 175", s_dam); - - if (cast) - { - call_the_(); - } - } - break; - } - - return ""; -} /*! * @brief 暗黒領域魔法の各処理を行う diff --git a/src/realm-chaos.c b/src/realm-chaos.c new file mode 100644 index 000000000..a98e35226 --- /dev/null +++ b/src/realm-chaos.c @@ -0,0 +1,614 @@ +#include "angband.h" +#include "cmd-spell.h" + +/*! +* @brief ƒJƒIƒX—̈斂–@‚ÌŠ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_chaos_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 "); + static const char s_random[] = _("ƒ‰ƒ“ƒ_ƒ€", "random"); + + 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 _("ƒgƒ‰ƒbƒv/ƒhƒA”j‰ó", "Trap / Door Destruction"); + if (desc) return _("—אڂ·‚é㩂Ɣà‚ð”j‰ó‚·‚éB", "Destroys all traps in adjacent squares."); + + { + int rad = 1; + + if (info) return info_radius(rad); + + if (cast) + { + destroy_doors_touch(); + } + } + break; + + case 2: + if (name) return _("‘MŒõ", "Flash of Light"); + 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 3: + if (name) return _("¬—‚ÌŽè", "Touch of Confusion"); + if (desc) return _("‘ŠŽè‚ð¬—‚³‚¹‚éUŒ‚‚ð‚Å‚«‚é‚悤‚É‚·‚éB", "Attempts to confuse the next monster that you hit."); + + { + if (cast) + { + if (!(p_ptr->special_attack & ATTACK_CONFUSE)) + { + msg_print(_("‚ ‚È‚½‚ÌŽè‚ÍŒõ‚èŽn‚ß‚½B", "Your hands start glowing.")); + p_ptr->special_attack |= ATTACK_CONFUSE; + p_ptr->redraw |= (PR_STATUS); + } + } + } + break; + + case 4: + if (name) return _("–‚—Íày—ô", "Mana Burst"); + if (desc) return _("–‚–@‚Ì‹…‚ð•ú‚B", "Fires a ball of magic."); + + { + int dice = 3; + int sides = 5; + 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_MISSILE, dir, damroll(dice, sides) + base, rad); + + /* + * Shouldn't actually use GF_MANA, as + * it will destroy all items on the + * floor + */ + } + } + break; + + case 5: + if (name) return _("ƒtƒ@ƒCƒAEƒ{ƒ‹ƒg", "Fire Bolt"); + if (desc) return _("‰Š‚̃{ƒ‹ƒg‚à‚µ‚­‚̓r[ƒ€‚ð•ú‚B", "Fires a bolt or beam of fire."); + + { + int dice = 8 + (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_FIRE, dir, damroll(dice, sides)); + } + } + break; + + case 6: + if (name) return _("—Í‚ÌŒ", "Fist of Force"); + if (desc) return _("‚²‚­¬‚³‚È•ª‰ð‚Ì‹…‚ð•ú‚B", "Fires a tiny ball of disintegration."); + + { + int dice = 8 + ((plev - 5) / 4); + int sides = 8; + + if (info) return info_damage(dice, sides, 0); + + if (cast) + { + if (!get_aim_dir(&dir)) return NULL; + + fire_ball(GF_DISINTEGRATE, dir, damroll(dice, sides), 0); + } + } + break; + + case 7: + if (name) return _("ƒeƒŒƒ|[ƒg", "Teleport Self"); + 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 8: + if (name) return _("ƒƒ“ƒ_[", "Wonder"); + if (desc) return _("ƒ‚ƒ“ƒXƒ^[‚Ƀ‰ƒ“ƒ_ƒ€‚ÈŒø‰Ê‚ð—^‚¦‚éB", "Fires something with random effects."); + + { + if (info) return s_random; + + if (cast) + { + + if (!get_aim_dir(&dir)) return NULL; + + cast_wonder(dir); + } + } + break; + + case 9: + if (name) return _("ƒJƒIƒXEƒ{ƒ‹ƒg", "Chaos Bolt"); + if (desc) return _("ƒJƒIƒX‚̃{ƒ‹ƒg‚à‚µ‚­‚̓r[ƒ€‚ð•ú‚B", "Fires a bolt or ball of chaos."); + + { + int dice = 10 + (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_CHAOS, dir, damroll(dice, sides)); + } + } + break; + + case 10: + if (name) return _("ƒ\ƒjƒbƒNEƒu[ƒ€", "Sonic Boom"); + if (desc) return _("Ž©•ª‚𒆐S‚Æ‚µ‚½Œ‰¹‚Ì‹…‚𔭐¶‚³‚¹‚éB", "Generates a ball of sound centered on you."); + + { + HIT_POINT dam = 60 + plev; + int rad = plev / 10 + 2; + + if (info) return info_damage(0, 0, dam / 2); + + if (cast) + { + msg_print(_("ƒh[ƒ“I•”‰®‚ª—h‚ꂽI", "BOOM! Shake the room!")); + project(0, rad, p_ptr->y, p_ptr->x, dam, GF_SOUND, PROJECT_KILL | PROJECT_ITEM, -1); + } + } + break; + + case 11: + if (name) return _("”j–Å‚Ì–î", "Doom Bolt"); + if (desc) return _("ƒˆ‚È–‚—͂̃r[ƒ€‚ð•ú‚B", "Fires a beam of pure mana."); + + { + 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_beam(GF_MANA, 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 _("ƒeƒŒƒ|[ƒgEƒAƒEƒFƒC", "Teleport Other"); + 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 14: + if (name) return _("”j‰ó‚ÌŒ¾—t", "Word of Destruction"); + if (desc) return _("Žü•Ó‚̃AƒCƒeƒ€Aƒ‚ƒ“ƒXƒ^[A’nŒ`‚ð”j‰ó‚·‚éB", "Destroy everything in nearby area."); + + { + int base = 12; + int sides = 4; + + if (cast) + { + destroy_area(p_ptr->y, p_ptr->x, base + randint1(sides), FALSE); + } + } + break; + + case 15: + if (name) return _("ƒƒOƒ‹ƒX”­“®", "Invoke Logrus"); + if (desc) return _("‹‘å‚ȃJƒIƒX‚Ì‹…‚ð•ú‚B", "Fires a huge ball of chaos."); + + { + HIT_POINT dam = plev * 2 + 99; + int rad = plev / 5; + + if (info) return info_damage(0, 0, dam); + + if (cast) + { + if (!get_aim_dir(&dir)) return NULL; + + fire_ball(GF_CHAOS, dir, dam, rad); + } + } + break; + + case 16: + if (name) return _("‘¼ŽÒ•Ï—e", "Polymorph Other"); + if (desc) return _("ƒ‚ƒ“ƒXƒ^[1‘Ì‚ð•Ïg‚³‚¹‚éB’ïR‚³‚ê‚é‚Æ–³ŒøB", "Attempts to polymorph a monster."); + + { + int power = plev; + + if (info) return info_power(power); + + if (cast) + { + if (!get_aim_dir(&dir)) return NULL; + + poly_monster(dir, plev); + } + } + break; + + case 17: + if (name) return _("˜A½ˆîÈ", "Chain Lightning"); + if (desc) return _("‘S•ûŒü‚ɑ΂µ‚Ä“dŒ‚‚̃r[ƒ€‚ð•ú‚B", "Fires lightning beams in all directions."); + + { + int dice = 5 + plev / 10; + int sides = 8; + + if (info) return info_damage(dice, sides, 0); + + if (cast) + { + for (dir = 0; dir <= 9; dir++) + fire_beam(GF_ELEC, dir, damroll(dice, sides)); + } + } + break; + + case 18: + if (name) return _("–‚—Í••“ü", "Arcane Binding"); + if (desc) return _("ñ/–‚–@–_‚̏[“U‰ñ”‚𑝂₷‚©A[“U’†‚̃ƒbƒh‚̏[“UŽžŠÔ‚ðŒ¸‚ç‚·B", "Recharges staffs, wands or rods."); + + { + int power = 90; + + if (info) return info_power(power); + + if (cast) + { + if (!recharge(power)) return NULL; + } + } + break; + + case 19: + if (name) return _("Œ´Žq•ª‰ð", "Disintegrate"); + if (desc) return _("‹‘å‚È•ª‰ð‚Ì‹…‚ð•ú‚B", "Fires a huge ball of disintegration."); + + { + HIT_POINT dam = plev + 70; + int rad = 3 + plev / 40; + + if (info) return info_damage(0, 0, dam); + + if (cast) + { + if (!get_aim_dir(&dir)) return NULL; + + fire_ball(GF_DISINTEGRATE, dir, dam, rad); + } + } + break; + + case 20: + if (name) return _("Œ»ŽÀ•Ï—e", "Alter Reality"); + if (desc) return _("Œ»Ý‚ÌŠK‚ðÄ\¬‚·‚éB", "Recreates current dungeon level."); + + { + int base = 15; + int sides = 20; + + if (info) return info_delay(base, sides); + + if (cast) + { + alter_reality(); + } + } + break; + + case 21: + if (name) return _("ƒ}ƒWƒbƒNEƒƒPƒbƒg", "Magic Rocket"); + if (desc) return _("ƒƒPƒbƒg‚ð”­ŽË‚·‚éB", "Fires a magic rocket."); + + { + HIT_POINT dam = 120 + plev * 2; + int rad = 2; + + if (info) return info_damage(0, 0, dam); + + if (cast) + { + if (!get_aim_dir(&dir)) return NULL; + + msg_print(_("ƒƒPƒbƒg”­ŽËI", "You launch a rocket!")); + fire_rocket(GF_ROCKET, dir, dam, rad); + } + } + break; + + case 22: + if (name) return _("¬“ׂ̐n", "Chaos Branding"); + if (desc) return _("•Ší‚ɃJƒIƒX‚Ì‘®«‚ð‚‚¯‚éB", "Makes current weapon a Chaotic weapon."); + + { + if (cast) + { + brand_weapon(2); + } + } + break; + + case 23: + if (name) return _("ˆ«–‚¢Š«", "Summon Demon"); + if (desc) return _("ˆ«–‚‚ð1‘̏¢Š«‚·‚éB", "Summons a demon."); + + { + if (cast) + { + u32b flg = 0L; + bool pet = !one_in_(3); + + 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 * 3) / 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!'")); + } + } + } + } + break; + + case 24: + if (name) return _("d—ÍŒõü", "Beam of Gravity"); + if (desc) return _("d—͂̃r[ƒ€‚ð•ú‚B", "Fires a beam of gravity."); + + { + int dice = 9 + (plev - 5) / 4; + int sides = 8; + + if (info) return info_damage(dice, sides, 0); + + if (cast) + { + if (!get_aim_dir(&dir)) return NULL; + + fire_beam(GF_GRAVITY, dir, damroll(dice, sides)); + } + } + break; + + case 25: + if (name) return _("—¬¯ŒQ", "Meteor Swarm"); + if (desc) return _("Ž©•ª‚ÌŽü•Ó‚É覐΂𗎂Ƃ·B", "Makes meteor balls fall down to nearby random locations."); + + { + HIT_POINT dam = plev * 2; + int rad = 2; + + if (info) return info_multi_damage(dam); + + if (cast) + { + cast_meteor(dam, rad); + } + } + break; + + case 26: + if (name) return _("‰‹‚̈ꌂ", "Flame Strike"); + if (desc) return _("Ž©•ª‚𒆐S‚Æ‚µ‚½’´‹‘å‚ȉŠ‚Ì‹…‚𔭐¶‚³‚¹‚éB", "Generate a huge ball of fire centered on you."); + + { + HIT_POINT dam = 300 + 3 * plev; + int rad = 8; + + if (info) return info_damage(0, 0, dam / 2); + + if (cast) + { + fire_ball(GF_FIRE, 0, dam, rad); + } + } + break; + + case 27: + if (name) return _("¬“׏¢—ˆ", "Call Chaos"); + if (desc) return _("ƒ‰ƒ“ƒ_ƒ€‚È‘®«‚Ì‹…‚âƒr[ƒ€‚𔭐¶‚³‚¹‚éB", "Generate random kind of balls or beams."); + + { + if (info) return format("%s150 / 250", s_dam); + + if (cast) + { + call_chaos(); + } + } + break; + + case 28: + if (name) return _("Ž©ŒÈ•Ï—e", "Polymorph Self"); + if (desc) return _("Ž©•ª‚ð•Ïg‚³‚¹‚悤‚Æ‚·‚éB", "Polymorphs yourself."); + + { + if (cast) + { + if (!get_check(_("•Ïg‚µ‚Ü‚·B‚æ‚낵‚¢‚Å‚·‚©H", "You will polymorph yourself. Are you sure? "))) return NULL; + do_poly_self(); + } + } + break; + + case 29: + if (name) return _("–‚—Í‚Ì—’", "Mana Storm"); + if (desc) return _("”ñí‚É‹­—Í‚Å‹‘å‚ȏƒˆ‚È–‚—Í‚Ì‹…‚ð•ú‚B", "Fires an extremely powerful huge ball of pure mana."); + + { + HIT_POINT dam = 300 + plev * 4; + int rad = 4; + + if (info) return info_damage(0, 0, dam); + + if (cast) + { + if (!get_aim_dir(&dir)) return NULL; + + fire_ball(GF_MANA, dir, dam, rad); + } + } + break; + + case 30: + if (name) return _("ƒƒOƒ‹ƒX‚̃uƒŒƒX", "Breathe Logrus"); + if (desc) return _("”ñí‚É‹­—͂ȃJƒIƒX‚Ì‹…‚ð•ú‚B", "Fires an extremely powerful ball of chaos."); + + { + HIT_POINT dam = p_ptr->chp; + int rad = 2; + + if (info) return info_damage(0, 0, dam); + + if (cast) + { + if (!get_aim_dir(&dir)) return NULL; + + fire_ball(GF_CHAOS, dir, dam, rad); + } + } + break; + + case 31: + if (name) return _("‹•–³¢—ˆ", "Call the Void"); + if (desc) return _("Ž©•ª‚ÉŽüˆÍ‚ÉŒü‚©‚Á‚āAƒƒPƒbƒgAƒˆ‚È–‚—Í‚Ì‹…A•úŽË«”pŠü•¨‚Ì‹…‚ð•ú‚B‚½‚¾‚µA•Ç‚ɗאڂµ‚ÄŽg—p‚·‚é‚ƍL”͈͂ð”j‰ó‚·‚éB", + "Fires rockets, mana balls and nuclear waste balls in all directions each unless you are not adjacent to any walls. Otherwise *destroys* huge area."); + + { + if (info) return format("%s3 * 175", s_dam); + + if (cast) + { + call_the_(); + } + } + break; + } + + return ""; +} \ No newline at end of file diff --git a/src/realm-chaos.h b/src/realm-chaos.h new file mode 100644 index 000000000..b11edf52f --- /dev/null +++ b/src/realm-chaos.h @@ -0,0 +1 @@ +extern cptr do_chaos_spell(SPELL_IDX spell, BIT_FLAGS mode);