Skip to main content

manabrew_engine/ability/effects/
set_in_motion_effect.rs

1//! SetInMotion — set a scheme in motion (Archenemy).
2//! Ported from Java's SetInMotionEffect: activates the top scheme card
3//! from the scheme deck.
4
5use forge_foundation::ZoneType;
6
7use super::EffectContext;
8use crate::event::RunParams;
9use crate::replacement::replacement_handler::{apply_replacements, ReplacementEvent};
10use crate::replacement::ReplacementResult;
11use crate::trigger::TriggerType;
12
13/// Struct form of this effect so it can participate in the
14/// `SpellAbilityEffect` trait hierarchy — mirrors Java's
15/// `SetInMotionEffect` class extending `SpellAbilityEffect`.
16#[manabrew_engine_macros::spell_effect(SetInMotionEffect)]
17fn resolve(ctx: &mut EffectContext, sa: &crate::spellability::SpellAbility) {
18    let controller = sa.activating_player;
19
20    // Run SetInMotion replacement effects before setting in motion.
21    let mut event = ReplacementEvent::SetInMotion { player: controller };
22    let result = apply_replacements(ctx.game, &mut event);
23    if result == ReplacementResult::Skipped || result == ReplacementResult::Replaced {
24        return;
25    }
26
27    let repeats = super::resolve_numeric_svar(ctx.game, sa, "RepeatNum", 1).max(1);
28
29    for _ in 0..repeats {
30        // Find top card of scheme deck (stored in Command zone with scheme type)
31        let scheme = ctx
32            .game
33            .cards
34            .iter()
35            .find(|c| {
36                c.owner == controller
37                    && c.zone == ZoneType::Command
38                    && c.type_line
39                        .subtypes
40                        .iter()
41                        .any(|s| s.eq_ignore_ascii_case("Scheme"))
42            })
43            .map(|c| c.id);
44
45        if let Some(scheme_id) = scheme {
46            // Fire SetInMotion trigger
47            ctx.trigger_handler.run_trigger(
48                TriggerType::SetInMotion,
49                RunParams {
50                    card: Some(scheme_id),
51                    player: Some(controller),
52                    ..Default::default()
53                },
54                false,
55            );
56        }
57    }
58}