goap_ai/
goal.rs

1use serde::Deserialize;
2
3#[allow(clippy::enum_variant_names)]
4#[derive(Clone, Debug, Deserialize)]
5pub enum DiscontentmentKind {
6    GreaterThanOrEqualTo,
7    LessThanOrEqualTo,
8    EqualTo,
9}
10
11#[derive(Clone, Debug, Deserialize)]
12pub struct Goal {
13    weight: f32, // Weight to apply per difference from the target
14    target: i32, // Value to achieve
15    pub kind: DiscontentmentKind,
16}
17
18impl Goal {
19    pub fn discontentment(&self, current_value: i32) -> f32 {
20        let delta = match self.kind {
21            DiscontentmentKind::GreaterThanOrEqualTo => (self.target - current_value).max(0),
22            DiscontentmentKind::LessThanOrEqualTo => (current_value - self.target).max(0),
23            DiscontentmentKind::EqualTo => (self.target - current_value).abs(),
24        };
25
26        self.weight * delta as f32
27    }
28}