Skip to main content

manabrew_engine/trigger/
trigger_ability_resolves.rs

1use serde::{Deserialize, Serialize};
2
3use super::trigger::TriggerBehavior;
4use crate::{
5    event::RunParams, game::GameState, parsing::Params, spellability::SpellAbility,
6    trigger::TriggerType,
7};
8
9#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct TriggerAbilityResolves {
11    pub valid_spell_ability: Option<String>,
12    pub valid_source: Option<crate::parsing::CompiledSelector>,
13}
14
15impl TriggerAbilityResolves {
16    pub fn parse(params: &Params) -> Box<dyn TriggerBehavior> {
17        Box::new(Self {
18            valid_spell_ability: params.get_cloned("ValidSpellAbility"),
19            valid_source: params.selector_cloned("ValidSource"),
20        })
21    }
22}
23
24#[typetag::serde]
25impl TriggerBehavior for TriggerAbilityResolves {
26    fn trigger_type(&self) -> TriggerType {
27        TriggerType::AbilityResolves
28    }
29
30    fn perform_test(
31        &self,
32        trigger: &super::trigger::Trigger,
33        params: &RunParams,
34        game: &GameState,
35    ) -> bool {
36        let Some(sa) = params.spell_ability.as_ref() else {
37            return false;
38        };
39        if let Some(filter) = &self.valid_spell_ability {
40            if !trigger.matches_valid_sa_filter(filter, sa) {
41                return false;
42            }
43        }
44        trigger.matches_optional_valid_card_filter(&self.valid_source, params.card, game)
45    }
46
47    fn set_triggering_objects(
48        &self,
49        _trigger: &super::trigger::Trigger,
50        sa: &mut SpellAbility,
51        params: &RunParams,
52        _game: &GameState,
53    ) {
54        if let Some(card) = params.card {
55            sa.set_triggering_object(crate::ability::AbilityKey::Source, card.0.to_string());
56        }
57        // SpellAbility is a complex object, skip for now
58    }
59
60    fn get_important_stack_objects(
61        &self,
62        _trigger: &super::trigger::Trigger,
63        sa: &SpellAbility,
64    ) -> String {
65        format!(
66            "SpellAbility: {}",
67            sa.get_triggering_object(crate::ability::AbilityKey::SpellAbility)
68                .unwrap_or("")
69        )
70    }
71}