zz_data/core/
magic.rs

1use serde::{Deserialize, Serialize};
2use strum::FromRepr;
3
4// region: data
5
6/// Possible magic elements. 
7#[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/// Possible types of wizform magic slot.
28#[derive(Debug, Serialize, Deserialize, Clone)]
29pub enum MagicSlotType {
30    NotExist,
31    Active,
32    Passive
33}
34
35/// Represents wizform's magic level parsed from game files.
36#[derive(Debug, Serialize, Deserialize, Clone)]
37pub struct Magic {
38    /// Level wizform must have to gain this magic
39    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
47// endregion: data
48
49// region: impls
50
51impl Magic {
52    /// Creates new instance of Magic from parsed number in wizform file. Alghoritm by RustlessWarrior.
53    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// endregion: impls