manabrew_engine/staticability/
static_ability_counters_remain.rs1use forge_foundation::ZoneType;
2
3use crate::card::{valid_filter, Card};
4use crate::staticability::StaticMode;
5
6pub fn counters_remain(cards: &[Card], card: &Card, destination: ZoneType) -> bool {
7 let _perf_scope =
8 crate::perf::ParamsLookupScopeGuard::enter(crate::perf::ParamsLookupScope::StaticAbility);
9 if matches!(
10 destination,
11 ZoneType::Library | ZoneType::Hand | ZoneType::None
12 ) {
13 return false;
14 }
15 for source in cards {
16 for st_ab in source
17 .static_abilities
18 .iter()
19 .filter(|sa| sa.check_mode(&StaticMode::CountersRemain))
20 {
21 let active = source.zone == ZoneType::Battlefield
22 || (source.id == card.id && st_ab.ir.effect_zone_all);
23 if !active {
24 continue;
25 }
26 if matches_valid_card(st_ab.ir.valid_card.as_ref(), card, source) {
27 return true;
28 }
29 }
30 }
31 false
32}
33
34pub fn apply_counters_remain_ability(
35 st_ab: &crate::staticability::StaticAbility,
36 source: &Card,
37 card: &Card,
38 destination: ZoneType,
39) -> bool {
40 let _perf_scope =
41 crate::perf::ParamsLookupScopeGuard::enter(crate::perf::ParamsLookupScope::StaticAbility);
42 if matches!(
43 destination,
44 ZoneType::Library | ZoneType::Hand | ZoneType::None
45 ) {
46 return false;
47 }
48 let active =
49 source.zone == ZoneType::Battlefield || (source.id == card.id && st_ab.ir.effect_zone_all);
50 active && matches_valid_card(st_ab.ir.valid_card.as_ref(), card, source)
51}
52
53fn matches_valid_card(
54 valid: Option<&crate::parsing::CompiledSelector>,
55 card: &Card,
56 source: &Card,
57) -> bool {
58 valid_filter::matches_valid_card_selector_opt(valid, card, source)
59}