Skip to main content

manabrew_engine/ability/effects/
immediate_trigger_effect.rs

1//! ImmediateTrigger effect — fire a trigger immediately without waiting.
2//!
3//! Mirrors Java's `ImmediateTriggerEffect.resolve()` which registers
4//! a delayed trigger that fires as soon as possible through normal
5//! trigger processing.
6
7use super::EffectContext;
8use crate::trigger::DelayedTrigger;
9use crate::trigger::TriggerType;
10
11/// Struct form of this effect so it can participate in the
12/// `SpellAbilityEffect` trait hierarchy — mirrors Java's
13/// `ImmediateTriggerEffect` class extending `SpellAbilityEffect`.
14#[manabrew_engine_macros::spell_effect(ImmediateTriggerEffect)]
15fn resolve(ctx: &mut EffectContext, sa: &crate::spellability::SpellAbility) {
16    if let Some(remember_def) = sa.ir.remember_objects.as_deref() {
17        if let Some(source_id) = sa.source {
18            if remember_def.eq_ignore_ascii_case("Targeted") {
19                if let Some(target) = sa.target_chosen.target_card {
20                    ctx.game.card_mut(source_id).add_remembered_card(target);
21                }
22            }
23        }
24    }
25
26    if let Some(execute_name) = sa.ir.execute.as_deref() {
27        if let Some(source_id) = sa.source {
28            let svar_text = ctx
29                .game
30                .card(source_id)
31                .get_s_var(execute_name)
32                .map(str::to_string);
33            if svar_text.is_some() {
34                let delayed = DelayedTrigger {
35                    mode: TriggerType::Immediate,
36                    trigger_mode: Box::new(crate::trigger::trigger_immediate::TriggerImmediate),
37                    params: crate::parsing::Params::default(),
38                    execute_svar: execute_name.to_string(),
39                    controller: sa.activating_player,
40                    source_card: source_id,
41                    created_turn: ctx.game.turn.turn_number,
42                    created_phase: ctx.game.turn.phase,
43                    target_card: None,
44                    remembered_amount: 0,
45                    remembered_cards: Vec::new(),
46                    remembered_players: Vec::new(),
47                    remembered_lki_cards: Vec::new(),
48                    sort_after_active: false,
49                    trigger_order: None,
50                };
51                ctx.trigger_handler.register_delayed_trigger(delayed);
52            }
53        }
54    }
55}