manabrew_engine/ability/effects/
multiple_piles_effect.rs1use forge_foundation::ZoneType;
6
7use super::{resolve_numeric_svar, EffectContext};
8use crate::ids::CardId;
9use crate::parsing::keys;
10
11#[manabrew_engine_macros::spell_effect(MultiplePilesEffect)]
15fn resolve(ctx: &mut EffectContext, sa: &crate::spellability::SpellAbility) {
16 let source = match sa.source {
17 Some(s) => s,
18 None => return,
19 };
20 let controller = sa.activating_player;
21
22 let pile_count = resolve_numeric_svar(ctx.game, sa, keys::PILES, 2).max(0) as usize;
23
24 let random_chosen = sa.ir.random_chosen;
25
26 let zone = sa.ir.zone.unwrap_or(ZoneType::Battlefield);
28
29 let pool: Vec<CardId> = ctx
31 .game
32 .cards
33 .iter()
34 .filter(|c| c.zone == zone && c.controller == controller)
35 .map(|c| c.id)
36 .collect();
37
38 if pool.is_empty() || pile_count == 0 {
39 return;
40 }
41
42 let mut piles: Vec<Vec<CardId>> = vec![vec![]; pile_count];
45 for (i, card_id) in pool.iter().enumerate() {
46 piles[i % pile_count].push(*card_id);
47 }
48
49 if random_chosen && !piles.is_empty() {
51 let chosen_idx = ctx.rng.next_int(piles.len() as i32) as usize % piles.len();
52 for card_id in &piles[chosen_idx] {
53 ctx.game.card_mut(source).add_remembered_card(*card_id);
54 }
55 }
56}