OSDN Git Service

青魔法・ものまねに魔法「メテオストライク」を追加
[hengbandforosx/hengbandosx.git] / src / blue-magic / learnt-info.cpp
1 /*!
2  * @file learnt-info.cpp
3  * @brief 青魔法の情報表示処理定義
4  */
5
6 #include "blue-magic/learnt-info.h"
7 #include "cmd-action/cmd-spell.h"
8 #include "lore/lore-calculator.h" //!< @todo 少し違和感.
9 #include "monster-race/race-ability-flags.h"
10 #include "mspell/mspell-damage-calculator.h"
11 #include "system/player-type-definition.h"
12 #include "term/z-form.h"
13
14 /*!
15  * @brief モンスター魔法をプレイヤーが使用する場合の換算レベル
16  * @param player_ptr プレイヤーへの参照ポインタ
17  * @param 換算レベル
18  */
19 PLAYER_LEVEL get_pseudo_monstetr_level(PlayerType *player_ptr)
20 {
21     PLAYER_LEVEL monster_level = player_ptr->lev + 40;
22     return (monster_level * monster_level - 1550) / 130;
23 }
24
25 /*!
26  * @brief 文字列に青魔導師の呪文の攻撃力を加える
27  * @param SPELL_NUM 呪文番号
28  * @param plev プレイヤーレベル
29  * @param msg 表示する文字列
30  * @return std::string 潜在的な損傷の説明
31  */
32 static std::string set_bluemage_damage(PlayerType *player_ptr, MonsterAbilityType ms_type, PLAYER_LEVEL plev, concptr msg)
33 {
34     int base_damage = monspell_bluemage_damage(player_ptr, ms_type, plev, BASE_DAM);
35     int dice_num = monspell_bluemage_damage(player_ptr, ms_type, plev, DICE_NUM);
36     int dice_side = monspell_bluemage_damage(player_ptr, ms_type, plev, DICE_SIDE);
37     int dice_mult = monspell_bluemage_damage(player_ptr, ms_type, plev, DICE_MULT);
38     int dice_div = monspell_bluemage_damage(player_ptr, ms_type, plev, DICE_DIV);
39     return format(" %s %s", msg, dice_to_string(base_damage, dice_num, dice_side, dice_mult, dice_div).data());
40 }
41
42 /*!
43  * @brief 受け取ったモンスター魔法のIDに応じて青魔法の効果情報をまとめたフォーマットを返す
44  * @param player_ptr プレイヤーへの参照ポインタ
45  * @param power モンスター魔法のID
46  * @return std::string パワーについてのコメント
47  */
48 std::string learnt_info(PlayerType *player_ptr, MonsterAbilityType power)
49 {
50     PLAYER_LEVEL plev = get_pseudo_monstetr_level(player_ptr);
51
52     switch (power) {
53     case MonsterAbilityType::BA_MANA:
54     case MonsterAbilityType::BA_DARK:
55     case MonsterAbilityType::BA_LITE:
56         return set_bluemage_damage(player_ptr, power, plev, KWD_DAM);
57     case MonsterAbilityType::ROCKET:
58     case MonsterAbilityType::SHOOT:
59     case MonsterAbilityType::BR_ACID:
60     case MonsterAbilityType::BR_ELEC:
61     case MonsterAbilityType::BR_FIRE:
62     case MonsterAbilityType::BR_COLD:
63     case MonsterAbilityType::BR_POIS:
64     case MonsterAbilityType::BR_NUKE:
65     case MonsterAbilityType::BR_NEXU:
66     case MonsterAbilityType::BR_TIME:
67     case MonsterAbilityType::BR_GRAV:
68     case MonsterAbilityType::BR_MANA:
69     case MonsterAbilityType::BR_NETH:
70     case MonsterAbilityType::BR_LITE:
71     case MonsterAbilityType::BR_DARK:
72     case MonsterAbilityType::BR_CONF:
73     case MonsterAbilityType::BR_SOUN:
74     case MonsterAbilityType::BR_CHAO:
75     case MonsterAbilityType::BR_DISE:
76     case MonsterAbilityType::BR_SHAR:
77     case MonsterAbilityType::BR_PLAS:
78     case MonsterAbilityType::BR_INER:
79     case MonsterAbilityType::BR_FORC:
80     case MonsterAbilityType::BR_DISI:
81     case MonsterAbilityType::BR_VOID:
82     case MonsterAbilityType::BR_ABYSS:
83     case MonsterAbilityType::BA_NUKE:
84     case MonsterAbilityType::BA_CHAO:
85     case MonsterAbilityType::BA_ACID:
86     case MonsterAbilityType::BA_ELEC:
87     case MonsterAbilityType::BA_FIRE:
88     case MonsterAbilityType::BA_COLD:
89     case MonsterAbilityType::BA_POIS:
90     case MonsterAbilityType::BA_NETH:
91     case MonsterAbilityType::BA_WATE:
92     case MonsterAbilityType::BA_VOID:
93     case MonsterAbilityType::BA_ABYSS:
94     case MonsterAbilityType::BA_METEOR:
95         return set_bluemage_damage(player_ptr, power, plev, KWD_DAM);
96     case MonsterAbilityType::DRAIN_MANA:
97         return set_bluemage_damage(player_ptr, power, plev, KWD_HEAL);
98     case MonsterAbilityType::MIND_BLAST:
99     case MonsterAbilityType::BRAIN_SMASH:
100     case MonsterAbilityType::CAUSE_1:
101     case MonsterAbilityType::CAUSE_2:
102     case MonsterAbilityType::CAUSE_3:
103     case MonsterAbilityType::CAUSE_4:
104     case MonsterAbilityType::BO_ACID:
105     case MonsterAbilityType::BO_ELEC:
106     case MonsterAbilityType::BO_FIRE:
107     case MonsterAbilityType::BO_COLD:
108     case MonsterAbilityType::BO_NETH:
109     case MonsterAbilityType::BO_WATE:
110     case MonsterAbilityType::BO_MANA:
111     case MonsterAbilityType::BO_PLAS:
112     case MonsterAbilityType::BO_ABYSS:
113     case MonsterAbilityType::BO_VOID:
114     case MonsterAbilityType::BO_ICEE:
115     case MonsterAbilityType::BO_METEOR:
116     case MonsterAbilityType::MISSILE:
117         return set_bluemage_damage(player_ptr, power, plev, KWD_DAM);
118     case MonsterAbilityType::HASTE:
119         return format(" %sd%d+%d", KWD_DURATION, 20 + plev, plev);
120     case MonsterAbilityType::HEAL:
121         return set_bluemage_damage(player_ptr, power, plev, KWD_HEAL);
122     case MonsterAbilityType::INVULNER:
123         return format(" %sd7+7", KWD_DURATION);
124     case MonsterAbilityType::BLINK:
125         return format(" %s10", KWD_SPHERE);
126     case MonsterAbilityType::TPORT:
127         return format(" %s%d", KWD_SPHERE, plev * 5);
128     case MonsterAbilityType::PSY_SPEAR:
129         return set_bluemage_damage(player_ptr, power, plev, KWD_DAM);
130     case MonsterAbilityType::RAISE_DEAD:
131         return format(" %s5", KWD_SPHERE);
132     default:
133         return std::string();
134     }
135 }