manabrew_engine/trigger/
trigger_counter_added_all.rs1use 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 ¶ms.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}