1use crate::KillEaterScoreType;
2use std::fmt;
3use serde::{Deserialize, Serialize};
4use strum::{Display, EnumCount, EnumIter, EnumString};
5
6#[derive(
8 Debug,
9 Clone,
10 Copy,
11 Eq,
12 PartialEq,
13 Ord,
14 PartialOrd,
15 Hash,
16 Display,
17 Deserialize,
18 Serialize,
19 EnumString,
20 EnumIter,
21 EnumCount,
22)]
23#[allow(missing_docs)]
24pub enum ItemLevel {
25 #[strum(serialize = "KillEaterRank")]
26 #[serde(rename = "KillEaterRank")]
27 KillEaterRank,
28 #[strum(serialize = "SpiritOfGivingRank")]
29 #[serde(rename = "SpiritOfGivingRank")]
30 SpiritOfGivingRank,
31 #[strum(serialize = "KillEater_HolidayPunchRank")]
32 #[serde(rename = "KillEater_HolidayPunchRank")]
33 KillEaterHolidayPunchRank,
34 #[strum(serialize = "KillEater_ManTreadsRank")]
35 #[serde(rename = "KillEater_ManTreadsRank")]
36 KillEaterManTreadsRank,
37 #[strum(serialize = "KillEater_SapperRank")]
38 #[serde(rename = "KillEater_SapperRank")]
39 KillEaterSapperRank,
40 #[strum(serialize = "KillEater_RobotsKilledRank")]
41 #[serde(rename = "KillEater_RobotsKilledRank")]
42 KillEaterRobotsKilledRank,
43 #[strum(serialize = "KillEater_TimeCloakedRank")]
44 #[serde(rename = "KillEater_TimeCloakedRank")]
45 KillEaterTimeCloakedRank,
46 #[strum(serialize = "KillEater_HealthGivenRank")]
47 #[serde(rename = "KillEater_HealthGivenRank")]
48 KillEaterHealthGivenRank,
49 #[strum(serialize = "KillEater_PointsScored")]
50 #[serde(rename = "KillEater_PointsScored")]
51 KillEaterPointsScored,
52 #[strum(serialize = "Journal_DuckBadge")]
53 #[serde(rename = "Journal_DuckBadge")]
54 JournalDuckBadge,
55 #[strum(serialize = "KillEater_OperationContractRank")]
56 #[serde(rename = "KillEater_OperationContractRank")]
57 KillEaterOperationContractRank,
58 #[strum(serialize = "KillEater_HalloweenSoulsRank")]
59 #[serde(rename = "KillEater_HalloweenSoulsRank")]
60 KillEaterHalloweenSoulsRank,
61 #[strum(serialize = "KillEater_ContractPointsEarnedRank")]
62 #[serde(rename = "KillEater_ContractPointsEarnedRank")]
63 KillEaterContractPointsEarnedRank,
64 #[strum(serialize = "KillEater_BackstabsAbsorbed")]
65 #[serde(rename = "KillEater_BackstabsAbsorbed")]
66 KillEaterBackstabsAbsorbed,
67}
68
69impl ItemLevel {
70 pub fn score_level(&self, score: i32) -> &'static Level {
72 let levels = self.levels();
73 let mut prev_level = &levels[levels.len() - 1];
74
75 for i in (0..levels.len()).rev() {
76 if score >= levels[i].required_score {
77 return prev_level;
78 } else {
79 prev_level = &levels[i];
80 }
81 }
82
83 &levels[0]
84 }
85
86 pub fn levels(&self) -> &'static [Level] {
88 match self {
89 Self::KillEaterRank => &[
90 Level { level: 0, required_score: 10, name: "Strange" },
91 Level { level: 1, required_score: 25, name: "Unremarkable" },
92 Level { level: 2, required_score: 45, name: "Scarcely Lethal" },
93 Level { level: 3, required_score: 70, name: "Mildly Menacing" },
94 Level { level: 4, required_score: 100, name: "Somewhat Threatening" },
95 Level { level: 5, required_score: 135, name: "Uncharitable" },
96 Level { level: 6, required_score: 175, name: "Notably Dangerous" },
97 Level { level: 7, required_score: 225, name: "Sufficiently Lethal" },
98 Level { level: 8, required_score: 275, name: "Truly Feared" },
99 Level { level: 9, required_score: 350, name: "Spectacularly Lethal" },
100 Level { level: 10, required_score: 500, name: "Gore-Spattered" },
101 Level { level: 11, required_score: 750, name: "Wicked Nasty" },
102 Level { level: 12, required_score: 999, name: "Positively Inhumane" },
103 Level { level: 13, required_score: 1000, name: "Totally Ordinary" },
104 Level { level: 14, required_score: 1500, name: "Face-Melting" },
105 Level { level: 15, required_score: 2500, name: "Rage-Inducing" },
106 Level { level: 16, required_score: 5000, name: "Server-Clearing" },
107 Level { level: 17, required_score: 7500, name: "Epic" },
108 Level { level: 18, required_score: 7616, name: "Legendary" },
109 Level { level: 19, required_score: 8500, name: "Australian" },
110 Level { level: 20, required_score: 10000, name: "Hale's Own" },
111 ],
112 Self::SpiritOfGivingRank => &[
113 Level { level: 0, required_score: 1, name: "The" },
114 Level { level: 1, required_score: 3, name: "The Baseline Benefactor's" },
115 Level { level: 2, required_score: 7, name: "The Competent Contributor's" },
116 Level { level: 3, required_score: 12, name: "The Adequate Altruist's" },
117 Level { level: 4, required_score: 20, name: "The Satisfactory Santa's" },
118 Level { level: 5, required_score: 28, name: "The Sufficient Samaritan's" },
119 Level { level: 6, required_score: 37, name: "The Distinguished Donator's" },
120 Level { level: 7, required_score: 47, name: "The Dynamic Do-Gooder's" },
121 Level { level: 8, required_score: 57, name: "The Consumate Contributor's" },
122 Level { level: 9, required_score: 68, name: "The Baron of Bequeathment's" },
123 Level { level: 10, required_score: 79, name: "The Lord of Largesse's" },
124 Level { level: 11, required_score: 91, name: "The Chieftain of Charity's" },
125 Level { level: 12, required_score: 104, name: "The Generalissimo of Generosity's" },
126 Level { level: 13, required_score: 120, name: "The Bigshot Benefactor's" },
127 Level { level: 14, required_score: 138, name: "The Caesar of Pleasers'" },
128 Level { level: 15, required_score: 158, name: "The First-Class Philanthropist's" },
129 Level { level: 16, required_score: 179, name: "The Humanitarian Hotshot's" },
130 Level { level: 17, required_score: 210, name: "The Selfless Samaritan's" },
131 Level { level: 18, required_score: 250, name: "The Uber-Altruist's" },
132 Level { level: 19, required_score: 500, name: "Saxton's Own" },
133 ],
134 Self::KillEaterHolidayPunchRank => &[
135 Level { level: 0, required_score: 10, name: "Strange" },
136 Level { level: 1, required_score: 25, name: "Unremarkable" },
137 Level { level: 2, required_score: 45, name: "Almost Amusing" },
138 Level { level: 3, required_score: 70, name: "Mildly Mirthful" },
139 Level { level: 4, required_score: 100, name: "Somewhat Droll" },
140 Level { level: 5, required_score: 135, name: "Thigh-Slapping" },
141 Level { level: 6, required_score: 175, name: "Notably Cheery" },
142 Level { level: 7, required_score: 225, name: "Sufficiently Wry" },
143 Level { level: 8, required_score: 275, name: "Truly Feared" },
144 Level { level: 9, required_score: 350, name: "Spectacularly Jocular" },
145 Level { level: 10, required_score: 500, name: "Riotous" },
146 Level { level: 11, required_score: 749, name: "Wicked Funny" },
147 Level { level: 12, required_score: 750, name: "Totally Unamusing" },
148 Level { level: 13, required_score: 1000, name: "Positively Persiflagious" },
149 Level { level: 14, required_score: 1500, name: "Frown-Annihilating" },
150 Level { level: 15, required_score: 2500, name: "Grin-Inducing" },
151 Level { level: 16, required_score: 5000, name: "Server-Clearing" },
152 Level { level: 17, required_score: 7500, name: "Epic" },
153 Level { level: 18, required_score: 7923, name: "Legendary" },
154 Level { level: 19, required_score: 8500, name: "Australian" },
155 Level { level: 20, required_score: 10000, name: "Mann Co. Select" },
156 ],
157 Self::KillEaterManTreadsRank => &[
158 Level { level: 0, required_score: 1, name: "Strange" },
159 Level { level: 1, required_score: 3, name: "Broken-In" },
160 Level { level: 2, required_score: 5, name: "Scarcely Worn" },
161 Level { level: 3, required_score: 7, name: "Mildly Minatory" },
162 Level { level: 4, required_score: 10, name: "Crushingly Crushing" },
163 Level { level: 5, required_score: 14, name: "Inauspicious" },
164 Level { level: 6, required_score: 18, name: "Profoundly Penumbric" },
165 Level { level: 7, required_score: 23, name: "Sufficiently Eclipsing" },
166 Level { level: 8, required_score: 28, name: "Truly Tenebrific" },
167 Level { level: 9, required_score: 35, name: "Spectacularly Fell" },
168 Level { level: 10, required_score: 50, name: "Fashion-Splattered" },
169 Level { level: 11, required_score: 75, name: "Wicked Stinky" },
170 Level { level: 12, required_score: 99, name: "Positively Planar" },
171 Level { level: 13, required_score: 100, name: "Totally Comfortable" },
172 Level { level: 14, required_score: 150, name: "Face-Flattening" },
173 Level { level: 15, required_score: 250, name: "Rage-Inducing" },
174 Level { level: 16, required_score: 500, name: "Server-Clearing" },
175 Level { level: 17, required_score: 750, name: "Epic" },
176 Level { level: 18, required_score: 784, name: "Legendary" },
177 Level { level: 19, required_score: 850, name: "Australian" },
178 Level { level: 20, required_score: 1000, name: "Hale's Custom" },
179 ],
180 Self::KillEaterSapperRank => &[
181 Level { level: 0, required_score: 3, name: "Strange" },
182 Level { level: 1, required_score: 9, name: "Unremarkable" },
183 Level { level: 2, required_score: 15, name: "Scarcely Shocking" },
184 Level { level: 3, required_score: 21, name: "Mildly Magnetizing" },
185 Level { level: 4, required_score: 30, name: "Somewhat Inducting" },
186 Level { level: 5, required_score: 42, name: "Unfortunate" },
187 Level { level: 6, required_score: 54, name: "Notably Deleterious" },
188 Level { level: 7, required_score: 69, name: "Sufficiently Ruinous" },
189 Level { level: 8, required_score: 84, name: "Truly Conducting" },
190 Level { level: 9, required_score: 105, name: "Spectacularly Pseudoful" },
191 Level { level: 10, required_score: 150, name: "Ion-Spattered" },
192 Level { level: 11, required_score: 225, name: "Wickedly Dynamizing" },
193 Level { level: 12, required_score: 299, name: "Positively Plasmatic" },
194 Level { level: 13, required_score: 300, name: "Totally Ordinary" },
195 Level { level: 14, required_score: 450, name: "Circuit-Melting" },
196 Level { level: 15, required_score: 750, name: "Nullity-Inducing" },
197 Level { level: 16, required_score: 1500, name: "Server-Clearing" },
198 Level { level: 17, required_score: 2250, name: "Epic" },
199 Level { level: 18, required_score: 2345, name: "Legendary" },
200 Level { level: 19, required_score: 2550, name: "Australian" },
201 Level { level: 20, required_score: 3000, name: "Mann Co. Select" },
202 ],
203 Self::KillEaterRobotsKilledRank => &[
204 Level { level: 0, required_score: 100, name: "KillEater_RobotsKilledRank0" },
205 Level { level: 1, required_score: 250, name: "KillEater_RobotsKilledRank1" },
206 Level { level: 2, required_score: 450, name: "KillEater_RobotsKilledRank2" },
207 Level { level: 3, required_score: 700, name: "KillEater_RobotsKilledRank3" },
208 Level { level: 4, required_score: 1000, name: "KillEater_RobotsKilledRank4" },
209 Level { level: 5, required_score: 1350, name: "KillEater_RobotsKilledRank5" },
210 Level { level: 6, required_score: 1750, name: "KillEater_RobotsKilledRank6" },
211 Level { level: 7, required_score: 2250, name: "KillEater_RobotsKilledRank7" },
212 Level { level: 8, required_score: 2750, name: "KillEater_RobotsKilledRank8" },
213 Level { level: 9, required_score: 3500, name: "KillEater_RobotsKilledRank9" },
214 Level { level: 10, required_score: 5000, name: "KillEater_RobotsKilledRank10" },
215 Level { level: 11, required_score: 7500, name: "KillEater_RobotsKilledRank11" },
216 Level { level: 12, required_score: 9990, name: "KillEater_RobotsKilledRank12" },
217 Level { level: 13, required_score: 10000, name: "KillEater_RobotsKilledRank13" },
218 Level { level: 14, required_score: 15000, name: "KillEater_RobotsKilledRank14" },
219 Level { level: 15, required_score: 25000, name: "KillEater_RobotsKilledRank15" },
220 Level { level: 16, required_score: 50000, name: "KillEater_RobotsKilledRank16" },
221 Level { level: 17, required_score: 75000, name: "KillEater_RobotsKilledRank17" },
222 Level { level: 18, required_score: 76160, name: "KillEater_RobotsKilledRank18" },
223 Level { level: 19, required_score: 85000, name: "KillEater_RobotsKilledRank19" },
224 Level { level: 20, required_score: 100000, name: "KillEater_RobotsKilledRank20" },
225 ],
226 Self::KillEaterTimeCloakedRank => &[
227 Level { level: 0, required_score: 200, name: "Strange" },
228 Level { level: 1, required_score: 500, name: "Unremarkable" },
229 Level { level: 2, required_score: 900, name: "Scarcely Shocking" },
230 Level { level: 3, required_score: 1337, name: "Mildly Magnetizing" },
231 Level { level: 4, required_score: 2000, name: "Somewhat Inducting" },
232 Level { level: 5, required_score: 2700, name: "Unfortunate" },
233 Level { level: 6, required_score: 3500, name: "Notably Deleterious" },
234 Level { level: 7, required_score: 4500, name: "Sufficiently Ruinous" },
235 Level { level: 8, required_score: 5500, name: "Truly Conducting" },
236 Level { level: 9, required_score: 7000, name: "Spectacularly Pseudoful" },
237 Level { level: 10, required_score: 9000, name: "Ion-Spattered" },
238 Level { level: 11, required_score: 12000, name: "Wickedly Dynamizing" },
239 Level { level: 12, required_score: 16000, name: "Positively Plasmatic" },
240 Level { level: 13, required_score: 21337, name: "Totally Ordinary" },
241 Level { level: 14, required_score: 35000, name: "Circuit-Melting" },
242 Level { level: 15, required_score: 58007, name: "Nullity-Inducing" },
243 Level { level: 16, required_score: 90000, name: "Server-Clearing" },
244 Level { level: 17, required_score: 120000, name: "Epic" },
245 Level { level: 18, required_score: 140000, name: "Legendary" },
246 Level { level: 19, required_score: 160000, name: "Australian" },
247 Level { level: 20, required_score: 200000, name: "Mann Co. Select" },
248 ],
249 Self::KillEaterHealthGivenRank => &[
250 Level { level: 0, required_score: 2000, name: "Strange" },
251 Level { level: 1, required_score: 5000, name: "Unremarkable" },
252 Level { level: 2, required_score: 9000, name: "Scarcely Shocking" },
253 Level { level: 3, required_score: 13370, name: "Mildly Magnetizing" },
254 Level { level: 4, required_score: 20000, name: "Somewhat Inducting" },
255 Level { level: 5, required_score: 27000, name: "Unfortunate" },
256 Level { level: 6, required_score: 35000, name: "Notably Deleterious" },
257 Level { level: 7, required_score: 45000, name: "Sufficiently Ruinous" },
258 Level { level: 8, required_score: 55000, name: "Truly Conducting" },
259 Level { level: 9, required_score: 70000, name: "Spectacularly Pseudoful" },
260 Level { level: 10, required_score: 90000, name: "Ion-Spattered" },
261 Level { level: 11, required_score: 120000, name: "Wickedly Dynamizing" },
262 Level { level: 12, required_score: 160000, name: "Positively Plasmatic" },
263 Level { level: 13, required_score: 213370, name: "Totally Ordinary" },
264 Level { level: 14, required_score: 350000, name: "Circuit-Melting" },
265 Level { level: 15, required_score: 518008, name: "Nullity-Inducing" },
266 Level { level: 16, required_score: 900000, name: "Server-Clearing" },
267 Level { level: 17, required_score: 1200000, name: "Epic" },
268 Level { level: 18, required_score: 1400000, name: "Legendary" },
269 Level { level: 19, required_score: 1600000, name: "Australian" },
270 Level { level: 20, required_score: 2000000, name: "Mann Co. Select" },
271 ],
272 Self::KillEaterPointsScored => &[
273 Level { level: 0, required_score: 15, name: "Strange" },
274 Level { level: 1, required_score: 30, name: "Ragged" },
275 Level { level: 2, required_score: 50, name: "Tacky" },
276 Level { level: 3, required_score: 75, name: "Secondhand" },
277 Level { level: 4, required_score: 100, name: "Odious" },
278 Level { level: 5, required_score: 135, name: "Garish" },
279 Level { level: 6, required_score: 175, name: "Comfortable" },
280 Level { level: 7, required_score: 250, name: "Dapper" },
281 Level { level: 8, required_score: 375, name: "Sharp" },
282 Level { level: 9, required_score: 500, name: "Fancy" },
283 Level { level: 10, required_score: 725, name: "Fancy Shmancy" },
284 Level { level: 11, required_score: 1000, name: "Fashionable" },
285 Level { level: 12, required_score: 1500, name: "Glamorous" },
286 Level { level: 13, required_score: 2000, name: "Posh" },
287 Level { level: 14, required_score: 2750, name: "Fabulous" },
288 Level { level: 15, required_score: 4000, name: "Stunning" },
289 Level { level: 16, required_score: 5500, name: "Epic" },
290 Level { level: 17, required_score: 7500, name: "Legendary" },
291 Level { level: 18, required_score: 10000, name: "Australian" },
292 Level { level: 19, required_score: 15000, name: "Mann Co. Select" },
293 Level { level: 20, required_score: 25000, name: "Mannceaux Signature Collection" },
294 ],
295 Self::JournalDuckBadge => &[
296 Level { level: 0, required_score: 1, name: "" },
297 Level { level: 1, required_score: 2, name: "Crumb Chasing " },
298 Level { level: 2, required_score: 3, name: "Kinda Ducky " },
299 Level { level: 3, required_score: 4, name: "Fairly Fowl " },
300 Level { level: 4, required_score: 5, name: "Somewhat Quackworthy " },
301 Level { level: 5, required_score: 6, name: "Quacknowledged " },
302 Level { level: 6, required_score: 7, name: "Duckstinguished " },
303 Level { level: 7, required_score: 8, name: "Pleasantly Paddling " },
304 Level { level: 8, required_score: 9, name: "Perfectly Preened " },
305 Level { level: 9, required_score: 10, name: "Duckalicious " },
306 Level { level: 10, required_score: 11, name: "Quacktastic " },
307 Level { level: 12, required_score: 13, name: "Feather-Ruffling " },
308 Level { level: 6, required_score: 10000, name: "Cheerful" },
309 Level { level: 7, required_score: 12000, name: "Joyous" },
310 Level { level: 8, required_score: 14000, name: "Dignified" },
311 Level { level: 9, required_score: 16000, name: "Proud" },
312 Level { level: 10, required_score: 18000, name: "Noble" },
313 Level { level: 11, required_score: 20000, name: "Honored" },
314 Level { level: 12, required_score: 22000, name: "Exalted" },
315 Level { level: 13, required_score: 24000, name: "Breathtaking" },
316 Level { level: 14, required_score: 26000, name: "Outrageous" },
317 Level { level: 15, required_score: 28000, name: "Spectacular" },
318 Level { level: 16, required_score: 30000, name: "Majestic" },
319 Level { level: 17, required_score: 32000, name: "Epic" },
320 Level { level: 18, required_score: 34000, name: "Legendary" },
321 Level { level: 19, required_score: 36000, name: "Australian" },
322 Level { level: 20, required_score: 38000, name: "Merasmus's Own" },
323 ],
324 Self::KillEaterOperationContractRank => &[
325 Level { level: 0, required_score: 2500, name: "Gravel" },
326 Level { level: 1, required_score: 5000, name: "Bronze" },
327 Level { level: 2, required_score: 6840, name: "Silver" },
328 Level { level: 3, required_score: 6840, name: "Australium" },
329 ],
330 Self::KillEaterHalloweenSoulsRank => &[
331 Level { level: 0, required_score: 666, name: "Sad" },
332 Level { level: 1, required_score: 1337, name: "Silly" },
333 Level { level: 2, required_score: 2000, name: "Sneering" },
334 Level { level: 3, required_score: 4000, name: "Happy" },
335 Level { level: 4, required_score: 6000, name: "Pleased" },
336 Level { level: 5, required_score: 8000, name: "Delighted" },
337 Level { level: 6, required_score: 10000, name: "Cheerful" },
338 Level { level: 7, required_score: 12000, name: "Joyous" },
339 Level { level: 8, required_score: 14000, name: "Dignified" },
340 Level { level: 9, required_score: 16000, name: "Proud" },
341 Level { level: 10, required_score: 18000, name: "Noble" },
342 Level { level: 11, required_score: 20000, name: "Honored" },
343 Level { level: 12, required_score: 22000, name: "Exalted" },
344 Level { level: 13, required_score: 24000, name: "Breathtaking" },
345 Level { level: 14, required_score: 26000, name: "Outrageous" },
346 Level { level: 15, required_score: 28000, name: "Spectacular" },
347 Level { level: 16, required_score: 30000, name: "Majestic" },
348 Level { level: 17, required_score: 32000, name: "Epic" },
349 Level { level: 18, required_score: 34000, name: "Legendary" },
350 Level { level: 19, required_score: 36000, name: "Australian" },
351 Level { level: 20, required_score: 38000, name: "Merasmus's Own" },
352 ],
353 Self::KillEaterContractPointsEarnedRank => &[
354 Level { level: 0, required_score: 2500, name: "Gravel" },
355 Level { level: 1, required_score: 5000, name: "Bronze" },
356 Level { level: 2, required_score: 6840, name: "Silver" },
357 Level { level: 3, required_score: 6840, name: "Australium" },
358 ],
359 Self::KillEaterBackstabsAbsorbed => &[
360 Level { level: 0, required_score: 1, name: "Strange" },
361 Level { level: 1, required_score: 3, name: "Unremarkable" },
362 Level { level: 2, required_score: 5, name: "Scarcely Lethal" },
363 Level { level: 3, required_score: 7, name: "Mildly Menacing" },
364 Level { level: 4, required_score: 10, name: "Somewhat Threatening" },
365 Level { level: 5, required_score: 14, name: "Uncharitable" },
366 Level { level: 6, required_score: 18, name: "Notably Dangerous" },
367 Level { level: 7, required_score: 23, name: "Sufficiently Lethal" },
368 Level { level: 8, required_score: 28, name: "Truly Feared" },
369 Level { level: 9, required_score: 35, name: "Spectacularly Lethal" },
370 Level { level: 10, required_score: 50, name: "Gore-Spattered" },
371 Level { level: 11, required_score: 75, name: "Wicked Nasty" },
372 Level { level: 12, required_score: 99, name: "Positively Inhumane" },
373 Level { level: 13, required_score: 100, name: "Totally Ordinary" },
374 Level { level: 14, required_score: 150, name: "Face-Melting" },
375 Level { level: 15, required_score: 250, name: "Rage-Inducing" },
376 Level { level: 16, required_score: 500, name: "Server-Clearing" },
377 Level { level: 17, required_score: 750, name: "Epic" },
378 Level { level: 18, required_score: 784, name: "Legendary" },
379 Level { level: 19, required_score: 850, name: "Australian" },
380 Level { level: 20, required_score: 1000, name: "Hale's Own" },
381 ],
382 }
383 }
384}
385
386impl From<KillEaterScoreType> for ItemLevel {
387 fn from(score_type: KillEaterScoreType) -> Self {
388 match score_type {
389 KillEaterScoreType::Kills |
390 KillEaterScoreType::Ubers |
391 KillEaterScoreType::KillAssists |
392 KillEaterScoreType::SentryKills |
393 KillEaterScoreType::SoddenVictims |
394 KillEaterScoreType::HeadsTaken |
395 KillEaterScoreType::Humiliations |
396 KillEaterScoreType::DeathsFeigned |
397 KillEaterScoreType::ScoutsKilled |
398 KillEaterScoreType::SnipersKilled |
399 KillEaterScoreType::SoldiersKilled |
400 KillEaterScoreType::DemomenKilled |
401 KillEaterScoreType::HeaviesKilled |
402 KillEaterScoreType::PyrosKilled |
403 KillEaterScoreType::SpiesKilled |
404 KillEaterScoreType::EngineersKilled |
405 KillEaterScoreType::MedicsKilled |
406 KillEaterScoreType::BuildingsDestroyed |
407 KillEaterScoreType::ProjectilesReflected |
408 KillEaterScoreType::HeadshotKills |
409 KillEaterScoreType::AirborneEnemyKills |
410 KillEaterScoreType::GibKills |
411 KillEaterScoreType::KillsUnderAFullMoon |
412 KillEaterScoreType::Dominations |
413 KillEaterScoreType::Revenges |
414 KillEaterScoreType::PosthumousKills |
415 KillEaterScoreType::TeammatesExtinguished |
416 KillEaterScoreType::CriticalKills |
417 KillEaterScoreType::KillsWhileExplosiveJumping |
418 KillEaterScoreType::SappersRemoved |
419 KillEaterScoreType::CloakedSpiesKilled |
420 KillEaterScoreType::MedicsKilledThatHaveFullUberCharge |
421 KillEaterScoreType::KillsWhileLowHealth |
422 KillEaterScoreType::KillsDuringHalloween |
423 KillEaterScoreType::RobotsKilledDuringHalloween |
424 KillEaterScoreType::DefenderKills |
425 KillEaterScoreType::SubmergedEnemyKills |
426 KillEaterScoreType::KillsWhileInvulnUberCharged |
427 KillEaterScoreType::FoodItemsEaten |
428 KillEaterScoreType::BannersDeployed |
429 KillEaterScoreType::TeammatesTeleported |
430 KillEaterScoreType::TanksDestroyed |
431 KillEaterScoreType::LongDistanceKills |
432 KillEaterScoreType::KillEaterEventUniquePlayerKills |
433 KillEaterScoreType::DoubleDonks |
434 KillEaterScoreType::TeammatesWhipped |
435 KillEaterScoreType::KillsDuringVictoryTime |
436 KillEaterScoreType::TauntKills |
437 KillEaterScoreType::UnusualWearingPlayerKills |
438 KillEaterScoreType::BurningPlayerKills |
439 KillEaterScoreType::KillstreaksEnded |
440 KillEaterScoreType::FreezecamTauntAppearances |
441 KillEaterScoreType::DamageDealt |
442 KillEaterScoreType::FiresSurvived |
443 KillEaterScoreType::AlliedHealingDone |
444 KillEaterScoreType::PointBlankKills |
445 KillEaterScoreType::WrangledSentryKills |
446 KillEaterScoreType::CosmeticKills |
447 KillEaterScoreType::FullHealthKills |
448 KillEaterScoreType::TauntingPlayerKills |
449 KillEaterScoreType::CarnivalKills |
450 KillEaterScoreType::CarnivalUnderworldKills |
451 KillEaterScoreType::CarnivalGamesWon |
452 KillEaterScoreType::NotCritNorMiniCritKills |
453 KillEaterScoreType::PlayerHits |
454 KillEaterScoreType::Assists |
455 KillEaterScoreType::ContractsCompleted |
456 KillEaterScoreType::ContractKills |
457 KillEaterScoreType::ContractBonusPoints |
458 KillEaterScoreType::TimesPerformed |
459 KillEaterScoreType::KillsAndAssistsDuringInvasionEvent |
460 KillEaterScoreType::KillsAndAssistsOn2FortInvasion |
461 KillEaterScoreType::KillsAndAssistsOnProbed |
462 KillEaterScoreType::KillsAndAssistsOnByre |
463 KillEaterScoreType::KillsAndAssistsOnWatergate |
464 KillEaterScoreType::MerasmissionsCompleted |
465 KillEaterScoreType::HalloweenTransmutesPerformed |
466 KillEaterScoreType::PowerUpCanteensUsed |
467 KillEaterScoreType::ContractPointsContributedToFriends => Self::KillEaterRank,
468 KillEaterScoreType::SpiesShocked => Self::KillEaterBackstabsAbsorbed,
469 KillEaterScoreType::GiftsGiven => Self::SpiritOfGivingRank,
470 KillEaterScoreType::BuildingsSapped => Self::KillEaterSapperRank,
471 KillEaterScoreType::TickleFightsWon => Self::KillEaterHolidayPunchRank,
472 KillEaterScoreType::OpponentsFlattened => Self::KillEaterManTreadsRank,
473 KillEaterScoreType::RobotsDestroyed |
474 KillEaterScoreType::GiantRobotsDestroyed |
475 KillEaterScoreType::RobotScoutsDestroyed |
476 KillEaterScoreType::RobotSpiesDestroyed => Self::KillEaterRobotsKilledRank,
477 KillEaterScoreType::SecondsCloaked => Self::KillEaterTimeCloakedRank,
478 KillEaterScoreType::HealthDispensedToTeammates => Self::KillEaterHealthGivenRank,
479 KillEaterScoreType::PointsScored => Self::KillEaterPointsScored,
480 KillEaterScoreType::ContractPoints => Self::KillEaterOperationContractRank,
481 KillEaterScoreType::SoulsCollected => Self::KillEaterHalloweenSoulsRank,
482 KillEaterScoreType::ContractPointsEarned => Self::KillEaterContractPointsEarnedRank,
483 }
484 }
485}
486
487impl From<&KillEaterScoreType> for ItemLevel {
488 fn from(score_type: &KillEaterScoreType) -> Self {
489 (*score_type).into()
490 }
491}
492
493#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
495pub struct Level {
496 pub level: u32,
498 pub required_score: i32,
500 pub name: &'static str,
502}
503
504impl fmt::Display for Level {
505 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
506 write!(f, "{}", self.name.trim())
507 }
508}
509
510#[cfg(test)]
511mod tests {
512 use super::*;
513
514 #[test]
515 fn hales_own() {
516 assert_eq!(ItemLevel::KillEaterRank.score_level(9000).name, "Hale's Own");
517 assert_eq!(ItemLevel::KillEaterRank.score_level(11000).name, "Hale's Own");
518 }
519
520 #[test]
521 fn strange_rank() {
522 assert_eq!(ItemLevel::KillEaterRank.score_level(4).name, "Strange");
523 assert_eq!(ItemLevel::KillEaterRank.score_level(15).name, "Unremarkable");
524 }
525
526 #[test]
527 fn deserializes() {
528 let json = r#""KillEater_HolidayPunchRank""#;
529 let deserialized: ItemLevel = serde_json::from_str(json).unwrap();
530 assert_eq!(deserialized, ItemLevel::KillEaterHolidayPunchRank);
531
532 let serialized = serde_json::to_string(&deserialized).unwrap();
533 assert_eq!(serialized, json);
534 }
535}