1use crate::{combat, comp};
2use serde::{Deserialize, Serialize};
3
4#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
5pub enum PermanentEffect {
6 CycleBodyType,
7}
8
9#[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#[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}