Skip to main content

manabrew_engine/ability/effects/
multiple_piles_effect.rs

1//! MultiplePiles — Fact or Fiction style pile splitting.
2//! Ported from Java's MultiplePilesEffect: separates cards into N piles,
3//! optionally remembers a randomly chosen pile.
4
5use forge_foundation::ZoneType;
6
7use super::{resolve_numeric_svar, EffectContext};
8use crate::ids::CardId;
9use crate::parsing::keys;
10
11/// Struct form of this effect so it can participate in the
12/// `SpellAbilityEffect` trait hierarchy — mirrors Java's
13/// `MultiplePilesEffect` class extending `SpellAbilityEffect`.
14#[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    // Get the zone to pull cards from
27    let zone = sa.ir.zone.unwrap_or(ZoneType::Battlefield);
28
29    // Get cards in the zone for the controller
30    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    // Auto-split into piles (agent would choose in full implementation)
43    // For now, distribute evenly
44    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 RandomChosen, remember a random pile's cards on source
50    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}