1use essences::{
2 bundles::BundleId,
3 currency::{CurrencyId, CurrencyUnit},
4 entity::Coordinates,
5};
6
7use schema_loader::{bundle_id_schema, currency_link_id_schema, id_schema};
8use schemars::JsonSchema;
9
10use serde::{Deserialize, Serialize};
11use tsify_next::Tsify;
12
13#[derive(Clone, Debug, Deserialize, Serialize, JsonSchema, Tsify)]
14pub struct FightSettings {
15 #[schemars(
16 title = "Время ожидания перед стартом следующего боя в тиках",
17 description = "Это момент анимации перебежки персонажа между битвами"
18 )]
19 pub start_fight_delay_ticks_default: u64,
20
21 #[schemars(
22 title = "Время ожидания перед стартом уже начавшегося боя в случае победы",
23 description = "Это момент, когда враги выбегают на экран"
24 )]
25 pub prepare_fight_win_delay_ticks_default: u64,
26
27 #[schemars(
28 title = "Время ожидания перед стартом уже начавшегося боя в случае поражения",
29 description = "Это момент, когда враги выбегают на экран"
30 )]
31 pub prepare_fight_lose_delay_ticks_default: u64,
32
33 #[schemars(title = "Время ожидания перед окончанием боя")]
34 pub end_fight_delay_ticks_default: u64,
35
36 #[schemars(title = "Стартовые координаты игрока")]
37 pub player_start_position: Coordinates,
38
39 #[schemars(title = "Стартовые координаты союзника по пати")]
40 pub party_start_position: Coordinates,
41
42 #[schemars(title = "Стартовые координаты врага в pvp")]
43 pub pvp_enemy_start_position: Coordinates,
44
45 #[schemars(
50 title = "Множитель скорости бега союзников",
51 description = "Ускоряет перебежку между волнами и подбегания героя/союзников. 1 = как раньше, 2 = вдвое быстрее. На кулдауны не влияет."
52 )]
53 pub ally_run_speed_mult: f64,
54
55 #[serde(default = "default_wave_entrance_offset_cells")]
59 #[schemars(
60 title = "Вход волны: офсет спавна (клетки)",
61 description = "На сколько клеток за боевым слотом (за экраном) спавнится моб перед входом."
62 )]
63 pub wave_entrance_offset_cells: i64,
64
65 #[serde(default = "default_wave_entrance_rush_ms_per_cell")]
66 #[schemars(
67 title = "Вход волны: раш-темп (мс/клетка)",
68 description = "Темп входа открывающей группы волны (юниты с минимальным delay)."
69 )]
70 pub wave_entrance_rush_ms_per_cell: u64,
71
72 #[serde(default = "default_wave_entrance_walk_ms_per_cell")]
73 #[schemars(
74 title = "Вход волны: шаг-темп (мс/клетка)",
75 description = "Темп входа остальных эшелонов волны и релизов стрим-пула."
76 )]
77 pub wave_entrance_walk_ms_per_cell: u64,
78
79 #[serde(default = "default_formation_advance_ticks")]
83 #[schemars(
84 title = "Слоты: длительность межволновой пробежки (тики = мс)",
85 description = "Пробежка героя и формации к новой позиции после зачистки волны. 1150 = 1.15 с (лабовый advanceRunSeconds). До перехода сервера на слотовую модель не используется."
86 )]
87 pub formation_advance_ticks: u64,
88}
89
90fn default_wave_entrance_offset_cells() -> i64 {
91 4
92}
93
94fn default_wave_entrance_rush_ms_per_cell() -> u64 {
95 200
96}
97
98fn default_wave_entrance_walk_ms_per_cell() -> u64 {
99 500
100}
101
102fn default_formation_advance_ticks() -> u64 {
103 1150
104}
105
106#[derive(Clone, Debug, Deserialize, Serialize, JsonSchema, Tsify)]
107pub struct PvpSettings {
108 #[schemars(
109 title = "Максимальное количество оппонентов",
110 description = "Максимальное количество оппонентов для отображения на экране подбора игроков"
111 )]
112 pub max_matchmaking_opponents_count: i64,
113
114 #[schemars(title = "Дельта уровня пользователя для матчмейкинга")]
115 pub matchmaking_character_level_data: i64,
116}
117
118#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, Tsify, i18n::Translate)]
119pub struct ArenaLeague {
120 #[schemars(schema_with = "id_schema")]
121 pub id: uuid::Uuid,
122
123 #[schemars(title = "Название лиги")]
124 #[translate]
125 pub name: i18n::I18nString,
126
127 #[schemars(title = "Минимальный рейтинг")]
128 pub min_rating: i64,
129
130 #[schemars(title = "Максимальный рейтинг")]
131 pub max_rating: i64,
132}
133
134#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, Tsify)]
135pub struct ArenaSettings {
136 #[schemars(title = "Базовый рейтинг пользователя")]
137 pub base_rating: u64,
138
139 #[schemars(title = "Количество последних матчей на экране истории")]
140 pub matches_history_size: u64,
141
142 #[schemars(title = "Размер таблицы лидеров")]
143 pub leaderboard_size: u64,
144
145 #[schemars(
146 title = "Идентификатор валюты pvp токенов",
147 schema_with = "currency_link_id_schema"
148 )]
149 pub arena_tickets_currency_id: CurrencyId,
150
151 #[schemars(title = "Максимальная разница между рейтингами игроков для подбора")]
152 pub matchmaking_character_rating_delta: u64,
153
154 #[schemars(title = "Кулдаун pvp")]
155 pub pvp_cooldown_secs: u64,
156
157 #[schemars(
158 title = "ID бандла награды за победу в арене",
159 schema_with = "bundle_id_schema"
160 )]
161 pub win_reward_bundle_id: BundleId,
162
163 #[schemars(
164 title = "ID бандла награды за поражение в арене",
165 schema_with = "bundle_id_schema"
166 )]
167 pub lose_reward_bundle_id: BundleId,
168
169 #[schemars(
170 title = "Валюта для покупки аренных билетов",
171 schema_with = "currency_link_id_schema"
172 )]
173 pub arena_ticket_buy_currency_id: CurrencyId,
174
175 #[schemars(title = "Стоимость покупки аренных билетов")]
176 pub arena_ticket_price: CurrencyUnit,
177
178 #[schemars(title = "Количество дней жизни матчей в базе данных")]
179 pub arena_matches_ttl_days: u64,
180
181 #[schemars(title = "Максимальное увеличение рейтинга в рематче")]
182 pub rematch_max_rating_increase: i64,
183
184 #[schemars(title = "Максимальное уменьшение рейтинга в рематче")]
185 pub rematch_max_rating_decrease: i64,
186
187 #[schemars(title = "Порог силы «добычи»: противник слабее этой доли силы игрока")]
192 #[serde(default = "default_rating_prey_ratio")]
193 pub rating_prey_power_ratio: f64,
194
195 #[schemars(title = "Порог силы «дерзости»: противник сильнее этой доли силы игрока")]
196 #[serde(default = "default_rating_stretch_ratio")]
197 pub rating_stretch_power_ratio: f64,
198
199 #[schemars(title = "Очки за победу над «добычей»")]
200 #[serde(default = "default_win_points_prey")]
201 pub win_points_prey: i64,
202
203 #[schemars(title = "Очки за победу над «ровней»")]
204 #[serde(default = "default_win_points_peer")]
205 pub win_points_peer: i64,
206
207 #[schemars(title = "Очки за победу над «дерзостью»")]
208 #[serde(default = "default_win_points_stretch")]
209 pub win_points_stretch: i64,
210
211 #[schemars(title = "Потеря очков за поражение «добыче» (положительное число)")]
214 #[serde(default = "default_lose_points_prey")]
215 pub lose_points_prey: i64,
216
217 #[schemars(title = "Потеря очков за поражение «ровне» (положительное число)")]
218 #[serde(default = "default_lose_points_peer")]
219 pub lose_points_peer: i64,
220
221 #[schemars(title = "Потеря очков за поражение «дерзости» (положительное число)")]
222 #[serde(default = "default_lose_points_stretch")]
223 pub lose_points_stretch: i64,
224
225 #[schemars(title = "Защита новичка: ниже этого рейтинга поражение не отнимает очки")]
226 #[serde(default = "default_lose_protection_rating")]
227 pub lose_protection_rating: i64,
228
229 #[schemars(title = "Бонус очков за каждую победу в серии (сверх первой)")]
230 #[serde(default = "default_win_streak_bonus_step")]
231 pub win_streak_bonus_step: i64,
232
233 #[schemars(title = "Максимальный суммарный бонус за победную серию")]
234 #[serde(default = "default_win_streak_bonus_max")]
235 pub win_streak_bonus_max: i64,
236
237 #[schemars(
238 title = "Защита от серий поражений: после скольких поражений подряд гарантировать «добычу» в списке подбора"
239 )]
240 #[serde(default = "default_loss_streak_protection_after")]
241 pub loss_streak_protection_after: i64,
242}
243
244fn default_rating_prey_ratio() -> f64 {
247 0.85
248}
249fn default_rating_stretch_ratio() -> f64 {
250 1.10
251}
252fn default_win_points_prey() -> i64 {
253 5
254}
255fn default_win_points_peer() -> i64 {
256 9
257}
258fn default_win_points_stretch() -> i64 {
259 14
260}
261fn default_lose_points_prey() -> i64 {
262 8
263}
264fn default_lose_points_peer() -> i64 {
265 5
266}
267fn default_lose_points_stretch() -> i64 {
268 2
269}
270fn default_lose_protection_rating() -> i64 {
271 1100
272}
273fn default_win_streak_bonus_step() -> i64 {
274 1
275}
276fn default_win_streak_bonus_max() -> i64 {
277 5
278}
279fn default_loss_streak_protection_after() -> i64 {
280 2
281}