essences/
class.rs

1use super::{abilities, bundles, currency::CurrencyUnit, game};
2use crate::characters::CharacterId;
3use crate::items::AttributeId;
4use crate::skins::SkinId;
5
6use crate::prelude::*;
7
8#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, Tsify)]
9pub struct CharacterClass {
10    pub character_id: CharacterId,
11    pub class_id: ClassId,
12    pub level: u64,
13    pub xp: u64,
14}
15
16#[derive(PartialEq, Eq, Serialize, Deserialize, Default, Debug, Clone, JsonSchema, Tsify)]
17pub struct ClassAbilityLevel {
18    #[schemars(title = "Id абилки", schema_with = "ability_link_id_schema")]
19    pub ability_id: abilities::AbilityId,
20    #[schemars(title = "Уровень абилки, до которого она прокачивается на этом уровне класса")]
21    pub level: u64,
22}
23
24#[derive(PartialEq, Eq, Serialize, Deserialize, Default, Debug, Clone, JsonSchema, Tsify)]
25pub struct ClassLevels {
26    #[schemars(schema_with = "class_id_schema")]
27    pub class_id: ClassId,
28
29    #[schemars(title = "Уровень класса")]
30    pub level: u64,
31
32    #[schemars(
33        title = "Атрибуты, выдаваемые на этом уровне",
34        description = "Список бонусов к атрибутам, которые игрок получает с этого уровня класса"
35    )]
36    pub attrs: Vec<game::EntityAttribute>,
37
38    #[schemars(
39        title = "Стоимость прокачки",
40        description = "Цена в валюте за прокачку с предыдущего уровня"
41    )]
42    pub price: CurrencyUnit,
43
44    #[schemars(
45        title = "Анлоки/прокачки классовых абилок",
46        description = "Список пар (абилка, уровень), применяемых на этом уровне класса"
47    )]
48    pub ability_levels: Vec<ClassAbilityLevel>,
49}
50use strum_macros::{Display, EnumIter, EnumString};
51
52#[derive(
53    Debug,
54    Clone,
55    Copy,
56    EnumString,
57    Display,
58    Deserialize,
59    Serialize,
60    Hash,
61    Eq,
62    PartialEq,
63    EnumIter,
64    Default,
65    JsonSchema,
66    Tsify,
67)]
68#[tsify(namespace)]
69pub enum ClassTier {
70    #[default]
71    S,
72    A,
73    B,
74    C,
75}
76
77#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, JsonSchema)]
78pub enum ClassAttribute {
79    EntityAttribute(game::EntityAttribute),
80}
81
82#[declare]
83pub type ClassId = Uuid;
84
85#[derive(PartialEq, Eq, Serialize, Deserialize, Default, Debug, Clone, JsonSchema, Tsify)]
86pub struct Class {
87    #[schemars(schema_with = "id_schema")]
88    pub id: ClassId,
89
90    #[schemars(title = "Название класса")]
91    pub name: i18n::I18nString,
92
93    #[schemars(title = "Описание класса")]
94    pub description: i18n::I18nString,
95
96    #[schemars(title = "Иконка", schema_with = "asset_class_hero_icon")]
97    pub icon_path: String,
98
99    #[schemars(
100        title = "Фон для Hero Screen",
101        schema_with = "asset_class_hero_background"
102    )]
103    pub background_image_path: String,
104
105    #[schemars(title = "Спайн класса", schema_with = "spine_schema")]
106    pub character_asset: String,
107
108    #[schemars(title = "Время каста")]
109    pub cast_time: u64,
110
111    #[schemars(title = "Спайн класса (Unity)", schema_with = "aa_entity_spine_schema")]
112    pub spine: String,
113
114    #[schemars(
115        title = "Базовые способности игрока",
116        description = "Способности, которыми игрок безусловно обладает в бою.",
117        schema_with = "ability_link_id_array_schema"
118    )]
119    pub basic_abilities: Vec<abilities::AbilityId>,
120
121    #[schemars(
122        title = "Активные классовые скиллы",
123        description = "Список активных скиллов класса. Анлокаются и прокачиваются через прокачку класса (ClassLevels.ability_levels), не падают в гаче, экипируются игроком как обычные скиллы. Должны иметь is_gacha_ability=false и не пересекаться с basic_abilities.",
124        schema_with = "ability_link_id_array_schema"
125    )]
126    pub class_abilities: Vec<abilities::AbilityId>,
127
128    #[schemars(
129        title = "Подарочнйый набор новичка",
130        schema_with = "option_bundle_id_schema"
131    )]
132    pub starter_bundle_id: Option<bundles::BundleId>,
133
134    #[schemars(title = "Базовые атрибуты игрока")]
135    pub attributes: Vec<ClassAttribute>,
136
137    #[schemars(
138        title = "Id редкости этого класса",
139        schema_with = "ability_rarity_link_id_schema"
140    )]
141    pub ability_rarity_id: abilities::AbilityRarityId,
142
143    #[schemars(title = "Тир класса")]
144    pub tier: ClassTier,
145
146    #[schemars(
147        title = "Скины для болванки выбора класса",
148        description = "Набор скинов, формирующих внешность \"классического\" представителя класса в экране выбора класса в начале игры",
149        schema_with = "skin_link_id_array_schema"
150    )]
151    pub demo_skins: Vec<SkinId>,
152
153    #[schemars(
154        title = "Тип оружия класса",
155        description = "Отображается в UI; после введения оружейной гачи переедет на enum"
156    )]
157    pub weapon_type: i18n::I18nString,
158
159    #[schemars(
160        title = "Основной атрибут класса",
161        description = "Используется в UI блока Class Main Stat",
162        schema_with = "attribute_link_id_schema"
163    )]
164    pub main_attribute: AttributeId,
165
166    #[schemars(
167        title = "Рекомендуемое значение основного атрибута",
168        description = "Отображается в UI как ориентир \"комфортной игры\" на текущий момент"
169    )]
170    pub main_attribute_optimal_value: u64,
171
172    #[schemars(
173        title = "Дефолтный скин оружия класса",
174        description = "Применяется к экипированному оружию после респека, заменяя любой пользовательский скин",
175        schema_with = "skin_link_id_schema"
176    )]
177    pub default_weapon_skin_id: SkinId,
178}