Skip to main content

manabrew_engine/staticability/
static_ability_can_attack_defender.rs

1use forge_foundation::ZoneType;
2
3use crate::card::{valid_filter, Card};
4use crate::ids::PlayerId;
5use crate::staticability::StaticMode;
6
7pub fn can_attack_defender(cards: &[Card], card: &Card, defender: PlayerId) -> bool {
8    for source in cards
9        .iter()
10        .filter(|c| c.zone == ZoneType::Battlefield || c.zone == ZoneType::Command)
11    {
12        for st_ab in source
13            .static_abilities
14            .iter()
15            .filter(|sa| sa.check_mode(&StaticMode::CanAttackDefender))
16        {
17            if !matches_valid_card(st_ab.ir.valid_card.as_ref(), card, source) {
18                continue;
19            }
20            if !valid_filter::matches_valid_player_selector_opt(
21                st_ab.ir.valid_attacked.as_ref(),
22                defender,
23                source.controller,
24            ) {
25                continue;
26            }
27            return true;
28        }
29    }
30    false
31}
32
33fn matches_valid_card(
34    valid: Option<&crate::parsing::CompiledSelector>,
35    card: &Card,
36    source: &Card,
37) -> bool {
38    valid_filter::matches_valid_card_selector_opt(valid, card, source)
39}