OSDN Git Service

Merge pull request #3532 from sikabane-works/release/3.0.0.87-alpha
[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         return set_bluemage_damage(player_ptr, power, plev, KWD_DAM);
95     case MonsterAbilityType::DRAIN_MANA:
96         return set_bluemage_damage(player_ptr, power, plev, KWD_HEAL);
97     case MonsterAbilityType::MIND_BLAST:
98     case MonsterAbilityType::BRAIN_SMASH:
99     case MonsterAbilityType::CAUSE_1:
100     case MonsterAbilityType::CAUSE_2:
101     case MonsterAbilityType::CAUSE_3:
102     case MonsterAbilityType::CAUSE_4:
103     case MonsterAbilityType::BO_ACID:
104     case MonsterAbilityType::BO_ELEC:
105     case MonsterAbilityType::BO_FIRE:
106     case MonsterAbilityType::BO_COLD:
107     case MonsterAbilityType::BO_NETH:
108     case MonsterAbilityType::BO_WATE:
109     case MonsterAbilityType::BO_MANA:
110     case MonsterAbilityType::BO_PLAS:
111     case MonsterAbilityType::BO_ABYSS:
112     case MonsterAbilityType::BO_VOID:
113     case MonsterAbilityType::BO_ICEE:
114     case MonsterAbilityType::MISSILE:
115         return set_bluemage_damage(player_ptr, power, plev, KWD_DAM);
116     case MonsterAbilityType::HASTE:
117         return format(" %sd%d+%d", KWD_DURATION, 20 + plev, plev);
118     case MonsterAbilityType::HEAL:
119         return set_bluemage_damage(player_ptr, power, plev, KWD_HEAL);
120     case MonsterAbilityType::INVULNER:
121         return format(" %sd7+7", KWD_DURATION);
122     case MonsterAbilityType::BLINK:
123         return format(" %s10", KWD_SPHERE);
124     case MonsterAbilityType::TPORT:
125         return format(" %s%d", KWD_SPHERE, plev * 5);
126     case MonsterAbilityType::PSY_SPEAR:
127         return set_bluemage_damage(player_ptr, power, plev, KWD_DAM);
128     case MonsterAbilityType::RAISE_DEAD:
129         return format(" %s5", KWD_SPHERE);
130     default:
131         return std::string();
132     }
133 }