veloren_common/
effect.rs

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