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(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}