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}