1use serde::{Deserialize, Serialize};
2use strum::FromRepr;
3
4#[derive(Debug, Serialize, Deserialize, FromRepr, Clone)]
8#[repr(u8)]
9pub enum MagicElementType {
10 None = 0,
11 Nature = 1,
12 Air = 2,
13 Water = 3,
14 Light = 4,
15 Energy = 5,
16 Psi = 6,
17 Stone = 7,
18 Ice = 8,
19 Fire = 9,
20 Dark = 10,
21 Chaos = 11,
22 Metall = 12,
23 Joker = 13,
24 Error = 14
25}
26
27#[derive(Debug, Serialize, Deserialize, Clone)]
29pub enum MagicSlotType {
30 NotExist,
31 Active,
32 Passive
33}
34
35#[derive(Debug, Serialize, Deserialize, Clone)]
37pub struct Magic {
38 pub level: u16,
40 pub slot_type: MagicSlotType,
41 pub slot_number: u8,
42 pub first_element: MagicElementType,
43 pub second_element: MagicElementType,
44 pub third_element: MagicElementType
45}
46
47impl Magic {
52 pub fn new(_m: i32, n: i32) -> Magic {
54 if n == -1 {
55 Magic {
56 level: 0,
57 slot_type: MagicSlotType::NotExist,
58 slot_number: 0,
59 first_element: MagicElementType::None,
60 second_element: MagicElementType::None,
61 third_element: MagicElementType::None
62 }
63 }
64 else {
65 let magics_hex = format!("{:#010x}", n);
66 let magics_entities: Vec<&str> = magics_hex.split("").collect();
67 let level = u16::from_str_radix(&format!("{}{}", &magics_entities[5], &magics_entities[6]), 16).unwrap();
68 let slot = u8::from_str_radix(&format!("{}", &magics_entities[7]), 16).unwrap() + 1;
69 let first_element = u8::from_str_radix(&format!("{}", &magics_entities[8]), 16).unwrap();
70 let second_element = u8::from_str_radix(&format!("{}", &magics_entities[9]), 16).unwrap();
71 let third_element = u8::from_str_radix(&format!("{}", &magics_entities[10]), 16).unwrap();
72 Magic {
73 level: level,
74 slot_number: slot,
75 slot_type: if slot % 2 == 0 {MagicSlotType::Passive} else {MagicSlotType::Active},
76 first_element: MagicElementType::from_repr(first_element).unwrap(),
77 second_element: MagicElementType::from_repr(second_element).unwrap(),
78 third_element: MagicElementType::from_repr(third_element).unwrap()
79 }
80 }
81 }
82}
83
84