manabrew_engine/trigger/
trigger_ability_resolves.rs1use 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 }
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}