esf_dogma_engine/
projection.rs1use std::collections::BTreeMap;
4
5use serde::{Deserialize, Serialize};
6
7#[cfg(feature = "typescript")]
8use tsify::Tsify;
9
10use crate::fit::id_map;
11
12#[cfg_attr(feature = "typescript", derive(Tsify))]
17#[derive(Serialize, Deserialize, Debug, Clone, Default, PartialEq)]
18pub struct Projection {
19 #[serde(default, skip_serializing_if = "Vec::is_empty")]
21 pub buffs: Vec<ProjectedBuff>,
22 #[serde(default, skip_serializing_if = "Vec::is_empty")]
24 pub effects: Vec<ProjectedEffect>,
25}
26
27#[cfg_attr(feature = "typescript", derive(Tsify))]
29#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq)]
30pub struct ProjectedBuff {
31 pub id: i32,
33 pub value: f64,
35}
36
37#[cfg_attr(feature = "typescript", derive(Tsify))]
39#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
40pub struct ProjectedEffect {
41 pub type_id: i32,
43 pub effect_id: i32,
45 #[serde(default, deserialize_with = "id_map")]
47 #[cfg_attr(
48 feature = "typescript",
49 tsify(type = "Map<number, number> | Record<number, number>")
50 )]
51 pub attributes: BTreeMap<i32, f64>,
52}
53
54impl Projection {
55 pub fn is_empty(&self) -> bool {
57 self.buffs.is_empty() && self.effects.is_empty()
58 }
59
60 pub fn extend(&mut self, other: Projection) {
62 self.buffs.extend(other.buffs);
63 self.effects.extend(other.effects);
64 }
65}