boseiju/ability_tree/event/
life_gained_event.rs1use crate::ability_tree::AbilityTreeNode;
2use crate::ability_tree::MAX_CHILDREN_PER_NODE;
3
4#[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}