manabrew_engine/ability/effects/
choose_card_effect.rs1use forge_foundation::ZoneType;
2
3use super::{matches_valid_cards_for_sa, EffectContext};
4
5#[manabrew_engine_macros::spell_effect(ChooseCardEffect)]
20fn resolve(ctx: &mut EffectContext, sa: &crate::spellability::SpellAbility) {
21 let source_id = match sa.source {
22 Some(id) => id,
23 None => return,
24 };
25
26 let controller = sa.activating_player;
27
28 let amount: usize = sa
29 .ir
30 .amount
31 .as_deref()
32 .and_then(|s| s.parse().ok())
33 .unwrap_or(1);
34
35 let zone = sa.ir.choice_zone.unwrap_or(ZoneType::Battlefield);
36
37 let filter = sa.ir.choices.clone().unwrap_or_else(|| "Card".to_string());
38 let filter_selector = sa.ir.choices_selector.clone();
39
40 let remember = sa.ir.remember_chosen;
41
42 let mut valid = Vec::new();
44 for &pid in &ctx.game.player_order.clone() {
45 let zone_cards = ctx.game.cards_in_zone(zone, pid).to_vec();
46 for cid in zone_cards {
47 if matches_valid_cards_for_sa(
48 ctx.game,
49 sa,
50 ctx.game.card(cid),
51 filter_selector.as_ref(),
52 &filter,
53 ) {
54 valid.push(cid);
55 }
56 }
57 }
58
59 if valid.is_empty() {
60 return;
61 }
62
63 ctx.agents[controller.index()].snapshot_state(ctx.game, ctx.mana_pools);
65 let chosen =
66 ctx.agents[controller.index()].choose_cards_for_effect(controller, &valid, 1, amount);
67
68 ctx.game
70 .card_mut(source_id)
71 .set_chosen_cards(chosen.clone());
72
73 if remember {
75 for &cid in &chosen {
76 ctx.game.card_mut(source_id).add_remembered_card(cid);
77 }
78 }
79
80 if sa.ir.imprint_chosen {
82 for &cid in &chosen {
83 ctx.game.card_mut(source_id).add_imprinted_card(cid);
84 }
85 }
86}