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, i18n::Translate)]
20pub struct BuffTemplate {
21    #[schemars(schema_with = "id_schema")]
22    pub id: BuffTemplateId,
23
24    #[schemars(title = "Название")]
25    #[translate]
26    pub title: i18n::I18nString,
27
28    #[schemars(title = "Описание")]
29    #[translate]
30    pub description: i18n::I18nString,
31
32    #[schemars(title = "Путь к иконке", schema_with = "asset_buff_icon_schema")]
33    pub icon_path: String,
34
35    #[schemars(title = "Эффект баффа")]
36    pub effect: BuffEffect,
37}
38
39pub fn currency_exp_buff_multiplier(
40    active_buffs: &[ActiveBuff],
41    buff_templates: &[BuffTemplate],
42    now: DateTime<Utc>,
43) -> f64 {
44    let mut multiplier = 1.0_f64;
45    for buff in active_buffs {
46        if !buff.is_active(now) {
47            continue;
48        }
49        let Some(template) = buff_templates.iter().find(|t| t.id == buff.template_id) else {
50            continue;
51        };
52        match template.effect {
53            BuffEffect::CurrencyExpBoost { multiplier: m, .. } => multiplier *= m,
54        }
55    }
56    multiplier
57}
58
59pub fn apply_buff_multiplier(amount: i64, multiplier: f64) -> i64 {
60    if multiplier == 1.0 {
61        return amount;
62    }
63    ((amount as f64) * multiplier).ceil() as i64
64}