OSDN Git Service

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