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}