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