configs/
statue.rs

1use essences::currency::CurrencyId;
2use essences::items::AttributeId;
3use essences::statue::StatueBonusGradeId;
4use schema_loader::{
5    attribute_link_id_schema, currency_link_id_schema, statue_bonus_grade_id_schema,
6};
7use schemars::JsonSchema;
8use serde::{Deserialize, Serialize};
9use tsify_next::Tsify;
10
11use crate::validated_types::{NonEmptyVec, NonZeroU64, PositiveF64, PositiveI32, PositiveI64};
12
13/// Вес грейда при ролле бонуса
14#[derive(Clone, Debug, Deserialize, Serialize, JsonSchema, Tsify)]
15pub struct StatueBonusGradeWeight {
16    #[schemars(schema_with = "statue_bonus_grade_id_schema")]
17    pub grade_id: StatueBonusGradeId,
18
19    #[schemars(title = "Вес грейда")]
20    pub weight: PositiveF64,
21}
22
23/// Значение конкретного грейда для одного типа бонуса.
24/// Если грейд недоступен для данного стата (N/A), запись просто отсутствует в списке.
25#[derive(Clone, Debug, Deserialize, Serialize, JsonSchema, Tsify)]
26pub struct StatueBonusGradeValue {
27    #[schemars(schema_with = "statue_bonus_grade_id_schema")]
28    pub grade_id: StatueBonusGradeId,
29
30    #[schemars(title = "Значение бонуса (плоское значение)")]
31    pub value: PositiveI32,
32}
33
34/// Настройки одного типа бонуса — значения для каждого грейда
35#[derive(Clone, Debug, Deserialize, Serialize, JsonSchema, Tsify)]
36pub struct StatueBonusTypeConfig {
37    #[schemars(schema_with = "attribute_link_id_schema")]
38    pub attribute_id: AttributeId,
39
40    #[schemars(title = "Значения по грейдам")]
41    pub grade_values: NonEmptyVec<StatueBonusGradeValue>,
42}
43
44/// Строка таблицы уровней статуи
45#[derive(Clone, Debug, Deserialize, Serialize, JsonSchema, Tsify)]
46pub struct StatueLevelConfig {
47    #[schemars(title = "Уровень статуи")]
48    pub level: i64,
49
50    #[schemars(title = "Необходимый опыт (суммарный)")]
51    pub required_experience: i64,
52
53    #[schemars(title = "Количество слотов")]
54    pub slot_count: NonZeroU64,
55
56    #[schemars(title = "Количество доступных сетов")]
57    pub sets_count: NonZeroU64,
58
59    #[schemars(title = "Веса грейдов при ролле на этом уровне")]
60    pub grade_weights: NonEmptyVec<StatueBonusGradeWeight>,
61}
62
63/// Стоимость ролла в зависимости от количества заблокированных слотов
64#[derive(Clone, Debug, Deserialize, Serialize, JsonSchema, Tsify)]
65pub struct StatueRollCostConfig {
66    #[schemars(title = "Количество заблокированных слотов")]
67    pub locked_count: u64,
68
69    #[schemars(title = "Стоимость ролла")]
70    pub cost: PositiveI64,
71}
72
73/// Общие настройки статуи героя
74#[derive(Clone, Debug, Deserialize, Serialize, JsonSchema, Tsify)]
75pub struct StatueSettings {
76    #[schemars(title = "Валюта статуи", schema_with = "currency_link_id_schema")]
77    pub currency_id: CurrencyId,
78
79    #[schemars(title = "Стоимость ролла по количеству заблокированных слотов")]
80    pub roll_costs: NonEmptyVec<StatueRollCostConfig>,
81}