boseiju/ability_tree/ability/
activated.rs

1use crate::ability_tree::AbilityTreeNode;
2use crate::ability_tree::MAX_CHILDREN_PER_NODE;
3
4const MAX_COST_COUNT: usize = MAX_CHILDREN_PER_NODE - 1;
5
6/// Fixme: doc
7#[derive(serde::Serialize, serde::Deserialize)]
8#[derive(Debug, Clone, PartialEq, Eq)]
9pub struct ActivatedAbility {
10    effect: crate::ability_tree::ability::spell::SpellAbility,
11    costs: crate::utils::HeapArrayVec<crate::ability_tree::cost::Cost, MAX_COST_COUNT>,
12    #[cfg(feature = "spanned_tree")]
13    pub span: crate::ability_tree::span::TreeSpan,
14}
15
16impl AbilityTreeNode for ActivatedAbility {
17    fn node_id(&self) -> usize {
18        use idris::Idris;
19        crate::ability_tree::NodeKind::ActivatedAbility.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.effect as &dyn AbilityTreeNode);
25        for cost in self.costs.iter() {
26            children.push(cost as &dyn AbilityTreeNode);
27        }
28        children
29    }
30
31    fn display(&self, out: &mut crate::utils::TreeFormatter<'_>) -> std::io::Result<()> {
32        use std::io::Write;
33        write!(out, "activated ability:")?;
34        out.push_inter_branch()?;
35        write!(out, "costs:")?;
36        out.push_final_branch()?;
37        for cost in self.costs.iter().take(self.costs.len().saturating_sub(1)) {
38            out.push_inter_branch()?;
39            cost.display(out)?;
40            out.pop_branch();
41        }
42        if let Some(cost) = self.costs.last() {
43            out.push_inter_branch()?;
44            cost.display(out)?;
45            out.pop_branch();
46        }
47        out.pop_branch();
48        out.next_final_branch()?;
49        write!(out, "effects:")?;
50        out.push_final_branch()?;
51        self.effect.display(out)?;
52        out.pop_branch();
53        out.pop_branch();
54        Ok(())
55    }
56
57    fn node_tag(&self) -> &'static str {
58        "activated ability"
59    }
60
61    #[cfg(feature = "spanned_tree")]
62    fn node_span(&self) -> crate::ability_tree::span::TreeSpan {
63        self.span
64    }
65}