Skip to main content

manabrew_engine/ability/effects/
shuffle_effect.rs

1use super::{resolve_defined_players, EffectContext};
2use crate::event::RunParams;
3use crate::trigger::TriggerType;
4
5/// `SP$ Shuffle` — shuffle one or more players' libraries.
6///
7/// Mirrors Java's `ShuffleEffect.java`.
8/// - `Defined$` selects which player(s) to shuffle (default: You).
9///
10/// # Card script examples
11/// ```text
12/// A:SP$ Shuffle | Defined$ You
13/// A:SP$ Shuffle | Defined$ Each
14/// ```
15/// Struct form of this effect so it can participate in the
16/// `SpellAbilityEffect` trait hierarchy — mirrors Java's
17/// `ShuffleEffect` class extending `SpellAbilityEffect`.
18#[manabrew_engine_macros::spell_effect(ShuffleEffect)]
19fn resolve(ctx: &mut EffectContext, sa: &crate::spellability::SpellAbility) {
20    let defined = sa.defined().unwrap_or("You");
21    let players = resolve_defined_players(defined, sa.activating_player, ctx.game);
22    let optional = sa.ir.optional;
23    let source_name = sa.source.map(|cid| ctx.game.card(cid).card_name.clone());
24
25    for pid in players {
26        if optional {
27            let accepted = ctx.agents[sa.activating_player.index()].confirm_action(
28                sa.activating_player,
29                None,
30                &format!("Have player {} shuffle their library?", pid.0),
31                &[],
32                sa.source,
33                Some(crate::ability::api_type::ApiType::Shuffle),
34            );
35            if !accepted {
36                continue;
37            }
38        }
39        ctx.game
40            .shuffle_zone_cards(forge_foundation::ZoneType::Library, pid, ctx.rng);
41        // Fire Shuffled trigger (mirrors Java Player.shuffle)
42        ctx.trigger_handler.run_trigger(
43            TriggerType::Shuffled,
44            RunParams {
45                player: Some(pid),
46                ..Default::default()
47            },
48            false,
49        );
50    }
51}