boseiju/ability_tree/ability/triggered/
trigger_cond.rs

1use crate::ability_tree::AbilityTreeNode;
2use crate::ability_tree::MAX_CHILDREN_PER_NODE;
3
4/// Condition for a trigger ability.
5///
6/// This is always an event, and can optionnaly have conditions for the event to happen.
7#[derive(serde::Serialize, serde::Deserialize)]
8#[derive(Debug, Clone, PartialEq, Eq)]
9pub struct TriggerCondition {
10    pub event: crate::ability_tree::event::Event,
11    pub condition: Option<crate::ability_tree::conditional::Conditional>,
12    #[cfg(feature = "spanned_tree")]
13    pub span: crate::ability_tree::span::TreeSpan,
14}
15
16impl AbilityTreeNode for TriggerCondition {
17    fn node_id(&self) -> usize {
18        use idris::Idris;
19        crate::ability_tree::NodeKind::TriggerCondition.id()
20    }
21
22    fn children(&self) -> arrayvec::ArrayVec<&dyn AbilityTreeNode, MAX_CHILDREN_PER_NODE> {
23        let mut children = arrayvec::ArrayVec::new_const();
24        children.push(&self.event as &dyn AbilityTreeNode);
25        match self.condition.as_ref() {
26            Some(condition) => children.push(condition as &dyn AbilityTreeNode),
27            None => {
28                children.push(crate::ability_tree::dummy_terminal::TreeNodeDummyTerminal::none_node() as &dyn AbilityTreeNode)
29            }
30        }
31        children
32    }
33
34    fn display(&self, out: &mut crate::utils::TreeFormatter<'_>) -> std::io::Result<()> {
35        use std::io::Write;
36        write!(out, "trigger condition:")?;
37        out.push_inter_branch()?;
38        self.event.display(out)?;
39        out.next_final_branch()?;
40        match self.condition.as_ref() {
41            Some(condition) => condition.display(out)?,
42            None => write!(out, "condition: none")?,
43        }
44        out.pop_branch();
45        Ok(())
46    }
47
48    fn node_tag(&self) -> &'static str {
49        "trigger condition"
50    }
51
52    #[cfg(feature = "spanned_tree")]
53    fn node_span(&self) -> crate::ability_tree::span::TreeSpan {
54        self.span
55    }
56}
57
58#[cfg(feature = "parser")]
59impl crate::utils::DummyInit for TriggerCondition {
60    fn dummy_init() -> Self {
61        Self {
62            event: crate::utils::dummy(),
63            condition: None,
64            #[cfg(feature = "spanned_tree")]
65            span: Default::default(),
66        }
67    }
68}