configs/
matchmaking.rs

1use schemars::JsonSchema;
2
3use serde::{Deserialize, Serialize};
4use tsify_next::Tsify;
5
6#[derive(Clone, Debug, Deserialize, Serialize, JsonSchema, Tsify)]
7pub struct OpponentPositionSettings {
8    #[schemars(title = "Минимальная разница в рейтинге в процентах")]
9    pub min_rating_diff_percent: f64,
10
11    #[schemars(title = "Максимальная разница в рейтинге в процентах")]
12    pub max_rating_diff_percent: f64,
13
14    #[schemars(
15        title = "Максимальная позиция в рейтинге, после которой перестают генерироваться боты"
16    )]
17    pub max_rating_for_bots: u64,
18
19    #[schemars(title = "Множитель силы бота относительно рейтинга игрока")]
20    pub bot_power_multiplier: f64,
21
22    // Силовое окно слота: отношение силы противника к силе игрока. Слот с
23    // окном [0.7, 0.85] — «добыча» (витрина доминации), [0.9, 1.1] — «ровня»,
24    // [1.1, 1.4] — «дерзость». Пусто = легаси-поведение (только рейтинг).
25    #[schemars(title = "Мин. отношение силы противника к силе игрока (пусто = без фильтра)")]
26    #[serde(default)]
27    pub min_power_ratio: Option<f64>,
28
29    #[schemars(title = "Макс. отношение силы противника к силе игрока (пусто = без фильтра)")]
30    #[serde(default)]
31    pub max_power_ratio: Option<f64>,
32}
33
34#[derive(Clone, Debug, Deserialize, Serialize, JsonSchema, Tsify)]
35pub struct MatchmakingSettings {
36    #[schemars(title = "Настройки для каждой позиции противника")]
37    pub opponent_positions: Vec<OpponentPositionSettings>,
38
39    #[schemars(title = "Порог перцентиля для переключения на альтернативный матчмейкинг")]
40    pub percentile_threshold: f64,
41
42    // Бюджет ботов на список: сверх него слот берёт ближайшего по силе
43    // живого игрока, даже если тот не попадает в окна слота. Боты сверх
44    // бюджета возможны только когда живых кандидатов нет вовсе.
45    #[schemars(title = "Максимум ботов в списке подбора (люди в приоритете)")]
46    #[serde(default = "default_max_bots")]
47    pub max_bots: u64,
48}
49
50fn default_max_bots() -> u64 {
51    2
52}