OSDN Git Service

Merge pull request #3532 from sikabane-works/release/3.0.0.87-alpha
[hengbandforosx/hengbandosx.git] / src / mind / mind-info.cpp
1 #include "mind/mind-info.h"
2 #include "cmd-action/cmd-spell.h"
3 #include "locale/japanese.h"
4 #include "mind/mind-force-trainer.h"
5 #include "mind/mind-types.h"
6 #include "player-info/equipment-info.h"
7 #include "system/player-type-definition.h"
8
9 static std::string switch_mind_mindcrafter(PlayerType *player_ptr, const PLAYER_LEVEL plev, const int power)
10 {
11     switch (power) {
12     case 1:
13         return format(" %s%dd%d", KWD_DAM, 3 + ((plev - 1) / 4), 3 + plev / 15);
14     case 2:
15         return format(" %s10", KWD_SPHERE);
16     case 3:
17         return format(" %s%d", KWD_SPHERE, plev * 5);
18     case 5:
19         return format(" %s%dd8", KWD_DAM, 8 + ((plev - 5) / 4));
20     case 6:
21         return format(" %s%d", KWD_DURATION, plev);
22     case 8:
23         return format((plev < 25 ? " %s%d" : " %sd%d"), KWD_DAM, (plev < 25 ? plev * 3 / 2 : plev * ((plev - 5) / 10 + 1)));
24     case 9:
25         return format(" %s10+d%d", KWD_DURATION, plev * 3 / 2);
26 #ifdef JP
27     case 10:
28         return format(" 最大重量:%d.%dkg", lb_to_kg_integer(plev * 15), lb_to_kg_fraction(plev * 15));
29 #else
30     case 10:
31         return format(" max wgt %d", plev * 15);
32 #endif
33     case 11:
34         return format(" %s%dd6", KWD_DAM, plev / 2);
35     case 12:
36         return format(" %sd%d+%d", KWD_DAM, plev * 3, plev * 3);
37     case 13:
38         return format(_(" 行動:%ld回", " %ld acts."), (long int)(player_ptr->csp + 100 - player_ptr->energy_need - 50) / 100);
39     default:
40         return std::string();
41     }
42 }
43
44 static std::string switch_mind_ki(PlayerType *player_ptr, const PLAYER_LEVEL plev, const int power)
45 {
46     int boost = get_current_ki(player_ptr);
47     if (heavy_armor(player_ptr)) {
48         boost /= 2;
49     }
50
51     switch (power) {
52     case 0:
53         return format(" %s%dd4", KWD_DAM, 3 + ((plev - 1) / 5) + boost / 12);
54     case 2:
55         return format(" %s%d+d30", KWD_DURATION, 30 + boost / 5);
56     case 3:
57         return format(" %s%dd5", KWD_DAM, 5 + ((plev - 1) / 5) + boost / 10);
58     case 4:
59         return format(" %s%d+d20", KWD_DURATION, 20 + boost / 5);
60     case 6:
61         return format(" %s%d+d%d", KWD_DURATION, 15 + boost / 7, plev / 2);
62     case 7:
63         return format(" %s%dd8", KWD_DAM, 8 + ((plev - 5) / 4) + boost / 12);
64     case 8:
65         return format(" %s10d6+%d", KWD_DAM, plev * 3 / 2 + boost * 3 / 5);
66     case 10:
67         return format(_(" 最大%d体", " max %d"), 1 + boost / 100);
68     case 11:
69         return format(" %s%d", KWD_DAM, 100 + plev + boost);
70     case 12:
71         return format(" %s%dd15", KWD_DAM, 10 + plev / 2 + boost * 3 / 10);
72     case 13:
73         return format(_(" 行動:%d+d16回", " %d+d16 acts"), 16 + boost / 20);
74     default:
75         return std::string();
76     }
77 }
78
79 static std::string switch_mind_mirror_master(const PLAYER_LEVEL plev, const int power)
80 {
81     switch (power) {
82     case 2:
83         return format(" %s%dd4", KWD_DAM, 3 + ((plev - 1) / 5));
84     case 3:
85         return format(" %s10", KWD_SPHERE);
86     case 5:
87         return format(" %s%d", KWD_SPHERE, plev * 5);
88     case 6:
89         return format(" %s20+d20", KWD_DURATION);
90     case 8:
91         return format(" %s%dd8", KWD_DAM, 8 + ((plev - 5) / 4));
92     case 10:
93         return format(" %s%dd8", KWD_DAM, 11 + (plev - 5) / 4);
94     case 12:
95         return format(" %s20+d20", KWD_DURATION);
96     case 13:
97         return format(" %s150+d%d", KWD_DAM, plev * 2);
98     case 16:
99         return format(" %s%d", KWD_SPHERE, plev / 2 + 10);
100     case 18:
101         return format(" %s6+d6", KWD_DURATION);
102     case 19:
103         return format(" %s%d", KWD_DAM, plev * 11 + 5);
104     case 20:
105         return format(" %s4+d4", KWD_DURATION);
106     default:
107         return std::string();
108     }
109 }
110
111 static std::string switch_mind_ninja(const PLAYER_LEVEL plev, const int power)
112 {
113     switch (power) {
114     case 2:
115         return format(" %s10", KWD_SPHERE);
116     case 4:
117         return format(" %s%d", KWD_SPHERE, plev * 5);
118     case 5:
119         return format(" %s30", KWD_SPHERE);
120     case 8:
121         return format(" %s20+d20", KWD_DURATION);
122     case 9:
123         return format(" %s%d", KWD_DAM, (50 + plev) / 2);
124     case 16:
125         return format(" %s%d+d%d", KWD_DURATION, plev / 2, plev / 2);
126     case 17:
127         return format(" %s%d*3", KWD_DAM, (75 + plev * 2 / 3) / 2);
128     case 18:
129         return format(" %s%dd10", KWD_DAM, 6 + plev / 8);
130     case 19:
131         return format(" %s6+d6", KWD_DURATION);
132     default:
133         return std::string();
134     }
135 }
136
137 /*!
138  * @brief 特殊技能の効果情報をまとめたフォーマットを返す
139  * @param use_mind 職業毎の特殊技能ID
140  * @param power モンスター魔法のID
141  * @return std::string 特殊技能の情報を表す文字列
142  */
143 std::string mindcraft_info(PlayerType *player_ptr, MindKindType use_mind, int power)
144 {
145     const PLAYER_LEVEL plev = player_ptr->lev;
146     switch (use_mind) {
147     case MindKindType::MINDCRAFTER:
148         return switch_mind_mindcrafter(player_ptr, plev, power);
149     case MindKindType::KI:
150         return switch_mind_ki(player_ptr, plev, power);
151     case MindKindType::MIRROR_MASTER:
152         return switch_mind_mirror_master(plev, power);
153     case MindKindType::NINJUTSU:
154         return switch_mind_ninja(plev, power);
155     default:
156         return std::string();
157     }
158 }