manabrew_engine/staticability/
static_ability_can_attack_defender.rs1use 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}