1use super::Item;
2use std::{mem, ops::RangeInclusive};
3
4const ID_RANGE: RangeInclusive<i32> = 1..=5455;
5
6impl super::Item {
7 pub fn to_id(self, version: i32) -> i32 {
8 let id = self as i32;
9 if version > 146 {
10 return id;
11 }
12
13 match id {
14 3769 => -24,
15 3768 => -23,
16 3767 => -22,
17 3766 => -21,
18 3765 => -20,
19 3764 => -19,
20 3480 => -48,
21 3481 => -47,
22 3482 => -46,
23 3483 => -45,
24 3484 => -44,
25 3485 => -43,
26 3486 => -42,
27 3487 => -41,
28 3488 => -40,
29 3489 => -39,
30 3490 => -38,
31 3491 => -37,
32 3492 => -36,
33 3493 => -35,
34 3494 => -34,
35 3495 => -33,
36 3496 => -32,
37 3497 => -31,
38 3498 => -30,
39 3499 => -29,
40 3500 => -28,
41 3501 => -27,
42 3502 => -26,
43 3503 => -25,
44 3504 => -18,
45 3505 => -17,
46 3506 => -16,
47 3507 => -15,
48 3508 => -14,
49 3509 => -13,
50 3510 => -12,
51 3511 => -11,
52 3512 => -10,
53 3513 => -9,
54 3514 => -8,
55 3515 => -7,
56 3516 => -6,
57 3517 => -5,
58 3518 => -4,
59 3519 => -3,
60 3520 => -2,
61 3521 => -1,
62 _ => id,
63 }
64 }
65
66 pub fn from_id(id: i32, _version: i32) -> Option<Self> {
67 let id = match id {
68 -24 => 3769,
69 -23 => 3768,
70 -22 => 3767,
71 -21 => 3766,
72 -20 => 3765,
73 -19 => 3764,
74 -48 => 3480,
75 -47 => 3481,
76 -46 => 3482,
77 -45 => 3483,
78 -44 => 3484,
79 -43 => 3485,
80 -42 => 3486,
81 -41 => 3487,
82 -40 => 3488,
83 -39 => 3489,
84 -38 => 3490,
85 -37 => 3491,
86 -36 => 3492,
87 -35 => 3493,
88 -34 => 3494,
89 -33 => 3495,
90 -32 => 3496,
91 -31 => 3497,
92 -30 => 3498,
93 -29 => 3499,
94 -28 => 3500,
95 -27 => 3501,
96 -26 => 3502,
97 -25 => 3503,
98 -18 => 3504,
99 -17 => 3505,
100 -16 => 3506,
101 -15 => 3507,
102 -14 => 3508,
103 -13 => 3509,
104 -12 => 3510,
105 -11 => 3511,
106 -10 => 3512,
107 -9 => 3513,
108 -8 => 3514,
109 -7 => 3515,
110 -6 => 3516,
111 -5 => 3517,
112 -4 => 3518,
113 -3 => 3519,
114 -2 => 3520,
115 -1 => 3521,
116 _ => id,
117 };
118
119 if !ID_RANGE.contains(&id) {
120 return None;
121 }
122
123 Some(unsafe { mem::transmute::<i32, Item>(id) })
124 }
125}