boseiju/ability_tree/event/
life_gained_event.rs

1use crate::ability_tree::AbilityTreeNode;
2use crate::ability_tree::MAX_CHILDREN_PER_NODE;
3
4/// Fixme: doc
5#[derive(serde::Serialize, serde::Deserialize)]
6#[derive(Debug, Clone, PartialEq, Eq)]
7pub struct LifeGainedEvent {
8    pub player: crate::ability_tree::player::PlayerSpecifier,
9    pub minimum_amount: Option<crate::ability_tree::number::Number>,
10    #[cfg(feature = "spanned_tree")]
11    pub span: crate::ability_tree::span::TreeSpan,
12}
13
14impl crate::ability_tree::AbilityTreeNode for LifeGainedEvent {
15    fn node_id(&self) -> usize {
16        use idris::Idris;
17        crate::ability_tree::NodeKind::LifeGainedEvent.id()
18    }
19
20    fn children(&self) -> arrayvec::ArrayVec<&dyn AbilityTreeNode, MAX_CHILDREN_PER_NODE> {
21        let mut children = arrayvec::ArrayVec::new_const();
22        children.push(&self.player as &dyn AbilityTreeNode);
23        match self.minimum_amount.as_ref() {
24            Some(amount) => children.push(amount as &dyn AbilityTreeNode),
25            None => {
26                let dummy = crate::ability_tree::dummy_terminal::TreeNodeDummyTerminal::none_node();
27                children.push(dummy as &dyn AbilityTreeNode)
28            }
29        }
30        children
31    }
32
33    fn display(&self, out: &mut crate::utils::TreeFormatter<'_>) -> std::io::Result<()> {
34        use std::io::Write;
35        write!(out, "player gains life")?;
36        out.push_inter_branch()?;
37        self.player.display(out)?;
38        out.next_final_branch()?;
39        match self.minimum_amount.as_ref() {
40            Some(minimum_amount) => {
41                write!(out, "gains at least:")?;
42                out.push_final_branch()?;
43                minimum_amount.display(out)?;
44                out.pop_branch();
45            }
46            None => write!(out, "gains any amount")?,
47        }
48        out.pop_branch();
49
50        Ok(())
51    }
52
53    fn node_tag(&self) -> &'static str {
54        "player gained life event"
55    }
56
57    #[cfg(feature = "spanned_tree")]
58    fn node_span(&self) -> crate::ability_tree::span::TreeSpan {
59        self.span
60    }
61}
62
63#[cfg(feature = "parser")]
64impl crate::utils::DummyInit for LifeGainedEvent {
65    fn dummy_init() -> Self {
66        Self {
67            player: crate::utils::dummy(),
68            minimum_amount: crate::utils::dummy(),
69            #[cfg(feature = "spanned_tree")]
70            span: Default::default(),
71        }
72    }
73}