tf2_enum/
item_level.rs

1use crate::KillEaterScoreType;
2use std::fmt;
3use serde::{Deserialize, Serialize};
4use strum::{Display, EnumCount, EnumIter, EnumString};
5
6/// Item level.
7#[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    /// Gets the level for a given `score`.
71    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    /// Gets the levels for this [`ItemLevel`].
87    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/// Level belonging to an [`ItemLevel`].
494#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
495pub struct Level {
496    /// The level. In practice, this starts at 0 and increments with each level for a given rank.
497    pub level: u32,
498    /// The required score.
499    pub required_score: i32,
500    /// The name of this level.
501    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}