configs/
buffs.rs

1use chrono::{DateTime, Utc};
2use essences::buffs::{ActiveBuff, BuffTemplateId};
3use essences::currency::CurrencyId;
4use schema_loader::{asset_buff_icon_schema, currency_link_id_schema, id_schema};
5use schemars::JsonSchema;
6use serde::{Deserialize, Serialize};
7use tsify_next::Tsify;
8
9#[derive(Clone, Debug, Deserialize, Serialize, JsonSchema, Tsify)]
10pub enum BuffEffect {
11    #[schemars(title = "Буст валюты и опыта")]
12    CurrencyExpBoost {
13        multiplier: f64,
14        #[schemars(schema_with = "currency_link_id_schema")]
15        currency_id: CurrencyId,
16    },
17}
18
19#[derive(Clone, Debug, Deserialize, Serialize, JsonSchema, Tsify)]
20pub struct BuffTemplate {
21    #[schemars(schema_with = "id_schema")]
22    pub id: BuffTemplateId,
23
24    #[schemars(title = "Название")]
25    pub title: i18n::I18nString,
26
27    #[schemars(title = "Описание")]
28    pub description: i18n::I18nString,
29
30    #[schemars(title = "Путь к иконке", schema_with = "asset_buff_icon_schema")]
31    pub icon_path: String,
32
33    #[schemars(title = "Эффект баффа")]
34    pub effect: BuffEffect,
35}
36
37pub fn currency_exp_buff_multiplier(
38    active_buffs: &[ActiveBuff],
39    buff_templates: &[BuffTemplate],
40    now: DateTime<Utc>,
41) -> f64 {
42    let mut multiplier = 1.0_f64;
43    for buff in active_buffs {
44        if !buff.is_active(now) {
45            continue;
46        }
47        let Some(template) = buff_templates.iter().find(|t| t.id == buff.template_id) else {
48            continue;
49        };
50        match template.effect {
51            BuffEffect::CurrencyExpBoost { multiplier: m, .. } => multiplier *= m,
52        }
53    }
54    multiplier
55}
56
57pub fn apply_buff_multiplier(amount: i64, multiplier: f64) -> i64 {
58    if multiplier == 1.0 {
59        return amount;
60    }
61    ((amount as f64) * multiplier).ceil() as i64
62}