OSDN Git Service

[Refactor] struct player_type を class PlayerType に置換。
[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 void switch_mind_mindcrafter(PlayerType *player_ptr, const PLAYER_LEVEL plev, const int power, char *p)
10 {
11     switch (power) {
12     case 0:
13         break;
14     case 1:
15         sprintf(p, " %s%dd%d", KWD_DAM, 3 + ((plev - 1) / 4), 3 + plev / 15);
16         break;
17     case 2:
18         sprintf(p, " %s10", KWD_SPHERE);
19         break;
20     case 3:
21         sprintf(p, " %s%d", KWD_SPHERE, plev * 5);
22         break;
23     case 4:
24         break;
25     case 5:
26         sprintf(p, " %s%dd8", KWD_DAM, 8 + ((plev - 5) / 4));
27         break;
28     case 6:
29         sprintf(p, " %s%d", KWD_DURATION, plev);
30         break;
31     case 7:
32         break;
33     case 8:
34         sprintf(p, (plev < 25 ? " %s%d" : " %sd%d"), KWD_DAM, (plev < 25 ? plev * 3 / 2 : plev * ((plev - 5) / 10 + 1)));
35         break;
36     case 9:
37         sprintf(p, " %s10+d%d", KWD_DURATION, plev * 3 / 2);
38         break;
39 #ifdef JP
40     case 10:
41         sprintf(p, " 最大重量:%d.%dkg", lb_to_kg_integer(plev * 15), lb_to_kg_fraction(plev * 15));
42         break;
43 #else
44     case 10:
45         sprintf(p, " max wgt %d", plev * 15);
46         break;
47 #endif
48     case 11:
49         sprintf(p, " %s%dd6", KWD_DAM, plev / 2);
50         break;
51     case 12:
52         sprintf(p, " %sd%d+%d", KWD_DAM, plev * 3, plev * 3);
53         break;
54     case 13:
55         sprintf(p, _(" 行動:%ld回", " %ld acts."), (long int)(player_ptr->csp + 100 - player_ptr->energy_need - 50) / 100);
56         break;
57     }
58 }
59
60 static void switch_mind_ki(PlayerType *player_ptr, const PLAYER_LEVEL plev, const int power, char *p)
61 {
62     int boost = get_current_ki(player_ptr);
63     if (heavy_armor(player_ptr))
64         boost /= 2;
65
66     switch (power) {
67     case 0:
68         sprintf(p, " %s%dd4", KWD_DAM, 3 + ((plev - 1) / 5) + boost / 12);
69         break;
70     case 1:
71         break;
72     case 2:
73         sprintf(p, " %s%d+d30", KWD_DURATION, 30 + boost / 5);
74         break;
75     case 3:
76         sprintf(p, " %s%dd5", KWD_DAM, 5 + ((plev - 1) / 5) + boost / 10);
77         break;
78     case 4:
79         sprintf(p, " %s%d+d20", KWD_DURATION, 20 + boost / 5);
80         break;
81     case 5:
82         break;
83     case 6:
84         sprintf(p, " %s%d+d%d", KWD_DURATION, 15 + boost / 7, plev / 2);
85         break;
86     case 7:
87         sprintf(p, " %s%dd8", KWD_DAM, 8 + ((plev - 5) / 4) + boost / 12);
88         break;
89     case 8:
90         sprintf(p, " %s10d6+%d", KWD_DAM, plev * 3 / 2 + boost * 3 / 5);
91         break;
92     case 9:
93         break;
94     case 10:
95         sprintf(p, _(" 最大%d体", " max %d"), 1 + boost / 100);
96         break;
97     case 11:
98         sprintf(p, " %s%d", KWD_DAM, 100 + plev + boost);
99         break;
100     case 12:
101         sprintf(p, " %s%dd15", KWD_DAM, 10 + plev / 2 + boost * 3 / 10);
102         break;
103     case 13:
104         sprintf(p, _(" 行動:%d+d16回", " %d+d16 acts"), 16 + boost / 20);
105         break;
106     }
107 }
108
109 static void switch_mind_mirror_master(const PLAYER_LEVEL plev, const int power, char *p)
110 {
111     switch (power) {
112     case 0:
113         break;
114     case 1:
115         break;
116     case 2:
117         sprintf(p, " %s%dd4", KWD_DAM, 3 + ((plev - 1) / 5));
118         break;
119     case 3:
120         sprintf(p, " %s10", KWD_SPHERE);
121         break;
122     case 4:
123         break;
124     case 5:
125         sprintf(p, " %s%d", KWD_SPHERE, plev * 5);
126         break;
127     case 6:
128         sprintf(p, " %s20+d20", KWD_DURATION);
129         break;
130     case 7:
131         break;
132     case 8:
133         sprintf(p, " %s%dd8", KWD_DAM, 8 + ((plev - 5) / 4));
134         break;
135     case 9:
136         break;
137     case 10:
138         sprintf(p, " %s%dd8", KWD_DAM, 11 + (plev - 5) / 4);
139         break;
140     case 11:
141         break;
142     case 12:
143         sprintf(p, " %s20+d20", KWD_DURATION);
144         break;
145     case 13:
146         sprintf(p, " %s150+d%d", KWD_DAM, plev * 2);
147         break;
148     case 14:
149         break;
150     case 15:
151         break;
152     case 16:
153         sprintf(p, " %s%d", KWD_SPHERE, plev / 2 + 10);
154         break;
155     case 17:
156         break;
157     case 18:
158         sprintf(p, " %s6+d6", KWD_DURATION);
159         break;
160     case 19:
161         sprintf(p, " %s%d", KWD_DAM, plev * 11 + 5);
162         break;
163     case 20:
164         sprintf(p, " %s4+d4", KWD_DURATION);
165         break;
166     }
167 }
168
169 static void switch_mind_ninja(const PLAYER_LEVEL plev, const int power, char *p)
170 {
171     switch (power) {
172     case 0:
173     case 1:
174         break;
175     case 2:
176         sprintf(p, " %s10", KWD_SPHERE);
177         break;
178     case 3:
179         break;
180     case 4:
181         sprintf(p, " %s%d", KWD_SPHERE, plev * 5);
182         break;
183     case 5:
184         sprintf(p, " %s30", KWD_SPHERE);
185         break;
186     case 6:
187     case 7:
188         break;
189     case 8:
190         sprintf(p, " %s20+d20", KWD_DURATION);
191         break;
192     case 9:
193         sprintf(p, " %s%d", KWD_DAM, (50 + plev) / 2);
194         break;
195     case 10:
196     case 11:
197     case 12:
198     case 13:
199     case 14:
200     case 15:
201         break;
202     case 16:
203         sprintf(p, " %s%d+d%d", KWD_DURATION, plev / 2, plev / 2);
204         break;
205     case 17:
206         sprintf(p, " %s%d*3", KWD_DAM, (75 + plev * 2 / 3) / 2);
207         break;
208     case 18:
209         sprintf(p, " %s%dd10", KWD_DAM, 6 + plev / 8);
210         break;
211     case 19:
212         sprintf(p, " %s6+d6", KWD_DURATION);
213         break;
214     }
215 }
216
217 /*!
218  * @brief 特殊技能の効果情報をまとめたフォーマットを返す
219  * @param p 情報を返す文字列参照ポインタ
220  * @param use_mind 職業毎の特殊技能ID
221  * @param power モンスター魔法のID
222  */
223 void mindcraft_info(PlayerType *player_ptr, char *p, MindKindType use_mind, int power)
224 {
225     const PLAYER_LEVEL plev = player_ptr->lev;
226     strcpy(p, "");
227     switch (use_mind) {
228     case MindKindType::MINDCRAFTER:
229         switch_mind_mindcrafter(player_ptr, plev, power, p);
230         break;
231     case MindKindType::KI:
232         switch_mind_ki(player_ptr, plev, power, p);
233         break;
234     case MindKindType::MIRROR_MASTER:
235         switch_mind_mirror_master(plev, power, p);
236         break;
237     case MindKindType::NINJUTSU:
238         switch_mind_ninja(plev, power, p);
239         break;
240     default:
241         break;
242     }
243 }