configs/
abilities.rs

1use essences::{abilities::AbilityRarityId, currency::CurrencyUnit};
2use schema_loader::{
3    aa_vfx_projectile_schema, ability_rarity_link_id_array_schema, ability_rarity_link_id_schema,
4    id_schema, script_schema,
5};
6use schemars::JsonSchema;
7
8use serde::{Deserialize, Serialize};
9use tsify_next::{Tsify, declare};
10
11use crate::validated_types::PositiveF64;
12
13#[declare]
14pub type ProjectileId = uuid::Uuid;
15
16#[derive(Clone, Debug, Deserialize, Serialize, JsonSchema, Tsify)]
17pub struct AbilityCaseRarityWeight {
18    #[schemars(title = "Id редкости", schema_with = "ability_rarity_link_id_schema")]
19    pub rarity_id: AbilityRarityId,
20
21    #[schemars(title = "Вес редкости")]
22    pub weight: PositiveF64,
23}
24
25#[derive(Clone, Debug, Deserialize, Serialize, JsonSchema, Tsify, Default)]
26pub struct AbilityCaseCheckpointAbilityReward {
27    /// Количество роллов абилки с указанной минимальной редкостью.
28    #[schemars(title = "Количество роллов абилки")]
29    pub amount: i64,
30
31    /// Минимальная редкость для ролла. Все редкости ниже не участвуют в розыгрыше.
32    #[schemars(
33        title = "Минимальная редкость",
34        schema_with = "ability_rarity_link_id_schema"
35    )]
36    pub min_rarity_id: AbilityRarityId,
37}
38
39#[derive(Clone, Debug, Deserialize, Serialize, JsonSchema, Tsify, Default)]
40pub struct AbilityCaseCheckpointReward {
41    /// Количество круток в рамках текущего уровня, необходимое для автоклейма награды.
42    #[schemars(title = "Порог чекпоинта (крутки в уровне)")]
43    pub required_opens: i64,
44
45    /// Валютные награды чекпоинта.
46    #[schemars(title = "Валютные награды чекпоинта")]
47    pub currency_rewards: Vec<CurrencyUnit>,
48
49    /// Награды абилками чекпоинта.
50    #[schemars(title = "Награды абилками чекпоинта")]
51    pub ability_rewards: Vec<AbilityCaseCheckpointAbilityReward>,
52}
53
54#[derive(Clone, Debug, Deserialize, Serialize, JsonSchema, Tsify, Default)]
55pub struct AbilityCaseEvolveRule {
56    /// Редкость шарда, для которой применяется evolve.
57    #[schemars(
58        title = "Редкость исходного шарда",
59        schema_with = "ability_rarity_link_id_schema"
60    )]
61    pub from_rarity_id: AbilityRarityId,
62
63    /// Количество независимых попыток evolve на маленькую крутку.
64    #[schemars(title = "Попытки evolve (маленькая крутка)")]
65    pub small_roll_tries: i64,
66
67    /// Количество независимых попыток evolve на большую крутку.
68    #[schemars(title = "Попытки evolve (большая крутка)")]
69    pub big_roll_tries: i64,
70
71    /// Вероятности целевых редкостей за одну попытку evolve.
72    /// Сумма весов <= 1.0, остаток — отсутствие evolve.
73    #[schemars(title = "Вероятности целевых редкостей")]
74    pub to_rarity_weights: Vec<AbilityCaseRarityWeight>,
75}
76
77/// Шард большой крутки: задаёт минимальную редкость и количество дропов.
78/// Розыгрыш идёт между настроенной редкостью и выше по весам уровня гачи.
79#[derive(Clone, Debug, Deserialize, Serialize, JsonSchema, Tsify, Default)]
80pub struct BigRollShard {
81    /// Минимальная редкость шарда. Розыгрыш идёт между этой и более высокими редкостями.
82    #[schemars(
83        title = "Минимальная редкость шарда",
84        schema_with = "ability_rarity_link_id_schema"
85    )]
86    pub min_rarity_id: AbilityRarityId,
87
88    /// Количество дропов с этой минимальной редкостью.
89    #[schemars(title = "Количество шардов")]
90    pub count: u8,
91}
92
93#[derive(Clone, Debug, Deserialize, Serialize, JsonSchema, Tsify)]
94pub struct AbilityCasesSettingsByLevel {
95    #[schemars(title = "Уровень сундука")]
96    pub level: i64,
97
98    #[schemars(
99        title = "Стоимость уровня",
100        description = "Кумулятивное количество круток для достижения уровня"
101    )]
102    pub opens_to_upgrade: i64,
103
104    /// Phantom level that only defines the end boundary for the previous (last real) level.
105    /// Not a playable level — players are never assigned to it.
106    #[schemars(title = "Граничный уровень")]
107    pub is_boundary_level: bool,
108
109    #[schemars(title = "Веса редкостей")]
110    pub rarity_weights: Vec<AbilityCaseRarityWeight>,
111
112    /// Чекпоинты внутри уровня с автоклеймом наград (порог задаётся в крутках).
113    #[schemars(title = "Чекпоинты уровня")]
114    pub checkpoints: Vec<AbilityCaseCheckpointReward>,
115
116    /// Допустимые на этом уровне редкости для вишлиста.
117    #[schemars(
118        title = "Допустимые редкости вишлиста",
119        schema_with = "ability_rarity_link_id_array_schema"
120    )]
121    pub allowed_wishlist_rarity_ids: Vec<AbilityRarityId>,
122
123    /// Правила evolve, действующие на этом уровне.
124    #[schemars(title = "Правила evolve")]
125    pub evolve_rules: Vec<AbilityCaseEvolveRule>,
126
127    /// Дополнительные валютные награды при большой крутке (x11) на этом уровне.
128    #[schemars(title = "Дополнительные валюты за большую крутку")]
129    pub big_roll_currency_rewards: Vec<CurrencyUnit>,
130
131    /// Распределение шардов по минимальным редкостям для большой крутки.
132    /// Сумма count должна равняться total_drops (cost + bonus_drops).
133    #[schemars(title = "Шарды большой крутки")]
134    pub big_roll_shards: Vec<BigRollShard>,
135}
136
137#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Tsify, JsonSchema)]
138pub struct AbilityLevel {
139    #[schemars(title = "Уровень способности")]
140    pub level: i64,
141    #[schemars(title = "Id редкости", schema_with = "ability_rarity_link_id_schema")]
142    pub rarity_id: AbilityRarityId,
143    #[schemars(
144        title = "Количество осколков для улучшения",
145        description = "Количество осколков, необходимое для улучшения уровня способности"
146    )]
147    pub required_shards: i64,
148}
149
150#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Tsify, JsonSchema)]
151pub struct Projectile {
152    #[schemars(schema_with = "id_schema")]
153    pub id: ProjectileId,
154    #[schemars(
155        title = "Скрипт начала каста проджектайла",
156        schema_with = "script_schema"
157    )]
158    pub start_script: String,
159    #[schemars(title = "Скрипт каста проджектайла", schema_with = "script_schema")]
160    pub script: String,
161    #[schemars(title = "VFX проджектайла", schema_with = "aa_vfx_projectile_schema")]
162    pub vfx: String,
163}