Skip to main content

manabrew_engine/staticability/
static_ability_counters_remain.rs

1use 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}