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 CustomType,
54)]
55pub struct ConfigSkin {
56 #[schemars(schema_with = "id_schema")]
57 pub id: SkinId,
58
59 #[schemars(title = "Название скина")]
60 pub name: i18n::I18nString,
61
62 #[schemars(title = "Условие анлока")]
63 pub unlock_description: Option<i18n::I18nString>,
64
65 #[schemars(title = "Код скина (строковый идентификатор для Spine)")]
66 pub code: String,
67
68 #[schemars(title = "Тип скина")]
69 pub skin_type: SkinType,
70
71 #[schemars(title = "URL иконки скина", schema_with = "webp_url_schema")]
72 pub icon_url: String,
73
74 #[schemars(
75 title = "Путь иконки скина",
76 schema_with = "asset_hero_skin_icon_schema"
77 )]
78 pub icon_path: String,
79
80 #[schemars(title = "Спайн скин", schema_with = "asset_hero_skin_spine_schema")]
81 pub spine_path: String,
82
83 #[schemars(title = "Id редкости", schema_with = "item_rarity_link_id_schema")]
84 pub rarity_id: ItemRarityId,
85
86 #[schemars(title = "Стоимость скина")]
87 pub price: Option<Vec<CurrencyUnit>>,
88
89 #[schemars(title = "HEX-цвет в интерфейсе (для цветовых скинов)")]
90 pub color: Option<String>,
91}
92
93#[derive(
94 Default, PartialEq, Eq, Debug, Clone, Serialize, Deserialize, JsonSchema, Tsify, CustomType,
95)]
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(
111 Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize, JsonSchema, Tsify, CustomType,
112)]
113pub struct CharacterSkins {
114 pub equipped: Vec<SkinId>,
115 pub available: Vec<SkinId>,
116 pub blocked: Vec<SkinId>,
117}
118
119impl CharacterSkins {
120 pub fn is_already_unlocked(&self, skin_id: SkinId) -> bool {
121 self.available.contains(&skin_id) || self.equipped.contains(&skin_id)
122 }
123
124 pub fn is_already_equipped(&self, skin_id: SkinId) -> bool {
125 self.equipped.contains(&skin_id)
126 }
127}