essences/
skins.rs

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}