|
11 | 11 |
|
12 | 12 | #define TAG "DolphinState"
|
13 | 13 |
|
| 14 | +// Function macros helpers |
| 15 | +#define REQUIRED_XP(LEVEL) \ |
| 16 | + (((LEVEL * LEVEL) + LEVEL) / 2 * LEVEL_XP_REQUIREMENT_INCREMENT - \ |
| 17 | + (LEVEL * LEVEL_XP_REQUIREMENT_INCREMENT)) |
| 18 | +#define LEVEL_FOR_XP_DIVIDEND(XP) \ |
| 19 | + (sqrt(LEVEL_XP_REQUIREMENT_INCREMENT * ((2 * XP) + (LEVEL_XP_REQUIREMENT_INCREMENT / 4))) + \ |
| 20 | + (LEVEL_XP_REQUIREMENT_INCREMENT / 2)) |
| 21 | + |
14 | 22 | #define DOLPHIN_STATE_PATH INT_PATH(DOLPHIN_STATE_FILE_NAME)
|
15 | 23 | #define DOLPHIN_STATE_HEADER_MAGIC 0xD0
|
16 | 24 | #define DOLPHIN_STATE_HEADER_VERSION 0x01
|
17 |
| -#define LEVEL2_THRESHOLD 450 |
18 |
| -#define LEVEL3_THRESHOLD 700 |
19 |
| -#define LEVEL4_THRESHOLD 1100 |
20 |
| -#define LEVEL5_THRESHOLD 1800 |
21 |
| -#define LEVEL6_THRESHOLD 2300 |
22 |
| -#define LEVEL7_THRESHOLD 2900 |
23 |
| -#define LEVEL8_THRESHOLD 3900 |
24 |
| -#define LEVEL9_THRESHOLD 5000 |
25 |
| -#define LEVEL10_THRESHOLD 5900 |
26 |
| -#define LEVEL11_THRESHOLD 7200 |
27 |
| -#define LEVEL12_THRESHOLD 8400 |
28 |
| -#define LEVEL13_THRESHOLD 10000 |
29 |
| -#define LEVEL14_THRESHOLD 11500 |
30 |
| -#define LEVEL15_THRESHOLD 13000 |
31 |
| -#define LEVEL16_THRESHOLD 15000 |
32 |
| -#define LEVEL17_THRESHOLD 18000 |
33 |
| -#define LEVEL18_THRESHOLD 20000 |
34 |
| -#define LEVEL19_THRESHOLD 22000 |
35 |
| -#define LEVEL20_THRESHOLD 25000 |
36 |
| -#define LEVEL21_THRESHOLD 33000 |
37 |
| -#define LEVEL22_THRESHOLD 41000 |
38 |
| -#define LEVEL23_THRESHOLD 50000 |
39 |
| -#define LEVEL24_THRESHOLD 62000 |
40 |
| -#define LEVEL25_THRESHOLD 75000 |
41 |
| -#define LEVEL26_THRESHOLD 90000 |
42 |
| -#define LEVEL27_THRESHOLD 105000 |
43 |
| -#define LEVEL28_THRESHOLD 120000 |
44 |
| -#define LEVEL29_THRESHOLD 135000 |
45 |
| -#define LEVEL30_THRESHOLD 155000 |
| 25 | +#define LEVEL_XP_REQUIREMENT_INCREMENT 3 |
| 26 | +#define LEVEL_MAX 255 |
| 27 | +#define LEVEL_XP_MAX REQUIRED_XP(LEVEL_MAX) |
46 | 28 | #define BUTTHURT_MAX 14
|
47 | 29 | #define BUTTHURT_MIN 0
|
48 | 30 |
|
@@ -107,217 +89,40 @@ uint64_t dolphin_state_timestamp() {
|
107 | 89 | }
|
108 | 90 |
|
109 | 91 | bool dolphin_state_is_levelup(uint32_t icounter) {
|
110 |
| - return (icounter == LEVEL2_THRESHOLD) || (icounter == LEVEL3_THRESHOLD) || |
111 |
| - (icounter == LEVEL4_THRESHOLD) || (icounter == LEVEL5_THRESHOLD) || |
112 |
| - (icounter == LEVEL6_THRESHOLD) || (icounter == LEVEL7_THRESHOLD) || |
113 |
| - (icounter == LEVEL8_THRESHOLD) || (icounter == LEVEL9_THRESHOLD) || |
114 |
| - (icounter == LEVEL10_THRESHOLD) || (icounter == LEVEL11_THRESHOLD) || |
115 |
| - (icounter == LEVEL12_THRESHOLD) || (icounter == LEVEL13_THRESHOLD) || |
116 |
| - (icounter == LEVEL14_THRESHOLD) || (icounter == LEVEL15_THRESHOLD) || |
117 |
| - (icounter == LEVEL16_THRESHOLD) || (icounter == LEVEL17_THRESHOLD) || |
118 |
| - (icounter == LEVEL18_THRESHOLD) || (icounter == LEVEL19_THRESHOLD) || |
119 |
| - (icounter == LEVEL20_THRESHOLD) || (icounter == LEVEL21_THRESHOLD) || |
120 |
| - (icounter == LEVEL22_THRESHOLD) || (icounter == LEVEL23_THRESHOLD) || |
121 |
| - (icounter == LEVEL24_THRESHOLD) || (icounter == LEVEL25_THRESHOLD) || |
122 |
| - (icounter == LEVEL26_THRESHOLD) || (icounter == LEVEL27_THRESHOLD) || |
123 |
| - (icounter == LEVEL28_THRESHOLD) || (icounter == LEVEL29_THRESHOLD) || |
124 |
| - (icounter == LEVEL30_THRESHOLD); |
| 92 | + if(icounter > LEVEL_XP_MAX) { |
| 93 | + return false; |
| 94 | + } |
| 95 | + |
| 96 | + return ((uint32_t)LEVEL_FOR_XP_DIVIDEND(icounter) % LEVEL_XP_REQUIREMENT_INCREMENT) == 0; |
125 | 97 | }
|
126 | 98 |
|
127 | 99 | uint8_t dolphin_get_level(uint32_t icounter) {
|
128 |
| - if(icounter <= LEVEL2_THRESHOLD) { |
129 |
| - return 1; |
130 |
| - } else if(icounter <= LEVEL3_THRESHOLD) { |
131 |
| - return 2; |
132 |
| - } else if(icounter <= LEVEL4_THRESHOLD) { |
133 |
| - return 3; |
134 |
| - } else if(icounter <= LEVEL5_THRESHOLD) { |
135 |
| - return 4; |
136 |
| - } else if(icounter <= LEVEL6_THRESHOLD) { |
137 |
| - return 5; |
138 |
| - } else if(icounter <= LEVEL7_THRESHOLD) { |
139 |
| - return 6; |
140 |
| - } else if(icounter <= LEVEL8_THRESHOLD) { |
141 |
| - return 7; |
142 |
| - } else if(icounter <= LEVEL9_THRESHOLD) { |
143 |
| - return 8; |
144 |
| - } else if(icounter <= LEVEL10_THRESHOLD) { |
145 |
| - return 9; |
146 |
| - } else if(icounter <= LEVEL11_THRESHOLD) { |
147 |
| - return 10; |
148 |
| - } else if(icounter <= LEVEL12_THRESHOLD) { |
149 |
| - return 11; |
150 |
| - } else if(icounter <= LEVEL13_THRESHOLD) { |
151 |
| - return 12; |
152 |
| - } else if(icounter <= LEVEL14_THRESHOLD) { |
153 |
| - return 13; |
154 |
| - } else if(icounter <= LEVEL15_THRESHOLD) { |
155 |
| - return 14; |
156 |
| - } else if(icounter <= LEVEL16_THRESHOLD) { |
157 |
| - return 15; |
158 |
| - } else if(icounter <= LEVEL17_THRESHOLD) { |
159 |
| - return 16; |
160 |
| - } else if(icounter <= LEVEL18_THRESHOLD) { |
161 |
| - return 16; |
162 |
| - } else if(icounter <= LEVEL19_THRESHOLD) { |
163 |
| - return 18; |
164 |
| - } else if(icounter <= LEVEL20_THRESHOLD) { |
165 |
| - return 19; |
166 |
| - } else if(icounter <= LEVEL21_THRESHOLD) { |
167 |
| - return 20; |
168 |
| - } else if(icounter <= LEVEL22_THRESHOLD) { |
169 |
| - return 21; |
170 |
| - } else if(icounter <= LEVEL23_THRESHOLD) { |
171 |
| - return 22; |
172 |
| - } else if(icounter <= LEVEL24_THRESHOLD) { |
173 |
| - return 23; |
174 |
| - } else if(icounter <= LEVEL25_THRESHOLD) { |
175 |
| - return 24; |
176 |
| - } else if(icounter <= LEVEL26_THRESHOLD) { |
177 |
| - return 25; |
178 |
| - } else if(icounter <= LEVEL27_THRESHOLD) { |
179 |
| - return 26; |
180 |
| - } else if(icounter <= LEVEL28_THRESHOLD) { |
181 |
| - return 27; |
182 |
| - } else if(icounter <= LEVEL29_THRESHOLD) { |
183 |
| - return 28; |
184 |
| - } else if(icounter <= LEVEL30_THRESHOLD) { |
185 |
| - return 29; |
186 |
| - } else { |
187 |
| - return 30; |
| 100 | + if(icounter >= LEVEL_XP_MAX) { |
| 101 | + return LEVEL_MAX; |
188 | 102 | }
|
| 103 | + |
| 104 | + return LEVEL_FOR_XP_DIVIDEND(icounter) / LEVEL_XP_REQUIREMENT_INCREMENT; |
189 | 105 | }
|
190 | 106 |
|
191 | 107 | uint32_t dolphin_state_xp_above_last_levelup(uint32_t icounter) {
|
192 |
| - uint32_t threshold = 0; |
193 |
| - if(icounter <= LEVEL2_THRESHOLD) { |
194 |
| - threshold = 0; |
195 |
| - } else if(icounter <= LEVEL3_THRESHOLD) { |
196 |
| - threshold = LEVEL2_THRESHOLD + 1; |
197 |
| - } else if(icounter <= LEVEL4_THRESHOLD) { |
198 |
| - threshold = LEVEL3_THRESHOLD + 1; |
199 |
| - } else if(icounter <= LEVEL5_THRESHOLD) { |
200 |
| - threshold = LEVEL4_THRESHOLD + 1; |
201 |
| - } else if(icounter <= LEVEL6_THRESHOLD) { |
202 |
| - threshold = LEVEL5_THRESHOLD + 1; |
203 |
| - } else if(icounter <= LEVEL7_THRESHOLD) { |
204 |
| - threshold = LEVEL6_THRESHOLD + 1; |
205 |
| - } else if(icounter <= LEVEL8_THRESHOLD) { |
206 |
| - threshold = LEVEL7_THRESHOLD + 1; |
207 |
| - } else if(icounter <= LEVEL9_THRESHOLD) { |
208 |
| - threshold = LEVEL8_THRESHOLD + 1; |
209 |
| - } else if(icounter <= LEVEL10_THRESHOLD) { |
210 |
| - threshold = LEVEL9_THRESHOLD + 1; |
211 |
| - } else if(icounter <= LEVEL11_THRESHOLD) { |
212 |
| - threshold = LEVEL10_THRESHOLD + 1; |
213 |
| - } else if(icounter <= LEVEL12_THRESHOLD) { |
214 |
| - threshold = LEVEL11_THRESHOLD + 1; |
215 |
| - } else if(icounter <= LEVEL13_THRESHOLD) { |
216 |
| - threshold = LEVEL12_THRESHOLD + 1; |
217 |
| - } else if(icounter <= LEVEL14_THRESHOLD) { |
218 |
| - threshold = LEVEL13_THRESHOLD + 1; |
219 |
| - } else if(icounter <= LEVEL15_THRESHOLD) { |
220 |
| - threshold = LEVEL14_THRESHOLD + 1; |
221 |
| - } else if(icounter <= LEVEL16_THRESHOLD) { |
222 |
| - threshold = LEVEL15_THRESHOLD + 1; |
223 |
| - } else if(icounter <= LEVEL17_THRESHOLD) { |
224 |
| - threshold = LEVEL16_THRESHOLD + 1; |
225 |
| - } else if(icounter <= LEVEL18_THRESHOLD) { |
226 |
| - threshold = LEVEL17_THRESHOLD + 1; |
227 |
| - } else if(icounter <= LEVEL19_THRESHOLD) { |
228 |
| - threshold = LEVEL18_THRESHOLD + 1; |
229 |
| - } else if(icounter <= LEVEL20_THRESHOLD) { |
230 |
| - threshold = LEVEL19_THRESHOLD + 1; |
231 |
| - } else if(icounter <= LEVEL21_THRESHOLD) { |
232 |
| - threshold = LEVEL20_THRESHOLD + 1; |
233 |
| - } else if(icounter <= LEVEL22_THRESHOLD) { |
234 |
| - threshold = LEVEL21_THRESHOLD + 1; |
235 |
| - } else if(icounter <= LEVEL23_THRESHOLD) { |
236 |
| - threshold = LEVEL22_THRESHOLD + 1; |
237 |
| - } else if(icounter <= LEVEL24_THRESHOLD) { |
238 |
| - threshold = LEVEL23_THRESHOLD + 1; |
239 |
| - } else if(icounter <= LEVEL25_THRESHOLD) { |
240 |
| - threshold = LEVEL24_THRESHOLD + 1; |
241 |
| - } else if(icounter <= LEVEL26_THRESHOLD) { |
242 |
| - threshold = LEVEL25_THRESHOLD + 1; |
243 |
| - } else if(icounter <= LEVEL27_THRESHOLD) { |
244 |
| - threshold = LEVEL26_THRESHOLD + 1; |
245 |
| - } else if(icounter <= LEVEL28_THRESHOLD) { |
246 |
| - threshold = LEVEL27_THRESHOLD + 1; |
247 |
| - } else if(icounter <= LEVEL29_THRESHOLD) { |
248 |
| - threshold = LEVEL28_THRESHOLD + 1; |
249 |
| - } else if(icounter <= LEVEL30_THRESHOLD) { |
250 |
| - threshold = LEVEL29_THRESHOLD + 1; |
251 |
| - } else { |
252 |
| - threshold = LEVEL30_THRESHOLD + 1; |
| 108 | + if(icounter >= LEVEL_XP_MAX) { |
| 109 | + return 0; |
253 | 110 | }
|
254 |
| - return icounter - threshold; |
| 111 | + |
| 112 | + uint8_t level = dolphin_get_level(icounter); |
| 113 | + uint8_t level_threshold = REQUIRED_XP(level); |
| 114 | + return icounter - (level_threshold + 1); |
255 | 115 | }
|
256 | 116 |
|
257 | 117 | uint32_t dolphin_state_xp_to_levelup(uint32_t icounter) {
|
258 |
| - uint32_t threshold = 0; |
259 |
| - if(icounter <= LEVEL2_THRESHOLD) { |
260 |
| - threshold = LEVEL2_THRESHOLD; |
261 |
| - } else if(icounter <= LEVEL3_THRESHOLD) { |
262 |
| - threshold = LEVEL3_THRESHOLD; |
263 |
| - } else if(icounter <= LEVEL4_THRESHOLD) { |
264 |
| - threshold = LEVEL4_THRESHOLD; |
265 |
| - } else if(icounter <= LEVEL5_THRESHOLD) { |
266 |
| - threshold = LEVEL5_THRESHOLD; |
267 |
| - } else if(icounter <= LEVEL6_THRESHOLD) { |
268 |
| - threshold = LEVEL6_THRESHOLD; |
269 |
| - } else if(icounter <= LEVEL7_THRESHOLD) { |
270 |
| - threshold = LEVEL7_THRESHOLD; |
271 |
| - } else if(icounter <= LEVEL8_THRESHOLD) { |
272 |
| - threshold = LEVEL8_THRESHOLD; |
273 |
| - } else if(icounter <= LEVEL9_THRESHOLD) { |
274 |
| - threshold = LEVEL9_THRESHOLD; |
275 |
| - } else if(icounter <= LEVEL10_THRESHOLD) { |
276 |
| - threshold = LEVEL10_THRESHOLD; |
277 |
| - } else if(icounter <= LEVEL11_THRESHOLD) { |
278 |
| - threshold = LEVEL11_THRESHOLD; |
279 |
| - } else if(icounter <= LEVEL12_THRESHOLD) { |
280 |
| - threshold = LEVEL12_THRESHOLD; |
281 |
| - } else if(icounter <= LEVEL13_THRESHOLD) { |
282 |
| - threshold = LEVEL13_THRESHOLD; |
283 |
| - } else if(icounter <= LEVEL14_THRESHOLD) { |
284 |
| - threshold = LEVEL14_THRESHOLD; |
285 |
| - } else if(icounter <= LEVEL15_THRESHOLD) { |
286 |
| - threshold = LEVEL15_THRESHOLD; |
287 |
| - } else if(icounter <= LEVEL16_THRESHOLD) { |
288 |
| - threshold = LEVEL16_THRESHOLD; |
289 |
| - } else if(icounter <= LEVEL17_THRESHOLD) { |
290 |
| - threshold = LEVEL17_THRESHOLD; |
291 |
| - } else if(icounter <= LEVEL18_THRESHOLD) { |
292 |
| - threshold = LEVEL18_THRESHOLD; |
293 |
| - } else if(icounter <= LEVEL19_THRESHOLD) { |
294 |
| - threshold = LEVEL19_THRESHOLD; |
295 |
| - } else if(icounter <= LEVEL20_THRESHOLD) { |
296 |
| - threshold = LEVEL20_THRESHOLD; |
297 |
| - } else if(icounter <= LEVEL21_THRESHOLD) { |
298 |
| - threshold = LEVEL21_THRESHOLD; |
299 |
| - } else if(icounter <= LEVEL22_THRESHOLD) { |
300 |
| - threshold = LEVEL22_THRESHOLD; |
301 |
| - } else if(icounter <= LEVEL23_THRESHOLD) { |
302 |
| - threshold = LEVEL23_THRESHOLD; |
303 |
| - } else if(icounter <= LEVEL24_THRESHOLD) { |
304 |
| - threshold = LEVEL24_THRESHOLD; |
305 |
| - } else if(icounter <= LEVEL25_THRESHOLD) { |
306 |
| - threshold = LEVEL25_THRESHOLD; |
307 |
| - } else if(icounter <= LEVEL26_THRESHOLD) { |
308 |
| - threshold = LEVEL26_THRESHOLD; |
309 |
| - } else if(icounter <= LEVEL27_THRESHOLD) { |
310 |
| - threshold = LEVEL27_THRESHOLD; |
311 |
| - } else if(icounter <= LEVEL28_THRESHOLD) { |
312 |
| - threshold = LEVEL28_THRESHOLD; |
313 |
| - } else if(icounter <= LEVEL29_THRESHOLD) { |
314 |
| - threshold = LEVEL29_THRESHOLD; |
315 |
| - } else if(icounter <= LEVEL30_THRESHOLD) { |
316 |
| - threshold = LEVEL30_THRESHOLD; |
317 |
| - } else { |
318 |
| - threshold = (uint32_t)-1; |
| 118 | + if(icounter >= LEVEL_XP_MAX) { |
| 119 | + return 0; |
319 | 120 | }
|
320 |
| - return threshold - icounter; |
| 121 | + |
| 122 | + uint8_t level = dolphin_get_level(icounter); |
| 123 | + uint8_t next_level = level + 1; |
| 124 | + uint8_t next_level_threshold = REQUIRED_XP(next_level); |
| 125 | + return next_level_threshold - icounter; |
321 | 126 | }
|
322 | 127 |
|
323 | 128 | void dolphin_state_on_deed(DolphinState* dolphin_state, DolphinDeed deed) {
|
|
0 commit comments