1use serde::{Deserialize, Serialize};
2
3use crate::{
4 custom_serde::{bool_from_int, bool_from_int_str, ok_or_default},
5 models::SmmoModel,
6};
7
8#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
9pub struct Item {
10 pub id: ItemId,
11
12 pub name: String,
13
14 #[serde(rename = "type")]
15 pub item_type: ItemType,
16
17 pub description: Option<String>,
18
19 #[serde(deserialize_with = "bool_from_int_str::deserialize")]
20 pub equipable: bool,
21
22 pub level: u64,
23
24 pub rarity: ItemRarity,
25
26 pub value: u64,
27
28 #[serde(deserialize_with = "ok_or_default::deserialize")]
29 pub stat1: Option<ItemStat>,
30
31 #[serde(default)]
32 pub stat1modifier: u32,
33
34 #[serde(deserialize_with = "ok_or_default::deserialize")]
35 pub stat2: Option<ItemStat>,
36
37 #[serde(default)]
38 pub stat2modifier: u32,
39
40 #[serde(deserialize_with = "ok_or_default::deserialize")]
41 pub stat3: Option<ItemStat>,
42
43 #[serde(default)]
44 pub stat3modifier: u32,
45
46 #[serde(deserialize_with = "bool_from_int::deserialize")]
47 pub custom_item: bool,
48
49 #[serde(deserialize_with = "bool_from_int::deserialize")]
50 pub tradable: bool,
51
52 #[serde(deserialize_with = "bool_from_int::deserialize")]
53 pub locked: bool,
54}
55
56#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy, Deserialize, Serialize)]
57pub struct ItemId(u64);
58
59impl SmmoModel for Item {
60 const TYPE_NAME: &'static str = "Item";
61}
62
63#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy, Deserialize, Serialize)]
64#[serde(untagged)]
65pub enum ItemType {
66 Weapon,
67 Helmet,
68 Amulet,
69 Armour,
70 Shield,
71 Greaves,
72 Boots,
73 Special,
74 Pet,
75 #[serde(rename(deserialize = "Wood Axe"))]
76 WoodAxe,
77 Pickaxe,
78 #[serde(rename(deserialize = "Fishing Rod"))]
79 FishingRod,
80 Shovel,
81 Material,
82}
83
84#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy, Deserialize, Serialize)]
85#[serde(untagged)]
86pub enum ItemRarity {
87 Common,
88 Uncommon,
89 Rare,
90 Epic,
91 Elite,
92 Legendary,
93 Exotic,
94 Celestial,
95}
96
97#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy, Deserialize, Serialize)]
98#[serde(untagged)]
99#[serde(rename_all = "lowercase")]
100pub enum ItemStat {
101 Str,
102 Def,
103 Dex,
104 Crit,
105}