manabrew_engine/ability/effects/
blight_effect.rs1use 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}