1use crate::prelude::*;
2use enum_iterator::Sequence;
3use strum_macros::{Display, EnumIter, EnumString};
4
5use crate::currency::CurrencyUnit;
6use crate::items::ItemRarityId;
7
8#[declare]
9pub type SkinId = Uuid;
10
11#[derive(
12 Debug,
13 Clone,
14 Copy,
15 EnumString,
16 Sequence,
17 Display,
18 Deserialize,
19 Serialize,
20 Hash,
21 Eq,
22 PartialEq,
23 EnumIter,
24 Default,
25 JsonSchema,
26 Tsify,
27)]
28#[tsify(namespace)]
29pub enum SkinType {
30 #[default]
31 Face,
32 Armor,
33 Glove,
34 Hairstyle,
35 Shoulder,
36 Weapon,
37 HairColor,
38 SkinColor,
39 Helmet,
40}
41
42#[derive(
43 Default,
44 PartialEq,
45 Eq,
46 Hash,
47 Debug,
48 Clone,
49 Serialize,
50 Deserialize,
51 Tsify,
52 JsonSchema,
53 i18n::Translate,
54)]
55pub struct ConfigSkin {
56 #[schemars(schema_with = "id_schema")]
57 pub id: SkinId,
58
59 #[schemars(title = "Название скина")]
60 #[translate]
61 pub name: i18n::I18nString,
62
63 #[schemars(title = "Условие анлока")]
64 #[translate]
65 pub unlock_description: Option<i18n::I18nString>,
66
67 #[schemars(title = "Код скина (строковый идентификатор для Spine)")]
68 pub code: String,
69
70 #[schemars(title = "Тип скина")]
71 pub skin_type: SkinType,
72
73 #[schemars(title = "URL иконки скина", schema_with = "webp_url_schema")]
74 pub icon_url: String,
75
76 #[schemars(
77 title = "Путь иконки скина",
78 schema_with = "asset_hero_skin_icon_schema"
79 )]
80 pub icon_path: String,
81
82 #[schemars(title = "Спайн скин", schema_with = "asset_hero_skin_spine_schema")]
83 pub spine_path: String,
84
85 #[schemars(title = "Id редкости", schema_with = "item_rarity_link_id_schema")]
86 pub rarity_id: ItemRarityId,
87
88 #[schemars(title = "Стоимость скина")]
89 pub price: Option<Vec<CurrencyUnit>>,
90
91 #[schemars(title = "HEX-цвет в интерфейсе (для цветовых скинов)")]
92 pub color: Option<String>,
93}
94
95#[derive(Default, PartialEq, Eq, Debug, Clone, Serialize, Deserialize, JsonSchema, Tsify)]
96pub struct SkinsSettings {
97 #[schemars(
98 title = "Скины, разблокируемые по умолчанию при создании персонажа",
99 schema_with = "skin_link_id_array_schema"
100 )]
101 pub default_unlocked_skins: Vec<SkinId>,
102
103 #[schemars(
104 title = "Скины, разблокируемые и надеваемые по умолчанию при создании персонажа",
105 schema_with = "skin_link_id_array_schema"
106 )]
107 pub default_equipped_skins: Vec<SkinId>,
108}
109
110#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize, JsonSchema, Tsify)]
111pub struct CharacterSkins {
112 pub equipped: Vec<SkinId>,
113 pub available: Vec<SkinId>,
114 pub blocked: Vec<SkinId>,
115}
116
117impl CharacterSkins {
118 pub fn is_already_unlocked(&self, skin_id: SkinId) -> bool {
119 self.available.contains(&skin_id) || self.equipped.contains(&skin_id)
120 }
121
122 pub fn is_already_equipped(&self, skin_id: SkinId) -> bool {
123 self.equipped.contains(&skin_id)
124 }
125}