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(Default, PartialEq, Eq, Hash, Debug, Clone, Serialize, Deserialize, Tsify, JsonSchema)]
43pub struct ConfigSkin {
44 #[schemars(schema_with = "id_schema")]
45 pub id: SkinId,
46
47 #[schemars(title = "Название скина")]
48 pub name: i18n::I18nString,
49
50 #[schemars(title = "Условие анлока")]
51 pub unlock_description: Option<i18n::I18nString>,
52
53 #[schemars(title = "Код скина (строковый идентификатор для Spine)")]
54 pub code: String,
55
56 #[schemars(title = "Тип скина")]
57 pub skin_type: SkinType,
58
59 #[schemars(title = "URL иконки скина", schema_with = "webp_url_schema")]
60 pub icon_url: String,
61
62 #[schemars(
63 title = "Путь иконки скина",
64 schema_with = "asset_hero_skin_icon_schema"
65 )]
66 pub icon_path: String,
67
68 #[schemars(title = "Спайн скин", schema_with = "asset_hero_skin_spine_schema")]
69 pub spine_path: String,
70
71 #[schemars(title = "Id редкости", schema_with = "item_rarity_link_id_schema")]
72 pub rarity_id: ItemRarityId,
73
74 #[schemars(title = "Стоимость скина")]
75 pub price: Option<Vec<CurrencyUnit>>,
76
77 #[schemars(title = "HEX-цвет в интерфейсе (для цветовых скинов)")]
78 pub color: Option<String>,
79}
80
81#[derive(Default, PartialEq, Eq, Debug, Clone, Serialize, Deserialize, JsonSchema, Tsify)]
82pub struct SkinsSettings {
83 #[schemars(
84 title = "Скины, разблокируемые по умолчанию при создании персонажа",
85 schema_with = "skin_link_id_array_schema"
86 )]
87 pub default_unlocked_skins: Vec<SkinId>,
88
89 #[schemars(
90 title = "Скины, разблокируемые и надеваемые по умолчанию при создании персонажа",
91 schema_with = "skin_link_id_array_schema"
92 )]
93 pub default_equipped_skins: Vec<SkinId>,
94}
95
96#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize, JsonSchema, Tsify)]
97pub struct CharacterSkins {
98 pub equipped: Vec<SkinId>,
99 pub available: Vec<SkinId>,
100 pub blocked: Vec<SkinId>,
101}
102
103impl CharacterSkins {
104 pub fn is_already_unlocked(&self, skin_id: SkinId) -> bool {
105 self.available.contains(&skin_id) || self.equipped.contains(&skin_id)
106 }
107
108 pub fn is_already_equipped(&self, skin_id: SkinId) -> bool {
109 self.equipped.contains(&skin_id)
110 }
111}