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}