veloren_common/
effect.rs

1use crate::{combat, comp};
2use serde::{Deserialize, Serialize};
3
4/// An effect that may be applied to an entity
5#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
6pub enum Effect {
7    Health(comp::HealthChange),
8    Poise(f32),
9    Damage(combat::Damage),
10    Buff(BuffEffect),
11}
12
13/// A buff that may be applied to an entity
14#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
15#[serde(deny_unknown_fields)]
16pub struct BuffEffect {
17    pub kind: comp::BuffKind,
18    #[serde(default)]
19    pub data: comp::BuffData,
20    #[serde(default)]
21    pub cat_ids: Vec<comp::BuffCategory>,
22}
23
24impl Effect {
25    pub fn info(&self) -> String {
26        match self {
27            Effect::Health(c) => format!("{:+} health", c.amount),
28            Effect::Poise(p) => format!("{:+} poise", p),
29            Effect::Damage(d) => format!("{:+}", d.value),
30            Effect::Buff(e) => format!("{:?} buff", e),
31        }
32    }
33
34    pub fn is_harm(&self) -> bool {
35        match self {
36            Effect::Health(c) => c.amount < 0.0,
37            Effect::Poise(p) => *p < 0.0,
38            Effect::Damage(_) => true,
39            Effect::Buff(e) => !e.kind.is_buff(),
40        }
41    }
42
43    pub fn modify_strength(&mut self, modifier: f32) {
44        match self {
45            Effect::Health(change) => {
46                change.amount *= modifier;
47            },
48            Effect::Poise(poise) => {
49                *poise *= modifier;
50            },
51            Effect::Damage(damage) => {
52                damage.interpolate_damage(modifier, 0.0);
53            },
54            Effect::Buff(effect) => {
55                effect.data.strength *= modifier;
56            },
57        }
58    }
59}