Skip to main content

manabrew_engine/trigger/
trigger_counter_added_all.rs

1use serde::{Deserialize, Serialize};
2
3use crate::event::RunParams;
4use crate::game::GameState;
5use crate::spellability::SpellAbility;
6use crate::trigger::TriggerType;
7
8use super::trigger::TriggerBehavior;
9
10#[derive(Debug, Clone, Serialize, Deserialize)]
11pub struct TriggerCounterAddedAll {
12    pub counter_type: Option<String>,
13    pub valid: Option<crate::parsing::CompiledSelector>,
14}
15
16impl TriggerCounterAddedAll {
17    pub fn parse(
18        counter_type: Option<String>,
19        valid: Option<crate::parsing::CompiledSelector>,
20    ) -> Box<dyn TriggerBehavior> {
21        Box::new(Self {
22            counter_type,
23            valid,
24        })
25    }
26}
27
28#[typetag::serde]
29impl TriggerBehavior for TriggerCounterAddedAll {
30    fn trigger_type(&self) -> TriggerType {
31        TriggerType::CounterAddedAll
32    }
33
34    fn perform_test(
35        &self,
36        trigger: &super::trigger::Trigger,
37        params: &RunParams,
38        game: &GameState,
39    ) -> bool {
40        if !super::trigger::Trigger::matches_counter_type_filter(
41            &self.counter_type,
42            &params.counter_type,
43        ) {
44            return false;
45        }
46
47        let Some(valid_filter) = self.valid.as_ref() else {
48            return true;
49        };
50
51        if let Some(cid) = params.object_card.or(params.card) {
52            return trigger.matches_valid_card_filter(valid_filter, cid, game);
53        }
54        if let Some(pid) = params.object_player.or(params.player) {
55            return trigger.matches_valid_player_filter(valid_filter, pid, game);
56        }
57        false
58    }
59
60    fn set_triggering_objects(
61        &self,
62        _trigger: &super::trigger::Trigger,
63        sa: &mut SpellAbility,
64        params: &RunParams,
65        _game: &GameState,
66    ) {
67        if let Some(cards) = params.cards.as_ref() {
68            let csv = cards
69                .iter()
70                .map(|c| c.0.to_string())
71                .collect::<Vec<_>>()
72                .join(",");
73            sa.set_triggering_object(crate::ability::AbilityKey::Objects, &csv);
74        }
75        if let Some(amount) = params.counter_amount {
76            sa.set_triggering_object(crate::ability::AbilityKey::Amount, amount.to_string());
77        }
78    }
79
80    fn get_important_stack_objects(
81        &self,
82        _trigger: &super::trigger::Trigger,
83        sa: &SpellAbility,
84    ) -> String {
85        format!(
86            "Amount: {}",
87            sa.trigger_objects
88                .get(&crate::ability::AbilityKey::Amount)
89                .cloned()
90                .unwrap_or_default()
91        )
92    }
93}