Skip to main content

manabrew_engine/ability/effects/
blight_effect.rs

1use forge_foundation::ZoneType;
2
3use super::EffectContext;
4use crate::agent::GameEntity;
5use crate::card::CounterType;
6use crate::game_entity_counter_table::GameEntityCounterTable;
7
8#[manabrew_engine_macros::spell_effect(BlightEffect)]
9fn resolve(ctx: &mut EffectContext, sa: &crate::spellability::SpellAbility) {
10    let amount = super::resolve_numeric_svar(ctx.game, sa, "Num", 1);
11    let players = if !sa.target_chosen.all_target_players().is_empty() {
12        sa.target_chosen.all_target_players()
13    } else {
14        sa.ir
15            .defined_text
16            .as_deref()
17            .map(|defined| {
18                crate::ability::ability_utils::resolve_defined_players_with_sa(
19                    defined,
20                    sa,
21                    sa.activating_player,
22                    ctx.game,
23                )
24            })
25            .unwrap_or_else(|| vec![sa.activating_player])
26    };
27    let mut table = GameEntityCounterTable::default();
28    for player in players {
29        let valid: Vec<_> = ctx
30            .game
31            .cards_in_zone(ZoneType::Battlefield, player)
32            .iter()
33            .copied()
34            .filter(|card| {
35                ctx.game.card(*card).is_creature()
36                    && !ctx.game.card(*card).phased_out
37                    && !crate::staticability::static_ability_cant_put_counter::any_cant_put_counter_on_card(
38                        &ctx.game.cards,
39                        ctx.game.card(*card),
40                        &CounterType::M1M1,
41                    )
42            })
43            .collect();
44        let chosen = ctx.agents[player.index()]
45            .choose_cards_for_effect(player, &valid, 1, 1)
46            .into_iter()
47            .next();
48        if let Some(card) = chosen {
49            table.put(
50                Some(player),
51                GameEntity::Card(card),
52                CounterType::M1M1,
53                amount,
54            );
55        }
56    }
57    table.replace_counter_effect(
58        ctx.game,
59        Some(ctx.trigger_handler),
60        Some(ctx.agents),
61        Some(sa),
62        true,
63        Default::default(),
64    );
65}