1use crate::{combat, comp};
2use serde::{Deserialize, Serialize};
3
4#[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#[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}